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 17A0CA04F1; Thu, 18 Jun 2020 18:28:17 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 9D2D51BFA5; Thu, 18 Jun 2020 18:28:15 +0200 (CEST) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id B0EA71BFA5 for ; Thu, 18 Jun 2020 18:28:13 +0200 (CEST) Received: from Internal Mail-Server by MTLPINE1 (envelope-from matan@mellanox.com) with SMTP; 18 Jun 2020 19:28:09 +0300 Received: from pegasus25.mtr.labs.mlnx. (pegasus25.mtr.labs.mlnx [10.210.16.10]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 05IGS9EO008363; Thu, 18 Jun 2020 19:28:09 +0300 From: Matan Azrad To: Maxime Coquelin , Xiao Wang Cc: dev@dpdk.org Date: Thu, 18 Jun 2020 16:28:03 +0000 Message-Id: <1592497686-433697-2-git-send-email-matan@mellanox.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1592497686-433697-1-git-send-email-matan@mellanox.com> References: <1592497686-433697-1-git-send-email-matan@mellanox.com> Subject: [dpdk-dev] [PATCH v1 1/4] vhost: support host notifier queue configuration 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" As an arrangement to per queue operations in the vDPA device it is needed to change the next experimental API: The API ``rte_vhost_host_notifier_ctrl`` was changed to be per queue instead of per device. A `qid` parameter was added to the API arguments list. Setting the parameter to the value VHOST_QUEUE_ALL will configure the host notifier to all the device queues as done before this patch. Signed-off-by: Matan Azrad --- doc/guides/rel_notes/release_20_08.rst | 2 ++ drivers/vdpa/ifc/ifcvf_vdpa.c | 6 +++--- drivers/vdpa/mlx5/mlx5_vdpa.c | 5 +++-- lib/librte_vhost/rte_vdpa.h | 8 ++++++-- lib/librte_vhost/rte_vhost.h | 2 ++ lib/librte_vhost/vhost.h | 3 --- lib/librte_vhost/vhost_user.c | 18 ++++++++++++++---- 7 files changed, 30 insertions(+), 14 deletions(-) diff --git a/doc/guides/rel_notes/release_20_08.rst b/doc/guides/rel_notes/release_20_08.rst index ba16d3b..9732959 100644 --- a/doc/guides/rel_notes/release_20_08.rst +++ b/doc/guides/rel_notes/release_20_08.rst @@ -111,6 +111,8 @@ API Changes Also, make sure to start the actual text at the margin. ========================================================= +* vhost: The API of ``rte_vhost_host_notifier_ctrl`` was changed to be per + queue and not per device, a qid parameter was added to the arguments list. ABI Changes ----------- diff --git a/drivers/vdpa/ifc/ifcvf_vdpa.c b/drivers/vdpa/ifc/ifcvf_vdpa.c index ec97178..336837a 100644 --- a/drivers/vdpa/ifc/ifcvf_vdpa.c +++ b/drivers/vdpa/ifc/ifcvf_vdpa.c @@ -839,7 +839,7 @@ struct internal_list { vdpa_ifcvf_stop(internal); vdpa_disable_vfio_intr(internal); - ret = rte_vhost_host_notifier_ctrl(vid, false); + ret = rte_vhost_host_notifier_ctrl(vid, VHOST_QUEUE_ALL, false); if (ret && ret != -ENOTSUP) goto error; @@ -858,7 +858,7 @@ struct internal_list { if (ret) goto stop_vf; - rte_vhost_host_notifier_ctrl(vid, true); + rte_vhost_host_notifier_ctrl(vid, VHOST_QUEUE_ALL, true); internal->sw_fallback_running = true; @@ -893,7 +893,7 @@ struct internal_list { rte_atomic32_set(&internal->dev_attached, 1); update_datapath(internal); - if (rte_vhost_host_notifier_ctrl(vid, true) != 0) + if (rte_vhost_host_notifier_ctrl(vid, VHOST_QUEUE_ALL, true) != 0) DRV_LOG(NOTICE, "vDPA (%d): software relay is used.", did); return 0; diff --git a/drivers/vdpa/mlx5/mlx5_vdpa.c b/drivers/vdpa/mlx5/mlx5_vdpa.c index 9e758b6..8ea1300 100644 --- a/drivers/vdpa/mlx5/mlx5_vdpa.c +++ b/drivers/vdpa/mlx5/mlx5_vdpa.c @@ -147,7 +147,8 @@ int ret; if (priv->direct_notifier) { - ret = rte_vhost_host_notifier_ctrl(priv->vid, false); + ret = rte_vhost_host_notifier_ctrl(priv->vid, VHOST_QUEUE_ALL, + false); if (ret != 0) { DRV_LOG(INFO, "Direct HW notifier FD cannot be " "destroyed for device %d: %d.", priv->vid, ret); @@ -155,7 +156,7 @@ } priv->direct_notifier = 0; } - ret = rte_vhost_host_notifier_ctrl(priv->vid, true); + ret = rte_vhost_host_notifier_ctrl(priv->vid, VHOST_QUEUE_ALL, true); if (ret != 0) DRV_LOG(INFO, "Direct HW notifier FD cannot be configured for" " device %d: %d.", priv->vid, ret); diff --git a/lib/librte_vhost/rte_vdpa.h b/lib/librte_vhost/rte_vdpa.h index ecb3d91..2db536c 100644 --- a/lib/librte_vhost/rte_vdpa.h +++ b/lib/librte_vhost/rte_vdpa.h @@ -202,22 +202,26 @@ struct rte_vdpa_device * int rte_vdpa_get_device_num(void); +#define VHOST_QUEUE_ALL VHOST_MAX_VRING + /** * @warning * @b EXPERIMENTAL: this API may change without prior notice * - * Enable/Disable host notifier mapping for a vdpa port. + * Enable/Disable host notifier mapping for a vdpa queue. * * @param vid * vhost device id * @param enable * true for host notifier map, false for host notifier unmap + * @param qid + * vhost queue id, VHOST_QUEUE_ALL to configure all the device queues * @return * 0 on success, -1 on failure */ __rte_experimental int -rte_vhost_host_notifier_ctrl(int vid, bool enable); +rte_vhost_host_notifier_ctrl(int vid, uint16_t qid, bool enable); /** * @warning diff --git a/lib/librte_vhost/rte_vhost.h b/lib/librte_vhost/rte_vhost.h index 329ed8a..14bf7c2 100644 --- a/lib/librte_vhost/rte_vhost.h +++ b/lib/librte_vhost/rte_vhost.h @@ -107,6 +107,8 @@ #define VHOST_USER_F_PROTOCOL_FEATURES 30 #endif +#define VHOST_MAX_VRING 0x100 +#define VHOST_MAX_QUEUE_PAIRS 0x80 /** * Information relating to memory regions including offsets to diff --git a/lib/librte_vhost/vhost.h b/lib/librte_vhost/vhost.h index 17f1e9a..28b991d 100644 --- a/lib/librte_vhost/vhost.h +++ b/lib/librte_vhost/vhost.h @@ -202,9 +202,6 @@ struct vhost_virtqueue { TAILQ_HEAD(, vhost_iotlb_entry) iotlb_pending_list; } __rte_cache_aligned; -#define VHOST_MAX_VRING 0x100 -#define VHOST_MAX_QUEUE_PAIRS 0x80 - /* Declare IOMMU related bits for older kernels */ #ifndef VIRTIO_F_IOMMU_PLATFORM diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c index 84bebad..cddfa4b 100644 --- a/lib/librte_vhost/vhost_user.c +++ b/lib/librte_vhost/vhost_user.c @@ -2960,13 +2960,13 @@ static int vhost_user_slave_set_vring_host_notifier(struct virtio_net *dev, return process_slave_message_reply(dev, &msg); } -int rte_vhost_host_notifier_ctrl(int vid, bool enable) +int rte_vhost_host_notifier_ctrl(int vid, uint16_t qid, bool enable) { struct virtio_net *dev; struct rte_vdpa_device *vdpa_dev; int vfio_device_fd, did, ret = 0; uint64_t offset, size; - unsigned int i; + unsigned int i, q_start, q_last; dev = get_device(vid); if (!dev) @@ -2990,6 +2990,16 @@ int rte_vhost_host_notifier_ctrl(int vid, bool enable) if (!vdpa_dev) return -ENODEV; + if (qid == VHOST_QUEUE_ALL) { + q_start = 0; + q_last = dev->nr_vring - 1; + } else { + if (qid >= dev->nr_vring) + return -EINVAL; + q_start = qid; + q_last = qid; + } + RTE_FUNC_PTR_OR_ERR_RET(vdpa_dev->ops->get_vfio_device_fd, -ENOTSUP); RTE_FUNC_PTR_OR_ERR_RET(vdpa_dev->ops->get_notify_area, -ENOTSUP); @@ -2998,7 +3008,7 @@ int rte_vhost_host_notifier_ctrl(int vid, bool enable) return -ENOTSUP; if (enable) { - for (i = 0; i < dev->nr_vring; i++) { + for (i = q_start; i <= q_last; i++) { if (vdpa_dev->ops->get_notify_area(vid, i, &offset, &size) < 0) { ret = -ENOTSUP; @@ -3013,7 +3023,7 @@ int rte_vhost_host_notifier_ctrl(int vid, bool enable) } } else { disable: - for (i = 0; i < dev->nr_vring; i++) { + for (i = q_start; i <= q_last; i++) { vhost_user_slave_set_vring_host_notifier(dev, i, -1, 0, 0); } -- 1.8.3.1