Commit 479c86dc authored by Petr Machata's avatar Petr Machata Committed by David S. Miller

net: switchdev: Add extack to struct switchdev_notifier_info

In order to pass extack to the drivers that need it, add an extack field
to struct switchdev_notifier_info, and an extack argument to the
function call_switchdev_blocking_notifiers(). Also add a helper function
switchdev_notifier_info_to_extack().
Signed-off-by: default avatarPetr Machata <petrm@mellanox.com>
Acked-by: default avatarJiri Pirko <jiri@mellanox.com>
Acked-by: default avatarIvan Vecera <ivecera@redhat.com>
Reviewed-by: default avatarIdo Schimmel <idosch@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 69b7320e
...@@ -364,6 +364,7 @@ static void vxlan_fdb_switchdev_notifier_info(const struct vxlan_dev *vxlan, ...@@ -364,6 +364,7 @@ static void vxlan_fdb_switchdev_notifier_info(const struct vxlan_dev *vxlan,
struct switchdev_notifier_vxlan_fdb_info *fdb_info) struct switchdev_notifier_vxlan_fdb_info *fdb_info)
{ {
fdb_info->info.dev = vxlan->dev; fdb_info->info.dev = vxlan->dev;
fdb_info->info.extack = NULL;
fdb_info->remote_ip = rd->remote_ip; fdb_info->remote_ip = rd->remote_ip;
fdb_info->remote_port = rd->remote_port; fdb_info->remote_port = rd->remote_port;
fdb_info->remote_vni = rd->remote_vni; fdb_info->remote_vni = rd->remote_vni;
......
...@@ -149,6 +149,7 @@ enum switchdev_notifier_type { ...@@ -149,6 +149,7 @@ enum switchdev_notifier_type {
struct switchdev_notifier_info { struct switchdev_notifier_info {
struct net_device *dev; struct net_device *dev;
struct netlink_ext_ack *extack;
}; };
struct switchdev_notifier_fdb_info { struct switchdev_notifier_fdb_info {
...@@ -172,6 +173,12 @@ switchdev_notifier_info_to_dev(const struct switchdev_notifier_info *info) ...@@ -172,6 +173,12 @@ switchdev_notifier_info_to_dev(const struct switchdev_notifier_info *info)
return info->dev; return info->dev;
} }
static inline struct netlink_ext_ack *
switchdev_notifier_info_to_extack(const struct switchdev_notifier_info *info)
{
return info->extack;
}
#ifdef CONFIG_NET_SWITCHDEV #ifdef CONFIG_NET_SWITCHDEV
void switchdev_deferred_process(void); void switchdev_deferred_process(void);
...@@ -193,7 +200,8 @@ int call_switchdev_notifiers(unsigned long val, struct net_device *dev, ...@@ -193,7 +200,8 @@ int call_switchdev_notifiers(unsigned long val, struct net_device *dev,
int register_switchdev_blocking_notifier(struct notifier_block *nb); int register_switchdev_blocking_notifier(struct notifier_block *nb);
int unregister_switchdev_blocking_notifier(struct notifier_block *nb); int unregister_switchdev_blocking_notifier(struct notifier_block *nb);
int call_switchdev_blocking_notifiers(unsigned long val, struct net_device *dev, int call_switchdev_blocking_notifiers(unsigned long val, struct net_device *dev,
struct switchdev_notifier_info *info); struct switchdev_notifier_info *info,
struct netlink_ext_ack *extack);
void switchdev_port_fwd_mark_set(struct net_device *dev, void switchdev_port_fwd_mark_set(struct net_device *dev,
struct net_device *group_dev, struct net_device *group_dev,
...@@ -278,7 +286,8 @@ unregister_switchdev_blocking_notifier(struct notifier_block *nb) ...@@ -278,7 +286,8 @@ unregister_switchdev_blocking_notifier(struct notifier_block *nb)
static inline int static inline int
call_switchdev_blocking_notifiers(unsigned long val, call_switchdev_blocking_notifiers(unsigned long val,
struct net_device *dev, struct net_device *dev,
struct switchdev_notifier_info *info) struct switchdev_notifier_info *info,
struct netlink_ext_ack *extack)
{ {
return NOTIFY_DONE; return NOTIFY_DONE;
} }
......
...@@ -368,7 +368,7 @@ static int switchdev_port_obj_notify(enum switchdev_notifier_type nt, ...@@ -368,7 +368,7 @@ static int switchdev_port_obj_notify(enum switchdev_notifier_type nt,
.handled = false, .handled = false,
}; };
rc = call_switchdev_blocking_notifiers(nt, dev, &obj_info.info); rc = call_switchdev_blocking_notifiers(nt, dev, &obj_info.info, extack);
err = notifier_to_errno(rc); err = notifier_to_errno(rc);
if (err) { if (err) {
WARN_ON(!obj_info.handled); WARN_ON(!obj_info.handled);
...@@ -559,6 +559,7 @@ int call_switchdev_notifiers(unsigned long val, struct net_device *dev, ...@@ -559,6 +559,7 @@ int call_switchdev_notifiers(unsigned long val, struct net_device *dev,
struct switchdev_notifier_info *info) struct switchdev_notifier_info *info)
{ {
info->dev = dev; info->dev = dev;
info->extack = NULL;
return atomic_notifier_call_chain(&switchdev_notif_chain, val, info); return atomic_notifier_call_chain(&switchdev_notif_chain, val, info);
} }
EXPORT_SYMBOL_GPL(call_switchdev_notifiers); EXPORT_SYMBOL_GPL(call_switchdev_notifiers);
...@@ -580,9 +581,11 @@ int unregister_switchdev_blocking_notifier(struct notifier_block *nb) ...@@ -580,9 +581,11 @@ int unregister_switchdev_blocking_notifier(struct notifier_block *nb)
EXPORT_SYMBOL_GPL(unregister_switchdev_blocking_notifier); EXPORT_SYMBOL_GPL(unregister_switchdev_blocking_notifier);
int call_switchdev_blocking_notifiers(unsigned long val, struct net_device *dev, int call_switchdev_blocking_notifiers(unsigned long val, struct net_device *dev,
struct switchdev_notifier_info *info) struct switchdev_notifier_info *info,
struct netlink_ext_ack *extack)
{ {
info->dev = dev; info->dev = dev;
info->extack = extack;
return blocking_notifier_call_chain(&switchdev_blocking_notif_chain, return blocking_notifier_call_chain(&switchdev_blocking_notif_chain,
val, info); val, info);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment