From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id DF7B2A00BE; Thu, 11 Jun 2020 23:39:26 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 2674F2C6E; Thu, 11 Jun 2020 23:38:51 +0200 (CEST) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) by dpdk.org (Postfix) with ESMTP id 85AF3E07 for ; Thu, 11 Jun 2020 23:38:49 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1591911529; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=iYtmFB1NnOVKzAqo65IBF9PGm3LVZiqBUr54cDMWSWk=; b=Nx7cDz0Rl7Qgj340KbyVKJTpfFroEO8hGOQZRE5xVvgtUghfZ4wTUQme40ymrkktQS4Tst KvznMeGM7S4DK9KJrQCWwKp2U+6p7xj4T3tvfslH/jKbcTsHTmxIiOSun02BNprrUZK3jJ Ar2LSy7if/+Y6Df9wPaVwLwCU25tLes= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-34-zR-FvP36MHKOpHru8dbqZw-1; Thu, 11 Jun 2020 17:38:45 -0400 X-MC-Unique: zR-FvP36MHKOpHru8dbqZw-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id DF23B461; Thu, 11 Jun 2020 21:38:43 +0000 (UTC) Received: from localhost.localdomain (unknown [10.36.110.37]) by smtp.corp.redhat.com (Postfix) with ESMTP id D96BF100238D; Thu, 11 Jun 2020 21:38:40 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, matan@mellanox.com, xiao.w.wang@intel.com, zhihong.wang@intel.com, xiaolong.ye@intel.com, chenbo.xia@intel.com, david.marchand@redhat.com, amorenoz@redhat.com, shreyansh.jain@nxp.com, viacheslavo@mellanox.com, hemant.agrawal@nxp.com, sachin.saxena@nxp.com Cc: Maxime Coquelin Date: Thu, 11 Jun 2020 23:37:43 +0200 Message-Id: <20200611213748.1967029-10-maxime.coquelin@redhat.com> In-Reply-To: <20200611213748.1967029-1-maxime.coquelin@redhat.com> References: <20200611213748.1967029-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [PATCH 09/14] vhost: use linked-list for vDPA devices X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" There is no more notion of device ID outside of vdpa.c. We can now move from array to linked-list model for keeping track of the vDPA devices. There is no point in using array here, as all vDPA API are used from the control path, so no performance concerns. Signed-off-by: Maxime Coquelin --- lib/librte_vhost/rte_vdpa.h | 1 + lib/librte_vhost/vdpa.c | 135 ++++++++++++++++++------------------ 2 files changed, 70 insertions(+), 66 deletions(-) diff --git a/lib/librte_vhost/rte_vdpa.h b/lib/librte_vhost/rte_vdpa.h index ca6cb0e882..011befdc71 100644 --- a/lib/librte_vhost/rte_vdpa.h +++ b/lib/librte_vhost/rte_vdpa.h @@ -65,6 +65,7 @@ struct rte_vdpa_dev_ops { * vdpa device structure includes device address and device operations. */ struct rte_vdpa_device { + TAILQ_ENTRY(rte_vdpa_device) next; /** Generic device information */ struct rte_device *device; /** vdpa device operations */ diff --git a/lib/librte_vhost/vdpa.c b/lib/librte_vhost/vdpa.c index ae4df4521d..8f4778e2fa 100644 --- a/lib/librte_vhost/vdpa.c +++ b/lib/librte_vhost/vdpa.c @@ -9,35 +9,54 @@ */ #include +#include #include #include +#include +#include + #include "rte_vdpa.h" #include "vhost.h" -static struct rte_vdpa_device vdpa_devices[MAX_VHOST_DEVICE]; +/** 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 rte_spinlock_t vdpa_device_list_lock = RTE_SPINLOCK_INITIALIZER; static uint32_t vdpa_device_num; -struct rte_vdpa_device * -rte_vdpa_find_device_by_name(const char *name) +/* Unsafe, needs to be called with vdpa_device_list_lock held */ +static struct rte_vdpa_device * +__vdpa_find_device_by_name(const char *name) { - struct rte_vdpa_device *dev; - int i; + struct rte_vdpa_device *dev, *ret = NULL; if (name == NULL) return NULL; - for (i = 0; i < MAX_VHOST_DEVICE; ++i) { - dev = &vdpa_devices[i]; - if (dev->ops == NULL) - continue; - - if (strcmp(dev->device->name, name) == 0) - return dev; + TAILQ_FOREACH(dev, &vdpa_device_list, next) { + if (strcmp(dev->device->name, name) == 0) { + ret = dev; + break; + } } - return NULL; + return ret; +} + +struct rte_vdpa_device * +rte_vdpa_find_device_by_name(const char *name) +{ + struct rte_vdpa_device *dev; + + rte_spinlock_lock(&vdpa_device_list_lock); + dev = __vdpa_find_device_by_name(name); + rte_spinlock_unlock(&vdpa_device_list_lock); + + return dev; } struct rte_device * @@ -54,52 +73,52 @@ rte_vdpa_register_device(struct rte_device *rte_dev, struct rte_vdpa_dev_ops *ops) { struct rte_vdpa_device *dev; - int i; - if (vdpa_device_num >= MAX_VHOST_DEVICE || ops == NULL) + if (ops == NULL) return NULL; - for (i = 0; i < MAX_VHOST_DEVICE; i++) { - dev = &vdpa_devices[i]; - if (dev->ops == NULL) - continue; - - if (dev->device == rte_dev) - return NULL; + rte_spinlock_lock(&vdpa_device_list_lock); + /* Check the device hasn't been register already */ + dev = __vdpa_find_device_by_name(rte_dev->name); + if (dev) { + dev = NULL; + goto out_unlock; } - for (i = 0; i < MAX_VHOST_DEVICE; i++) { - if (vdpa_devices[i].ops == NULL) - break; - } - - if (i == MAX_VHOST_DEVICE) - return NULL; + dev = rte_zmalloc(NULL, sizeof(*dev), 0); + if (!dev) + goto out_unlock; - dev = &vdpa_devices[i]; dev->device = rte_dev; dev->ops = ops; + TAILQ_INSERT_TAIL(&vdpa_device_list, dev, next); vdpa_device_num++; +out_unlock: + rte_spinlock_unlock(&vdpa_device_list_lock); return dev; } int -rte_vdpa_unregister_device(struct rte_vdpa_device *vdev) +rte_vdpa_unregister_device(struct rte_vdpa_device *dev) { - int i; + struct rte_vdpa_device *cur_dev, *tmp_dev; + int ret = -1; - for (i = 0; i < MAX_VHOST_DEVICE; i++) { - if (vdev != &vdpa_devices[i]) + rte_spinlock_lock(&vdpa_device_list_lock); + TAILQ_FOREACH_SAFE(cur_dev, &vdpa_device_list, next, tmp_dev) { + if (dev != cur_dev) continue; - memset(vdev, 0, sizeof(struct rte_vdpa_device)); + TAILQ_REMOVE(&vdpa_device_list, dev, next); + rte_free(dev); vdpa_device_num--; - - return 0; + ret = 0; + break; } + rte_spinlock_lock(&vdpa_device_list_lock); - return -1; + return ret; } int @@ -210,14 +229,6 @@ rte_vdpa_relay_vring_used(int vid, uint16_t qid, void *vring_m) return -1; } -static uint16_t -vdpa_dev_to_id(const struct rte_vdpa_device *dev) -{ - if (dev == NULL) - return MAX_VHOST_DEVICE; - return dev - vdpa_devices; -} - static int vdpa_dev_match(struct rte_vdpa_device *dev, const struct rte_device *rte_dev) @@ -237,30 +248,22 @@ vdpa_find_device(const struct rte_vdpa_device *start, rte_vdpa_cmp_t cmp, struct rte_device *rte_dev) { struct rte_vdpa_device *dev; - ptrdiff_t idx; - /* Avoid Undefined Behaviour */ - if (start != NULL && - (start < &vdpa_devices[0] || - start >= &vdpa_devices[MAX_VHOST_DEVICE])) - return NULL; - - if (start != NULL) - idx = vdpa_dev_to_id(start) + 1; + rte_spinlock_lock(&vdpa_device_list_lock); + if (start == NULL) + dev = TAILQ_FIRST(&vdpa_device_list); else - idx = 0; - for (; idx < MAX_VHOST_DEVICE; idx++) { - dev = &vdpa_devices[idx]; - /* - * ToDo: Certainly better to introduce a state field, - * but rely on ops being set for now. - */ - if (dev->ops == NULL) - continue; + dev = TAILQ_NEXT(start, next); + + while (dev != NULL) { if (cmp(dev, rte_dev) == 0) - return dev; + break; + + dev = TAILQ_NEXT(dev, next); } - return NULL; + rte_spinlock_unlock(&vdpa_device_list_lock); + + return dev; } static void * -- 2.26.2