> -----Original Message----- > From: David Marchand <david.march...@redhat.com> > Sent: Tuesday, February 7, 2023 6:46 PM > To: dev@dpdk.org > Cc: maxime.coque...@redhat.com; step...@networkplumber.org; Xia, Chenbo > <chenbo....@intel.com>; Hu, Jiayu <jiayu...@intel.com>; Wang, YuanX > <yuanx.w...@intel.com>; Ding, Xuan <xuan.d...@intel.com>; > m...@smartsharesystems.com > Subject: [PATCH v6 8/9] vhost: annotate vDPA device list accesses > > Access to vdpa_device_list must be protected with vdpa_device_list_lock > spinlock. > > Signed-off-by: David Marchand <david.march...@redhat.com> > Acked-by: Morten Brørup <m...@smartsharesystems.com> > Reviewed-by: Maxime Coquelin <maxime.coque...@redhat.com> > --- > Changes since RFC v3: > - rebased, > > --- > lib/vhost/vdpa.c | 19 ++++++++++--------- > 1 file changed, 10 insertions(+), 9 deletions(-) > > diff --git a/lib/vhost/vdpa.c b/lib/vhost/vdpa.c > index a430a66970..6284ea2ed1 100644 > --- a/lib/vhost/vdpa.c > +++ b/lib/vhost/vdpa.c > @@ -23,21 +23,22 @@ > /** Double linked list of vDPA devices. */ > TAILQ_HEAD(vdpa_device_list, rte_vdpa_device); > > -static struct vdpa_device_list vdpa_device_list = > - TAILQ_HEAD_INITIALIZER(vdpa_device_list); > +static struct vdpa_device_list vdpa_device_list__ = > + TAILQ_HEAD_INITIALIZER(vdpa_device_list__); > static rte_spinlock_t vdpa_device_list_lock = RTE_SPINLOCK_INITIALIZER; > +static struct vdpa_device_list * const vdpa_device_list > + __rte_guarded_by(&vdpa_device_list_lock) = &vdpa_device_list__; > > - > -/* Unsafe, needs to be called with vdpa_device_list_lock held */ > static struct rte_vdpa_device * > __vdpa_find_device_by_name(const char *name) > + __rte_exclusive_locks_required(&vdpa_device_list_lock) > { > struct rte_vdpa_device *dev, *ret = NULL; > > if (name == NULL) > return NULL; > > - TAILQ_FOREACH(dev, &vdpa_device_list, next) { > + TAILQ_FOREACH(dev, vdpa_device_list, next) { > if (!strncmp(dev->device->name, name, RTE_DEV_NAME_MAX_LEN)) { > ret = dev; > break; > @@ -116,7 +117,7 @@ rte_vdpa_register_device(struct rte_device *rte_dev, > dev->type = RTE_VHOST_VDPA_DEVICE_TYPE_NET; > } > > - TAILQ_INSERT_TAIL(&vdpa_device_list, dev, next); > + TAILQ_INSERT_TAIL(vdpa_device_list, dev, next); > out_unlock: > rte_spinlock_unlock(&vdpa_device_list_lock); > > @@ -130,11 +131,11 @@ rte_vdpa_unregister_device(struct rte_vdpa_device > *dev) > int ret = -1; > > rte_spinlock_lock(&vdpa_device_list_lock); > - RTE_TAILQ_FOREACH_SAFE(cur_dev, &vdpa_device_list, next, tmp_dev) { > + RTE_TAILQ_FOREACH_SAFE(cur_dev, vdpa_device_list, next, tmp_dev) { > if (dev != cur_dev) > continue; > > - TAILQ_REMOVE(&vdpa_device_list, dev, next); > + TAILQ_REMOVE(vdpa_device_list, dev, next); > rte_free(dev); > ret = 0; > break; > @@ -336,7 +337,7 @@ vdpa_find_device(const struct rte_vdpa_device *start, > rte_vdpa_cmp_t cmp, > > rte_spinlock_lock(&vdpa_device_list_lock); > if (start == NULL) > - dev = TAILQ_FIRST(&vdpa_device_list); > + dev = TAILQ_FIRST(vdpa_device_list); > else > dev = TAILQ_NEXT(start, next); > > -- > 2.39.1
Reviewed-by: Chenbo Xia <chenbo....@intel.com>