Message ID | 20231228014633.3256862-2-dw@davidwei.uk (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | netdevsim: link and forward skbs between ports | expand |
Thu, Dec 28, 2023 at 02:46:29AM CET, dw@davidwei.uk wrote: >In this patch I added a linked list nsim_dev_list of probed nsim_devs, >added during nsim_drv_probe() and removed during nsim_drv_remove(). A >mutex nsim_dev_list_lock protects the list. > >Signed-off-by: David Wei <dw@davidwei.uk> >--- > drivers/net/netdevsim/dev.c | 19 +++++++++++++++++++ > drivers/net/netdevsim/netdevsim.h | 1 + > 2 files changed, 20 insertions(+) > >diff --git a/drivers/net/netdevsim/dev.c b/drivers/net/netdevsim/dev.c >index b4d3b9cde8bd..8d477aa99f94 100644 >--- a/drivers/net/netdevsim/dev.c >+++ b/drivers/net/netdevsim/dev.c >@@ -35,6 +35,9 @@ > > #include "netdevsim.h" > >+static LIST_HEAD(nsim_dev_list); >+static DEFINE_MUTEX(nsim_dev_list_lock); >+ > static unsigned int > nsim_dev_port_index(enum nsim_dev_port_type type, unsigned int port_index) > { >@@ -1607,6 +1610,11 @@ int nsim_drv_probe(struct nsim_bus_dev *nsim_bus_dev) > > nsim_dev->esw_mode = DEVLINK_ESWITCH_MODE_LEGACY; > devl_unlock(devlink); >+ >+ mutex_lock(&nsim_dev_list_lock); >+ list_add(&nsim_dev->list, &nsim_dev_list); >+ mutex_unlock(&nsim_dev_list_lock); >+ > return 0; > > err_hwstats_exit: >@@ -1668,8 +1676,19 @@ void nsim_drv_remove(struct nsim_bus_dev *nsim_bus_dev) > { > struct nsim_dev *nsim_dev = dev_get_drvdata(&nsim_bus_dev->dev); > struct devlink *devlink = priv_to_devlink(nsim_dev); >+ struct nsim_dev *pos, *tmp; >+ >+ mutex_lock(&nsim_dev_list_lock); >+ list_for_each_entry_safe(pos, tmp, &nsim_dev_list, list) { >+ if (pos == nsim_dev) { >+ list_del(&nsim_dev->list); >+ break; >+ } >+ } >+ mutex_unlock(&nsim_dev_list_lock); This is just: mutex_lock(&nsim_dev_list_lock); list_del(&nsim_dev->list); mutex_unlock(&nsim_dev_list_lock); The loop is not good for anything. > > devl_lock(devlink); >+ Remove this leftover line addition. > nsim_dev_reload_destroy(nsim_dev); > > nsim_bpf_dev_exit(nsim_dev); >diff --git a/drivers/net/netdevsim/netdevsim.h b/drivers/net/netdevsim/netdevsim.h >index 028c825b86db..babb61d7790b 100644 >--- a/drivers/net/netdevsim/netdevsim.h >+++ b/drivers/net/netdevsim/netdevsim.h >@@ -277,6 +277,7 @@ struct nsim_vf_config { > > struct nsim_dev { > struct nsim_bus_dev *nsim_bus_dev; >+ struct list_head list; > struct nsim_fib_data *fib_data; > struct nsim_trap_data *trap_data; > struct dentry *ddir; >-- >2.39.3 >
On 2024-01-02 03:04, Jiri Pirko wrote: > Thu, Dec 28, 2023 at 02:46:29AM CET, dw@davidwei.uk wrote: >> In this patch I added a linked list nsim_dev_list of probed nsim_devs, >> added during nsim_drv_probe() and removed during nsim_drv_remove(). A >> mutex nsim_dev_list_lock protects the list. >> >> Signed-off-by: David Wei <dw@davidwei.uk> >> --- >> drivers/net/netdevsim/dev.c | 19 +++++++++++++++++++ >> drivers/net/netdevsim/netdevsim.h | 1 + >> 2 files changed, 20 insertions(+) >> >> diff --git a/drivers/net/netdevsim/dev.c b/drivers/net/netdevsim/dev.c >> index b4d3b9cde8bd..8d477aa99f94 100644 >> --- a/drivers/net/netdevsim/dev.c >> +++ b/drivers/net/netdevsim/dev.c >> @@ -35,6 +35,9 @@ >> >> #include "netdevsim.h" >> >> +static LIST_HEAD(nsim_dev_list); >> +static DEFINE_MUTEX(nsim_dev_list_lock); >> + >> static unsigned int >> nsim_dev_port_index(enum nsim_dev_port_type type, unsigned int port_index) >> { >> @@ -1607,6 +1610,11 @@ int nsim_drv_probe(struct nsim_bus_dev *nsim_bus_dev) >> >> nsim_dev->esw_mode = DEVLINK_ESWITCH_MODE_LEGACY; >> devl_unlock(devlink); >> + >> + mutex_lock(&nsim_dev_list_lock); >> + list_add(&nsim_dev->list, &nsim_dev_list); >> + mutex_unlock(&nsim_dev_list_lock); >> + >> return 0; >> >> err_hwstats_exit: >> @@ -1668,8 +1676,19 @@ void nsim_drv_remove(struct nsim_bus_dev *nsim_bus_dev) >> { >> struct nsim_dev *nsim_dev = dev_get_drvdata(&nsim_bus_dev->dev); >> struct devlink *devlink = priv_to_devlink(nsim_dev); >> + struct nsim_dev *pos, *tmp; >> + >> + mutex_lock(&nsim_dev_list_lock); >> + list_for_each_entry_safe(pos, tmp, &nsim_dev_list, list) { >> + if (pos == nsim_dev) { >> + list_del(&nsim_dev->list); >> + break; >> + } >> + } >> + mutex_unlock(&nsim_dev_list_lock); > > This is just: > mutex_lock(&nsim_dev_list_lock); > list_del(&nsim_dev->list); > mutex_unlock(&nsim_dev_list_lock); > > The loop is not good for anything. Thanks, will fix this. > > > >> >> devl_lock(devlink); >> + > > Remove this leftover line addition. Ditto. > > >> nsim_dev_reload_destroy(nsim_dev); >> >> nsim_bpf_dev_exit(nsim_dev); >> diff --git a/drivers/net/netdevsim/netdevsim.h b/drivers/net/netdevsim/netdevsim.h >> index 028c825b86db..babb61d7790b 100644 >> --- a/drivers/net/netdevsim/netdevsim.h >> +++ b/drivers/net/netdevsim/netdevsim.h >> @@ -277,6 +277,7 @@ struct nsim_vf_config { >> >> struct nsim_dev { >> struct nsim_bus_dev *nsim_bus_dev; >> + struct list_head list; >> struct nsim_fib_data *fib_data; >> struct nsim_trap_data *trap_data; >> struct dentry *ddir; >> -- >> 2.39.3 >>
diff --git a/drivers/net/netdevsim/dev.c b/drivers/net/netdevsim/dev.c index b4d3b9cde8bd..8d477aa99f94 100644 --- a/drivers/net/netdevsim/dev.c +++ b/drivers/net/netdevsim/dev.c @@ -35,6 +35,9 @@ #include "netdevsim.h" +static LIST_HEAD(nsim_dev_list); +static DEFINE_MUTEX(nsim_dev_list_lock); + static unsigned int nsim_dev_port_index(enum nsim_dev_port_type type, unsigned int port_index) { @@ -1607,6 +1610,11 @@ int nsim_drv_probe(struct nsim_bus_dev *nsim_bus_dev) nsim_dev->esw_mode = DEVLINK_ESWITCH_MODE_LEGACY; devl_unlock(devlink); + + mutex_lock(&nsim_dev_list_lock); + list_add(&nsim_dev->list, &nsim_dev_list); + mutex_unlock(&nsim_dev_list_lock); + return 0; err_hwstats_exit: @@ -1668,8 +1676,19 @@ void nsim_drv_remove(struct nsim_bus_dev *nsim_bus_dev) { struct nsim_dev *nsim_dev = dev_get_drvdata(&nsim_bus_dev->dev); struct devlink *devlink = priv_to_devlink(nsim_dev); + struct nsim_dev *pos, *tmp; + + mutex_lock(&nsim_dev_list_lock); + list_for_each_entry_safe(pos, tmp, &nsim_dev_list, list) { + if (pos == nsim_dev) { + list_del(&nsim_dev->list); + break; + } + } + mutex_unlock(&nsim_dev_list_lock); devl_lock(devlink); + nsim_dev_reload_destroy(nsim_dev); nsim_bpf_dev_exit(nsim_dev); diff --git a/drivers/net/netdevsim/netdevsim.h b/drivers/net/netdevsim/netdevsim.h index 028c825b86db..babb61d7790b 100644 --- a/drivers/net/netdevsim/netdevsim.h +++ b/drivers/net/netdevsim/netdevsim.h @@ -277,6 +277,7 @@ struct nsim_vf_config { struct nsim_dev { struct nsim_bus_dev *nsim_bus_dev; + struct list_head list; struct nsim_fib_data *fib_data; struct nsim_trap_data *trap_data; struct dentry *ddir;
In this patch I added a linked list nsim_dev_list of probed nsim_devs, added during nsim_drv_probe() and removed during nsim_drv_remove(). A mutex nsim_dev_list_lock protects the list. Signed-off-by: David Wei <dw@davidwei.uk> --- drivers/net/netdevsim/dev.c | 19 +++++++++++++++++++ drivers/net/netdevsim/netdevsim.h | 1 + 2 files changed, 20 insertions(+)