[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20230509100939.760867-3-jiri@resnulli.us>
Date: Tue, 9 May 2023 12:09:38 +0200
From: Jiri Pirko <jiri@...nulli.us>
To: netdev@...r.kernel.org
Cc: kuba@...nel.org,
pabeni@...hat.com,
davem@...emloft.net,
edumazet@...gle.com,
jacob.e.keller@...el.com,
saeedm@...dia.com,
moshe@...dia.com
Subject: [patch net 2/3] devlink: make netdev notifier per-port
From: Jiri Pirko <jiri@...dia.com>
The netdev notifier is used to track changes of a netdev related to a
certain devlink port. In preparation for the next patch,
change the netdev notifier to register per devlink port instance.
Signed-off-by: Jiri Pirko <jiri@...dia.com>
---
include/net/devlink.h | 1 +
net/devlink/core.c | 9 ---------
net/devlink/devl_internal.h | 4 ----
net/devlink/leftover.c | 31 ++++++++++++++++++++++---------
4 files changed, 23 insertions(+), 22 deletions(-)
diff --git a/include/net/devlink.h b/include/net/devlink.h
index 6a942e70e451..d0a0d1ce7db4 100644
--- a/include/net/devlink.h
+++ b/include/net/devlink.h
@@ -149,6 +149,7 @@ struct devlink_port {
struct devlink_rate *devlink_rate;
struct devlink_linecard *linecard;
+ struct notifier_block netdevice_nb;
};
struct devlink_port_new_attrs {
diff --git a/net/devlink/core.c b/net/devlink/core.c
index 777b091ef74d..018e547bdb98 100644
--- a/net/devlink/core.c
+++ b/net/devlink/core.c
@@ -204,11 +204,6 @@ struct devlink *devlink_alloc_ns(const struct devlink_ops *ops,
if (ret < 0)
goto err_xa_alloc;
- devlink->netdevice_nb.notifier_call = devlink_port_netdevice_event;
- ret = register_netdevice_notifier(&devlink->netdevice_nb);
- if (ret)
- goto err_register_netdevice_notifier;
-
devlink->dev = dev;
devlink->ops = ops;
xa_init_flags(&devlink->ports, XA_FLAGS_ALLOC);
@@ -233,8 +228,6 @@ struct devlink *devlink_alloc_ns(const struct devlink_ops *ops,
return devlink;
-err_register_netdevice_notifier:
- xa_erase(&devlinks, devlink->index);
err_xa_alloc:
kfree(devlink);
return NULL;
@@ -266,8 +259,6 @@ void devlink_free(struct devlink *devlink)
xa_destroy(&devlink->params);
xa_destroy(&devlink->ports);
- WARN_ON_ONCE(unregister_netdevice_notifier(&devlink->netdevice_nb));
-
xa_erase(&devlinks, devlink->index);
devlink_put(devlink);
diff --git a/net/devlink/devl_internal.h b/net/devlink/devl_internal.h
index e133f423294a..e595c5dcff45 100644
--- a/net/devlink/devl_internal.h
+++ b/net/devlink/devl_internal.h
@@ -50,7 +50,6 @@ struct devlink {
u8 reload_failed:1;
refcount_t refcount;
struct rcu_work rwork;
- struct notifier_block netdevice_nb;
char priv[] __aligned(NETDEV_ALIGN);
};
@@ -171,9 +170,6 @@ extern const struct devlink_cmd devl_cmd_selftests_get;
void devlink_notify(struct devlink *devlink, enum devlink_command cmd);
/* Ports */
-int devlink_port_netdevice_event(struct notifier_block *nb,
- unsigned long event, void *ptr);
-
struct devlink_port *
devlink_port_get_from_info(struct devlink *devlink, struct genl_info *info);
struct devlink_port *devlink_port_get_from_attrs(struct devlink *devlink,
diff --git a/net/devlink/leftover.c b/net/devlink/leftover.c
index dffca2f9bfa7..4b1627cb2b83 100644
--- a/net/devlink/leftover.c
+++ b/net/devlink/leftover.c
@@ -6841,6 +6841,9 @@ void devlink_port_fini(struct devlink_port *devlink_port)
}
EXPORT_SYMBOL_GPL(devlink_port_fini);
+static int devlink_port_netdevice_event(struct notifier_block *nb,
+ unsigned long event, void *ptr);
+
/**
* devl_port_register() - Register devlink port
*
@@ -6869,14 +6872,24 @@ int devl_port_register(struct devlink *devlink,
devlink_port->index = port_index;
spin_lock_init(&devlink_port->type_lock);
INIT_LIST_HEAD(&devlink_port->reporter_list);
- err = xa_insert(&devlink->ports, port_index, devlink_port, GFP_KERNEL);
+
+ devlink_port->netdevice_nb.notifier_call = devlink_port_netdevice_event;
+ err = register_netdevice_notifier(&devlink_port->netdevice_nb);
if (err)
return err;
+ err = xa_insert(&devlink->ports, port_index, devlink_port, GFP_KERNEL);
+ if (err)
+ goto err_xa_insert;
+
INIT_DELAYED_WORK(&devlink_port->type_warn_dw, &devlink_port_type_warn);
devlink_port_type_warn_schedule(devlink_port);
devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW);
return 0;
+
+err_xa_insert:
+ unregister_netdevice_notifier(&devlink_port->netdevice_nb);
+ return err;
}
EXPORT_SYMBOL_GPL(devl_port_register);
@@ -6921,6 +6934,7 @@ void devl_port_unregister(struct devlink_port *devlink_port)
devlink_port_type_warn_cancel(devlink_port);
devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_DEL);
xa_erase(&devlink_port->devlink->ports, devlink_port->index);
+ WARN_ON_ONCE(unregister_netdevice_notifier(&devlink_port->netdevice_nb));
WARN_ON(!list_empty(&devlink_port->reporter_list));
devlink_port->registered = false;
}
@@ -7066,16 +7080,15 @@ void devlink_port_type_clear(struct devlink_port *devlink_port)
}
EXPORT_SYMBOL_GPL(devlink_port_type_clear);
-int devlink_port_netdevice_event(struct notifier_block *nb,
- unsigned long event, void *ptr)
+static int devlink_port_netdevice_event(struct notifier_block *nb,
+ unsigned long event, void *ptr)
{
struct net_device *netdev = netdev_notifier_info_to_dev(ptr);
- struct devlink_port *devlink_port = netdev->devlink_port;
- struct devlink *devlink;
+ struct devlink_port *devlink_port;
- devlink = container_of(nb, struct devlink, netdevice_nb);
+ devlink_port = container_of(nb, struct devlink_port, netdevice_nb);
- if (!devlink_port || devlink_port->devlink != devlink)
+ if (netdev->devlink_port != devlink_port)
return NOTIFY_OK;
switch (event) {
@@ -7089,7 +7102,7 @@ int devlink_port_netdevice_event(struct notifier_block *nb,
break;
case NETDEV_REGISTER:
case NETDEV_CHANGENAME:
- if (devlink_net(devlink) != dev_net(netdev))
+ if (devlink_net(devlink_port->devlink) != dev_net(netdev))
return NOTIFY_OK;
/* Set the netdev on top of previously set type. Note this
* event happens also during net namespace change so here
@@ -7100,7 +7113,7 @@ int devlink_port_netdevice_event(struct notifier_block *nb,
netdev);
break;
case NETDEV_UNREGISTER:
- if (devlink_net(devlink) != dev_net(netdev))
+ if (devlink_net(devlink_port->devlink) != dev_net(netdev))
return NOTIFY_OK;
/* Clear netdev pointer, but not the type. This event happens
* also during net namespace change so we need to clear
--
2.39.2
Powered by blists - more mailing lists