From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id C404D43893; Thu, 11 Jan 2024 15:14:21 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 4680740266; Thu, 11 Jan 2024 15:14:21 +0100 (CET) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by mails.dpdk.org (Postfix) with ESMTP id 38BA84025E for ; Thu, 11 Jan 2024 15:14:20 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1704982459; 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:autocrypt:autocrypt; bh=Lf07qObOTa5rto55+/p7gf9IANa1Orhv0F+tnBpFA/E=; b=DmfBvVvyDIAKVJR2STxV80HhwXPI8EvyTFbZqWbZ1klQT1gD4BhkAyFJJ1VwJdKIYbSoC9 GX4Hxgxpd2bV8vGkNE9GL7BgbjsVDMgo8+fPjI6NFJaqYQ3969cfOXvwAt4kJcZ5nI7Orn l5lRax3Rk+v7sZVeR05CjnqPTHxA/Fw= Received: from mimecast-mx02.redhat.com (mx-ext.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-211-aAU1Pdw9MCeuTGtPez-lig-1; Thu, 11 Jan 2024 09:14:16 -0500 X-MC-Unique: aAU1Pdw9MCeuTGtPez-lig-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.rdu2.redhat.com [10.11.54.7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id C9BAC1C08BA7; Thu, 11 Jan 2024 14:14:15 +0000 (UTC) Received: from [10.39.208.21] (unknown [10.39.208.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 761C81C0652C; Thu, 11 Jan 2024 14:14:14 +0000 (UTC) Message-ID: Date: Thu, 11 Jan 2024 15:14:13 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH 1/2] net/virtio-user: improve kick performance with notification area mapping To: Srujana Challa , dev@dpdk.org, chenbox@nvidia.com Cc: jerinj@marvell.com, vattunuru@marvell.com References: <20231208053121.152929-1-schalla@marvell.com> From: Maxime Coquelin Autocrypt: addr=maxime.coquelin@redhat.com; keydata= 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 Mwqu3GQ= In-Reply-To: <20231208053121.152929-1-schalla@marvell.com> X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.7 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Hi Srujana, Thanks for your contribution! Is it possible to provide information on which hardware it can be tested on? On 12/8/23 06:31, Srujana Challa wrote: > This patch introduces new virtio-user callback to map the vq > notification area and implements it for the vhost-vDPA backend. > This is simply done by using mmap()/munmap() for > the vhost-vDPA fd. > > This patch also adds a parameter for configuring feature bit > VIRTIO_NET_F_NOTIFICATION_DATA. If feature is disabled, also VIRTIO_F_NOTIFICATION_DATA* > update corresponding unsupported feature bit. And also adds > code to write to queue notify address in notify callback. > This will help in increasing the kick performance. Do you have any number about the performance improvement? > Signed-off-by: Srujana Challa > --- > doc/guides/nics/virtio.rst | 5 ++ > drivers/net/virtio/virtio_user/vhost.h | 1 + > drivers/net/virtio/virtio_user/vhost_vdpa.c | 56 ++++++++++++++++++ > .../net/virtio/virtio_user/virtio_user_dev.c | 52 +++++++++++++++-- > .../net/virtio/virtio_user/virtio_user_dev.h | 5 +- > drivers/net/virtio/virtio_user_ethdev.c | 57 ++++++++++++++++--- > 6 files changed, 162 insertions(+), 14 deletions(-) > > diff --git a/doc/guides/nics/virtio.rst b/doc/guides/nics/virtio.rst > index c22ce56a02..11dd6359e5 100644 > --- a/doc/guides/nics/virtio.rst > +++ b/doc/guides/nics/virtio.rst > @@ -349,6 +349,11 @@ Below devargs are supported by the virtio-user vdev: > election. > (Default: 0 (disabled)) > > +#. ``notification_data``: > + > + It is used to enable virtio device notification data feature. > + (Default: 1 (enabled)) Is there any reason currently to make it configurable? As it is enabled by default, I guess we want it to be negociated if the device supports it. Let's remove the devarg for now, and we can revisit if the need arise? > + > Virtio paths Selection and Usage > -------------------------------- > > diff --git a/drivers/net/virtio/virtio_user/vhost.h b/drivers/net/virtio/virtio_user/vhost.h > index f817cab77a..1bce00c7ac 100644 > --- a/drivers/net/virtio/virtio_user/vhost.h > +++ b/drivers/net/virtio/virtio_user/vhost.h > @@ -90,6 +90,7 @@ struct virtio_user_backend_ops { > int (*server_disconnect)(struct virtio_user_dev *dev); > int (*server_reconnect)(struct virtio_user_dev *dev); > int (*get_intr_fd)(struct virtio_user_dev *dev); > + int (*map_notification_area)(struct virtio_user_dev *dev, bool map); > }; > > extern struct virtio_user_backend_ops virtio_ops_user; > diff --git a/drivers/net/virtio/virtio_user/vhost_vdpa.c b/drivers/net/virtio/virtio_user/vhost_vdpa.c > index 2c36b26224..1eb0f9ec48 100644 > --- a/drivers/net/virtio/virtio_user/vhost_vdpa.c > +++ b/drivers/net/virtio/virtio_user/vhost_vdpa.c > @@ -5,6 +5,7 @@ > #include > #include > #include > +#include > #include > #include > #include > @@ -622,6 +623,60 @@ vhost_vdpa_get_intr_fd(struct virtio_user_dev *dev __rte_unused) > return -1; > } > > +static int > +unmap_notification_area(struct virtio_user_dev *dev, int nr_vrings) > +{ > + int i; > + > + for (i = 0; i < nr_vrings; i++) { > + if (dev->notify_area[i]) > + munmap(dev->notify_area[i], getpagesize()); > + } > + free(dev->notify_area); > + > + return 0; > +} > + > +static int > +vhost_vdpa_map_notification_area(struct virtio_user_dev *dev, bool map) > +{ > + struct vhost_vdpa_data *data = dev->backend_data; > + int nr_vrings, i, page_size = getpagesize(); > + uint16_t **notify_area; > + > + nr_vrings = dev->max_queue_pairs * 2; > + if (dev->device_features & (1ull << VIRTIO_NET_F_CTRL_VQ)) > + nr_vrings++; > + > + if (!map) > + return unmap_notification_area(dev, nr_vrings); > + > + notify_area = malloc(nr_vrings * sizeof(*notify_area)); > + if (!notify_area) { > + PMD_DRV_LOG(ERR, "(%s) Failed to allocate notify area array", dev->path); > + return -1; > + } Add new line here. > + for (i = 0; i < nr_vrings; i++) { > + notify_area[i] = mmap(NULL, page_size, PROT_WRITE, MAP_SHARED | MAP_FILE, > + data->vhostfd, i * page_size); > + if (notify_area[i] == MAP_FAILED) { > + PMD_DRV_LOG(ERR, "(%s) Map failed for notify address of queue %d\n", > + dev->path, i); > + goto map_err; > + } > + } > + dev->notify_area = notify_area; > + > + return 0; > + > +map_err: > + i--; I would move this before the goto map_err; > + for (; i >= 0; i--) > + munmap(notify_area[i], page_size); > + free(notify_area); New line here. > + return -1; > +} > + > struct virtio_user_backend_ops virtio_ops_vdpa = { > .setup = vhost_vdpa_setup, > .destroy = vhost_vdpa_destroy, > @@ -646,4 +701,5 @@ struct virtio_user_backend_ops virtio_ops_vdpa = { > .dma_unmap = vhost_vdpa_dma_unmap_batch, > .update_link_state = vhost_vdpa_update_link_state, > .get_intr_fd = vhost_vdpa_get_intr_fd, > + .map_notification_area = vhost_vdpa_map_notification_area, I wonder if it wouldn't be cleaner to have one cb for map, one for unmap. WDYT? > }; > diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/net/virtio/virtio_user/virtio_user_dev.c > index af1f8c8237..578877d089 100644 > --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c > +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c > @@ -18,6 +18,7 @@ > #include > #include > #include > +#include > > #include "vhost.h" > #include "virtio_user_dev.h" > @@ -413,6 +414,12 @@ virtio_user_dev_init_notify(struct virtio_user_dev *dev) > dev->callfds[i] = callfd; > dev->kickfds[i] = kickfd; > } > + dev->notify_area_mapped = false; Can't we just check on dev->notify_area instead of introducing a new field? > + if (dev->ops->map_notification_area) { > + if (dev->ops->map_notification_area(dev, true)) > + goto err; > + dev->notify_area_mapped = true; > + } > > return 0; > err: > @@ -445,6 +452,11 @@ virtio_user_dev_uninit_notify(struct virtio_user_dev *dev) > dev->callfds[i] = -1; > } > } > + if (dev->ops->map_notification_area && dev->notify_area_mapped) { > + /* Unmap notification area */ > + dev->ops->map_notification_area(dev, false); > + dev->notify_area_mapped = false; > + } > } > > static int > @@ -674,12 +686,14 @@ virtio_user_free_vrings(struct virtio_user_dev *dev) > 1ULL << VIRTIO_NET_F_GUEST_TSO6 | \ > 1ULL << VIRTIO_F_IN_ORDER | \ > 1ULL << VIRTIO_F_VERSION_1 | \ > - 1ULL << VIRTIO_F_RING_PACKED) > + 1ULL << VIRTIO_F_RING_PACKED | \ > + 1ULL << VIRTIO_F_NOTIFICATION_DATA) > > int > virtio_user_dev_init(struct virtio_user_dev *dev, char *path, uint16_t queues, > int cq, int queue_size, const char *mac, char **ifname, > int server, int mrg_rxbuf, int in_order, int packed_vq, > + int notification_data, > enum virtio_user_backend_type backend_type) > { > uint64_t backend_features; > @@ -737,6 +751,9 @@ virtio_user_dev_init(struct virtio_user_dev *dev, char *path, uint16_t queues, > if (!packed_vq) > dev->unsupported_features |= (1ull << VIRTIO_F_RING_PACKED); > > + if (!notification_data) > + dev->unsupported_features |= (1ull << VIRTIO_F_NOTIFICATION_DATA); > + > if (dev->mac_specified) > dev->frontend_features |= (1ull << VIRTIO_NET_F_MAC); > else > @@ -1039,11 +1056,35 @@ static void > virtio_user_control_queue_notify(struct virtqueue *vq, void *cookie) > { > struct virtio_user_dev *dev = cookie; > - uint64_t buf = 1; > + uint64_t notify_data = 1; > + > + if (!dev->notify_area_mapped) { > + if (write(dev->kickfds[vq->vq_queue_index], ¬ify_data, sizeof(notify_data)) < 0) > + PMD_DRV_LOG(ERR, "failed to kick backend: %s", > + strerror(errno)); > + return; > + } else if (!virtio_with_feature(&dev->hw, VIRTIO_F_NOTIFICATION_DATA)) { > + rte_write16(vq->vq_queue_index, vq->notify_addr); > + return; > + } > > - if (write(dev->kickfds[vq->vq_queue_index], &buf, sizeof(buf)) < 0) > - PMD_DRV_LOG(ERR, "failed to kick backend: %s", > - strerror(errno)); > + if (virtio_with_packed_queue(&dev->hw)) { > + /* Bit[0:15]: vq queue index > + * Bit[16:30]: avail index > + * Bit[31]: avail wrap counter > + */ > + notify_data = ((uint32_t)(!!(vq->vq_packed.cached_flags & > + VRING_PACKED_DESC_F_AVAIL)) << 31) | > + ((uint32_t)vq->vq_avail_idx << 16) | > + vq->vq_queue_index; > + } else { > + /* Bit[0:15]: vq queue index > + * Bit[16:31]: avail index > + */ > + notify_data = ((uint32_t)vq->vq_avail_idx << 16) | > + vq->vq_queue_index; > + } > + rte_write32(notify_data, vq->notify_addr); > } > > int > @@ -1062,6 +1103,7 @@ virtio_user_dev_create_shadow_cvq(struct virtio_user_dev *dev, struct virtqueue > > scvq->cq.notify_queue = &virtio_user_control_queue_notify; > scvq->cq.notify_cookie = dev; > + scvq->notify_addr = vq->notify_addr; > dev->scvq = scvq; > > return 0; > diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.h b/drivers/net/virtio/virtio_user/virtio_user_dev.h > index 7323d88302..29ec386da5 100644 > --- a/drivers/net/virtio/virtio_user/virtio_user_dev.h > +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.h > @@ -64,6 +64,9 @@ struct virtio_user_dev { > struct virtqueue *scvq; > > void *backend_data; > + > + bool notify_area_mapped; > + uint16_t **notify_area; > }; > > int virtio_user_dev_set_features(struct virtio_user_dev *dev); > @@ -72,7 +75,7 @@ int virtio_user_stop_device(struct virtio_user_dev *dev); > int virtio_user_dev_init(struct virtio_user_dev *dev, char *path, uint16_t queues, > int cq, int queue_size, const char *mac, char **ifname, > int server, int mrg_rxbuf, int in_order, > - int packed_vq, > + int packed_vq, int notification_data, > enum virtio_user_backend_type backend_type); > void virtio_user_dev_uninit(struct virtio_user_dev *dev); > void virtio_user_handle_cq(struct virtio_user_dev *dev, uint16_t queue_idx); > diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c > index 3a31642899..241465ecdd 100644 > --- a/drivers/net/virtio/virtio_user_ethdev.c > +++ b/drivers/net/virtio/virtio_user_ethdev.c > @@ -18,6 +18,7 @@ > #include > #include > #include > +#include > > #include "virtio_ethdev.h" > #include "virtio_logs.h" > @@ -232,6 +233,7 @@ virtio_user_setup_queue(struct virtio_hw *hw, struct virtqueue *vq) > else > virtio_user_setup_queue_split(vq, dev); > > + vq->notify_addr = dev->notify_area[vq->vq_queue_index]; > if (dev->hw_cvq && hw->cvq && (virtnet_cq_to_vq(hw->cvq) == vq)) > return virtio_user_dev_create_shadow_cvq(dev, vq); > > @@ -262,8 +264,8 @@ virtio_user_del_queue(struct virtio_hw *hw, struct virtqueue *vq) > static void > virtio_user_notify_queue(struct virtio_hw *hw, struct virtqueue *vq) > { > - uint64_t buf = 1; > struct virtio_user_dev *dev = virtio_user_get_dev(hw); > + uint64_t notify_data = 1; > > if (hw->cvq && (virtnet_cq_to_vq(hw->cvq) == vq)) { > virtio_user_handle_cq(dev, vq->vq_queue_index); > @@ -271,9 +273,34 @@ virtio_user_notify_queue(struct virtio_hw *hw, struct virtqueue *vq) > return; > } > > - if (write(dev->kickfds[vq->vq_queue_index], &buf, sizeof(buf)) < 0) > - PMD_DRV_LOG(ERR, "failed to kick backend: %s", > - strerror(errno)); > + if (!dev->notify_area_mapped) { > + if (write(dev->kickfds[vq->vq_queue_index], ¬ify_data, > + sizeof(notify_data)) < 0) > + PMD_DRV_LOG(ERR, "failed to kick backend: %s", > + strerror(errno)); > + return; > + } else if (!virtio_with_feature(hw, VIRTIO_F_NOTIFICATION_DATA)) { > + rte_write16(vq->vq_queue_index, vq->notify_addr); > + return; > + } > + > + if (virtio_with_packed_queue(hw)) { > + /* Bit[0:15]: vq queue index > + * Bit[16:30]: avail index > + * Bit[31]: avail wrap counter > + */ > + notify_data = ((uint32_t)(!!(vq->vq_packed.cached_flags & > + VRING_PACKED_DESC_F_AVAIL)) << 31) | > + ((uint32_t)vq->vq_avail_idx << 16) | > + vq->vq_queue_index; > + } else { > + /* Bit[0:15]: vq queue index > + * Bit[16:31]: avail index > + */ > + notify_data = ((uint32_t)vq->vq_avail_idx << 16) | > + vq->vq_queue_index; > + } > + rte_write32(notify_data, vq->notify_addr); > } > > static int > @@ -329,6 +356,8 @@ static const char *valid_args[] = { > VIRTIO_USER_ARG_SPEED, > #define VIRTIO_USER_ARG_VECTORIZED "vectorized" > VIRTIO_USER_ARG_VECTORIZED, > +#define VIRTIO_USER_ARG_NOTIFICATION_DATA "notification_data" > + VIRTIO_USER_ARG_NOTIFICATION_DATA, > NULL > }; > > @@ -480,6 +509,7 @@ virtio_user_pmd_probe(struct rte_vdev_device *vdev) > uint64_t in_order = 1; > uint64_t packed_vq = 0; > uint64_t vectorized = 0; > + uint64_t notification_data = 1; > char *path = NULL; > char *ifname = NULL; > char *mac_addr = NULL; > @@ -637,6 +667,15 @@ virtio_user_pmd_probe(struct rte_vdev_device *vdev) > } > } > > + if (rte_kvargs_count(kvlist, VIRTIO_USER_ARG_NOTIFICATION_DATA) == 1) { > + if (rte_kvargs_process(kvlist, VIRTIO_USER_ARG_NOTIFICATION_DATA, > + &get_integer_arg, ¬ification_data) < 0) { > + PMD_INIT_LOG(ERR, "error to parse %s", > + VIRTIO_USER_ARG_NOTIFICATION_DATA); > + goto end; > + } > + } > + > eth_dev = virtio_user_eth_dev_alloc(vdev); > if (!eth_dev) { > PMD_INIT_LOG(ERR, "virtio_user fails to alloc device"); > @@ -645,9 +684,10 @@ virtio_user_pmd_probe(struct rte_vdev_device *vdev) > > dev = eth_dev->data->dev_private; > hw = &dev->hw; > - if (virtio_user_dev_init(dev, path, (uint16_t)queues, cq, > - queue_size, mac_addr, &ifname, server_mode, > - mrg_rxbuf, in_order, packed_vq, backend_type) < 0) { > + if (virtio_user_dev_init(dev, path, (uint16_t)queues, cq, queue_size, > + mac_addr, &ifname, server_mode, mrg_rxbuf, > + in_order, packed_vq, notification_data, > + backend_type) < 0) { > PMD_INIT_LOG(ERR, "virtio_user_dev_init fails"); > virtio_user_eth_dev_free(eth_dev); > goto end; > @@ -784,4 +824,5 @@ RTE_PMD_REGISTER_PARAM_STRING(net_virtio_user, > "in_order=<0|1> " > "packed_vq=<0|1> " > "speed= " > - "vectorized=<0|1>"); > + "vectorized=<0|1> " > + "notification_data=<0|1> ");