return 0;
 }
 
-static int dpaa2_switch_port_attr_set(struct net_device *netdev,
+static int dpaa2_switch_port_attr_set(struct net_device *netdev, const void *ctx,
                                      const struct switchdev_attr *attr,
                                      struct netlink_ext_ack *extack)
 {
 
        return err;
 }
 
-static int prestera_port_obj_attr_set(struct net_device *dev,
+static int prestera_port_obj_attr_set(struct net_device *dev, const void *ctx,
                                      const struct switchdev_attr *attr,
                                      struct netlink_ext_ack *extack)
 {
                                             flag_pvid, extack);
 }
 
-static int prestera_port_obj_add(struct net_device *dev,
+static int prestera_port_obj_add(struct net_device *dev, const void *ctx,
                                 const struct switchdev_obj *obj,
                                 struct netlink_ext_ack *extack)
 {
        return 0;
 }
 
-static int prestera_port_obj_del(struct net_device *dev,
+static int prestera_port_obj_del(struct net_device *dev, const void *ctx,
                                 const struct switchdev_obj *obj)
 {
        struct prestera_port *port = netdev_priv(dev);
 
 }
 
 static int mlx5_esw_bridge_port_obj_add(struct net_device *dev,
+                                       const void *ctx,
                                        const struct switchdev_obj *obj,
                                        struct netlink_ext_ack *extack)
 {
 }
 
 static int mlx5_esw_bridge_port_obj_del(struct net_device *dev,
+                                       const void *ctx,
                                        const struct switchdev_obj *obj)
 {
        const struct switchdev_obj_port_vlan *vlan;
 }
 
 static int mlx5_esw_bridge_port_obj_attr_set(struct net_device *dev,
+                                            const void *ctx,
                                             const struct switchdev_attr *attr,
                                             struct netlink_ext_ack *extack)
 {
 
        return 0;
 }
 
-static int mlxsw_sp_port_attr_set(struct net_device *dev,
+static int mlxsw_sp_port_attr_set(struct net_device *dev, const void *ctx,
                                  const struct switchdev_attr *attr,
                                  struct netlink_ext_ack *extack)
 {
        }
 }
 
-static int mlxsw_sp_port_obj_add(struct net_device *dev,
+static int mlxsw_sp_port_obj_add(struct net_device *dev, const void *ctx,
                                 const struct switchdev_obj *obj,
                                 struct netlink_ext_ack *extack)
 {
        }
 }
 
-static int mlxsw_sp_port_obj_del(struct net_device *dev,
+static int mlxsw_sp_port_obj_del(struct net_device *dev, const void *ctx,
                                 const struct switchdev_obj *obj)
 {
        struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
 
        sparx5_set_ageing(port->sparx5, ageing_time);
 }
 
-static int sparx5_port_attr_set(struct net_device *dev,
+static int sparx5_port_attr_set(struct net_device *dev, const void *ctx,
                                const struct switchdev_attr *attr,
                                struct netlink_ext_ack *extack)
 {
 
                       ANA_PORT_CPU_FWD_CFG, port);
 }
 
-static int ocelot_port_attr_set(struct net_device *dev,
+static int ocelot_port_attr_set(struct net_device *dev, const void *ctx,
                                const struct switchdev_attr *attr,
                                struct netlink_ext_ack *extack)
 {
        return ocelot_mrp_del_ring_role(ocelot, port, mrp);
 }
 
-static int ocelot_port_obj_add(struct net_device *dev,
+static int ocelot_port_obj_add(struct net_device *dev, const void *ctx,
                               const struct switchdev_obj *obj,
                               struct netlink_ext_ack *extack)
 {
        return ret;
 }
 
-static int ocelot_port_obj_del(struct net_device *dev,
+static int ocelot_port_obj_del(struct net_device *dev, const void *ctx,
                               const struct switchdev_obj *obj)
 {
        int ret = 0;
 
        return 0;
 }
 
-static int am65_cpsw_port_attr_set(struct net_device *ndev,
+static int am65_cpsw_port_attr_set(struct net_device *ndev, const void *ctx,
                                   const struct switchdev_attr *attr,
                                   struct netlink_ext_ack *extack)
 {
        return 0;
 }
 
-static int am65_cpsw_port_obj_add(struct net_device *ndev,
+static int am65_cpsw_port_obj_add(struct net_device *ndev, const void *ctx,
                                  const struct switchdev_obj *obj,
                                  struct netlink_ext_ack *extack)
 {
        return err;
 }
 
-static int am65_cpsw_port_obj_del(struct net_device *ndev,
+static int am65_cpsw_port_obj_del(struct net_device *ndev, const void *ctx,
                                  const struct switchdev_obj *obj)
 {
        struct switchdev_obj_port_vlan *vlan = SWITCHDEV_OBJ_PORT_VLAN(obj);
 
        return 0;
 }
 
-static int cpsw_port_attr_set(struct net_device *ndev,
+static int cpsw_port_attr_set(struct net_device *ndev, const void *ctx,
                              const struct switchdev_attr *attr,
                              struct netlink_ext_ack *extack)
 {
        return err;
 }
 
-static int cpsw_port_obj_add(struct net_device *ndev,
+static int cpsw_port_obj_add(struct net_device *ndev, const void *ctx,
                             const struct switchdev_obj *obj,
                             struct netlink_ext_ack *extack)
 {
        return err;
 }
 
-static int cpsw_port_obj_del(struct net_device *ndev,
+static int cpsw_port_obj_del(struct net_device *ndev, const void *ctx,
                             const struct switchdev_obj *obj)
 {
        struct switchdev_obj_port_vlan *vlan = SWITCHDEV_OBJ_PORT_VLAN(obj);
 
 struct switchdev_notifier_info {
        struct net_device *dev;
        struct netlink_ext_ack *extack;
+       const void *ctx;
 };
 
 struct switchdev_notifier_fdb_info {
 int switchdev_handle_port_obj_add(struct net_device *dev,
                        struct switchdev_notifier_port_obj_info *port_obj_info,
                        bool (*check_cb)(const struct net_device *dev),
-                       int (*add_cb)(struct net_device *dev,
+                       int (*add_cb)(struct net_device *dev, const void *ctx,
                                      const struct switchdev_obj *obj,
                                      struct netlink_ext_ack *extack));
 int switchdev_handle_port_obj_del(struct net_device *dev,
                        struct switchdev_notifier_port_obj_info *port_obj_info,
                        bool (*check_cb)(const struct net_device *dev),
-                       int (*del_cb)(struct net_device *dev,
+                       int (*del_cb)(struct net_device *dev, const void *ctx,
                                      const struct switchdev_obj *obj));
 
 int switchdev_handle_port_attr_set(struct net_device *dev,
                        struct switchdev_notifier_port_attr_info *port_attr_info,
                        bool (*check_cb)(const struct net_device *dev),
-                       int (*set_cb)(struct net_device *dev,
+                       int (*set_cb)(struct net_device *dev, const void *ctx,
                                      const struct switchdev_attr *attr,
                                      struct netlink_ext_ack *extack));
 #else
 switchdev_handle_port_obj_add(struct net_device *dev,
                        struct switchdev_notifier_port_obj_info *port_obj_info,
                        bool (*check_cb)(const struct net_device *dev),
-                       int (*add_cb)(struct net_device *dev,
+                       int (*add_cb)(struct net_device *dev, const void *ctx,
                                      const struct switchdev_obj *obj,
                                      struct netlink_ext_ack *extack))
 {
 switchdev_handle_port_obj_del(struct net_device *dev,
                        struct switchdev_notifier_port_obj_info *port_obj_info,
                        bool (*check_cb)(const struct net_device *dev),
-                       int (*del_cb)(struct net_device *dev,
+                       int (*del_cb)(struct net_device *dev, const void *ctx,
                                      const struct switchdev_obj *obj))
 {
        return 0;
 switchdev_handle_port_attr_set(struct net_device *dev,
                        struct switchdev_notifier_port_attr_info *port_attr_info,
                        bool (*check_cb)(const struct net_device *dev),
-                       int (*set_cb)(struct net_device *dev,
+                       int (*set_cb)(struct net_device *dev, const void *ctx,
                                      const struct switchdev_attr *attr,
                                      struct netlink_ext_ack *extack))
 {
 
        return phylink_mii_ioctl(p->dp->pl, ifr, cmd);
 }
 
-static int dsa_slave_port_attr_set(struct net_device *dev,
+static int dsa_slave_port_attr_set(struct net_device *dev, const void *ctx,
                                   const struct switchdev_attr *attr,
                                   struct netlink_ext_ack *extack)
 {
        return vlan_vid_add(master, htons(ETH_P_8021Q), vlan.vid);
 }
 
-static int dsa_slave_port_obj_add(struct net_device *dev,
+static int dsa_slave_port_obj_add(struct net_device *dev, const void *ctx,
                                  const struct switchdev_obj *obj,
                                  struct netlink_ext_ack *extack)
 {
        return 0;
 }
 
-static int dsa_slave_port_obj_del(struct net_device *dev,
+static int dsa_slave_port_obj_del(struct net_device *dev, const void *ctx,
                                  const struct switchdev_obj *obj)
 {
        struct dsa_port *dp = dsa_slave_to_port(dev);
 
 static int __switchdev_handle_port_obj_add(struct net_device *dev,
                        struct switchdev_notifier_port_obj_info *port_obj_info,
                        bool (*check_cb)(const struct net_device *dev),
-                       int (*add_cb)(struct net_device *dev,
+                       int (*add_cb)(struct net_device *dev, const void *ctx,
                                      const struct switchdev_obj *obj,
                                      struct netlink_ext_ack *extack))
 {
+       struct switchdev_notifier_info *info = &port_obj_info->info;
        struct netlink_ext_ack *extack;
        struct net_device *lower_dev;
        struct list_head *iter;
        int err = -EOPNOTSUPP;
 
-       extack = switchdev_notifier_info_to_extack(&port_obj_info->info);
+       extack = switchdev_notifier_info_to_extack(info);
 
        if (check_cb(dev)) {
-               err = add_cb(dev, port_obj_info->obj, extack);
+               err = add_cb(dev, info->ctx, port_obj_info->obj, extack);
                if (err != -EOPNOTSUPP)
                        port_obj_info->handled = true;
                return err;
 int switchdev_handle_port_obj_add(struct net_device *dev,
                        struct switchdev_notifier_port_obj_info *port_obj_info,
                        bool (*check_cb)(const struct net_device *dev),
-                       int (*add_cb)(struct net_device *dev,
+                       int (*add_cb)(struct net_device *dev, const void *ctx,
                                      const struct switchdev_obj *obj,
                                      struct netlink_ext_ack *extack))
 {
 static int __switchdev_handle_port_obj_del(struct net_device *dev,
                        struct switchdev_notifier_port_obj_info *port_obj_info,
                        bool (*check_cb)(const struct net_device *dev),
-                       int (*del_cb)(struct net_device *dev,
+                       int (*del_cb)(struct net_device *dev, const void *ctx,
                                      const struct switchdev_obj *obj))
 {
+       struct switchdev_notifier_info *info = &port_obj_info->info;
        struct net_device *lower_dev;
        struct list_head *iter;
        int err = -EOPNOTSUPP;
 
        if (check_cb(dev)) {
-               err = del_cb(dev, port_obj_info->obj);
+               err = del_cb(dev, info->ctx, port_obj_info->obj);
                if (err != -EOPNOTSUPP)
                        port_obj_info->handled = true;
                return err;
 int switchdev_handle_port_obj_del(struct net_device *dev,
                        struct switchdev_notifier_port_obj_info *port_obj_info,
                        bool (*check_cb)(const struct net_device *dev),
-                       int (*del_cb)(struct net_device *dev,
+                       int (*del_cb)(struct net_device *dev, const void *ctx,
                                      const struct switchdev_obj *obj))
 {
        int err;
 static int __switchdev_handle_port_attr_set(struct net_device *dev,
                        struct switchdev_notifier_port_attr_info *port_attr_info,
                        bool (*check_cb)(const struct net_device *dev),
-                       int (*set_cb)(struct net_device *dev,
+                       int (*set_cb)(struct net_device *dev, const void *ctx,
                                      const struct switchdev_attr *attr,
                                      struct netlink_ext_ack *extack))
 {
+       struct switchdev_notifier_info *info = &port_attr_info->info;
        struct netlink_ext_ack *extack;
        struct net_device *lower_dev;
        struct list_head *iter;
        int err = -EOPNOTSUPP;
 
-       extack = switchdev_notifier_info_to_extack(&port_attr_info->info);
+       extack = switchdev_notifier_info_to_extack(info);
 
        if (check_cb(dev)) {
-               err = set_cb(dev, port_attr_info->attr, extack);
+               err = set_cb(dev, info->ctx, port_attr_info->attr, extack);
                if (err != -EOPNOTSUPP)
                        port_attr_info->handled = true;
                return err;
 int switchdev_handle_port_attr_set(struct net_device *dev,
                        struct switchdev_notifier_port_attr_info *port_attr_info,
                        bool (*check_cb)(const struct net_device *dev),
-                       int (*set_cb)(struct net_device *dev,
+                       int (*set_cb)(struct net_device *dev, const void *ctx,
                                      const struct switchdev_attr *attr,
                                      struct netlink_ext_ack *extack))
 {