From patchwork Wed Mar 17 20:25:29 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ilya Maximets X-Patchwork-Id: 89414 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 7AC46A0561; Wed, 17 Mar 2021 21:26:06 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 4D671140F6F; Wed, 17 Mar 2021 21:25:54 +0100 (CET) Received: from relay3-d.mail.gandi.net (relay3-d.mail.gandi.net [217.70.183.195]) by mails.dpdk.org (Postfix) with ESMTP id 74FE0140F6D for ; Wed, 17 Mar 2021 21:25:53 +0100 (CET) X-Originating-IP: 78.45.89.65 Received: from im-t490s.redhat.com (ip-78-45-89-65.net.upcbroadband.cz [78.45.89.65]) (Authenticated sender: i.maximets@ovn.org) by relay3-d.mail.gandi.net (Postfix) with ESMTPSA id 118F460005; Wed, 17 Mar 2021 20:25:51 +0000 (UTC) From: Ilya Maximets To: Maxime Coquelin Cc: Chenbo Xia , dev@dpdk.org, Adrian Moreno , Stefan Hajnoczi , Julia Suvorova , Ilya Maximets Date: Wed, 17 Mar 2021 21:25:29 +0100 Message-Id: <20210317202530.4145673-4-i.maximets@ovn.org> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210317202530.4145673-1-i.maximets@ovn.org> References: <20210317202530.4145673-1-i.maximets@ovn.org> MIME-Version: 1.0 Subject: [dpdk-dev] [RFC 3/4] net/vhost: add support for SocketPair Broker 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 Sender: "dev" New configuration option "broker-key" to identify that "iface" points to the socket of SocketPair Broker and provide the pairing key. Some functions inside rte_eth_vhost.c are using socket path as a unique identifier, but that is not true. Simply concatinating key to iface name to avoid big code refactoring. And vhost library already expects the socket path in this format. Ex.: --vdev="eth_vhost0,iface=./one.socket,broker-key=mykey,client=1" Signed-off-by: Ilya Maximets --- doc/guides/nics/vhost.rst | 5 ++++ drivers/net/vhost/rte_eth_vhost.c | 42 +++++++++++++++++++++++++------ 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/doc/guides/nics/vhost.rst b/doc/guides/nics/vhost.rst index ee802ec4a8..1e6b8464c7 100644 --- a/doc/guides/nics/vhost.rst +++ b/doc/guides/nics/vhost.rst @@ -34,6 +34,11 @@ The user can specify below arguments in `--vdev` option. It is used to specify a path to connect to a QEMU virtio-net device. +#. ``broker-key``: + + It is used to specify that ``iface`` points to a SocketPair Broker and + value is used as a pairing key. + #. ``queues``: It is used to specify the number of queues virtio-net device has. diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c index d198fc8a8e..1b0ca47b47 100644 --- a/drivers/net/vhost/rte_eth_vhost.c +++ b/drivers/net/vhost/rte_eth_vhost.c @@ -27,6 +27,7 @@ RTE_LOG_REGISTER(vhost_logtype, pmd.net.vhost, NOTICE); enum {VIRTIO_RXQ, VIRTIO_TXQ, VIRTIO_QNUM}; #define ETH_VHOST_IFACE_ARG "iface" +#define ETH_VHOST_BROKER_KEY_ARG "broker-key" #define ETH_VHOST_QUEUES_ARG "queues" #define ETH_VHOST_CLIENT_ARG "client" #define ETH_VHOST_IOMMU_SUPPORT "iommu-support" @@ -38,6 +39,7 @@ enum {VIRTIO_RXQ, VIRTIO_TXQ, VIRTIO_QNUM}; static const char *valid_arguments[] = { ETH_VHOST_IFACE_ARG, + ETH_VHOST_BROKER_KEY_ARG, ETH_VHOST_QUEUES_ARG, ETH_VHOST_CLIENT_ARG, ETH_VHOST_IOMMU_SUPPORT, @@ -104,6 +106,7 @@ struct vhost_queue { struct pmd_internal { rte_atomic32_t dev_attached; char *iface_name; + char *broker_key; uint64_t flags; uint64_t disable_flags; uint16_t max_queues; @@ -1403,14 +1406,15 @@ static const struct eth_dev_ops ops = { static int eth_dev_vhost_create(struct rte_vdev_device *dev, char *iface_name, - int16_t queues, const unsigned int numa_node, uint64_t flags, - uint64_t disable_flags) + char *broker_key, int16_t queues, const unsigned int numa_node, + uint64_t flags, uint64_t disable_flags) { const char *name = rte_vdev_device_name(dev); struct rte_eth_dev_data *data; struct pmd_internal *internal = NULL; struct rte_eth_dev *eth_dev = NULL; struct rte_ether_addr *eth_addr = NULL; + int iface_name_len, name_len; VHOST_LOG(INFO, "Creating VHOST-USER backend on numa socket %u\n", numa_node); @@ -1434,11 +1438,22 @@ eth_dev_vhost_create(struct rte_vdev_device *dev, char *iface_name, * - and point eth_dev structure to new eth_dev_data structure */ internal = eth_dev->data->dev_private; - internal->iface_name = rte_malloc_socket(name, strlen(iface_name) + 1, + + iface_name_len = strlen(iface_name); + name_len = iface_name_len; + if (broker_key) + name_len += strlen(broker_key) + 12; + + internal->iface_name = rte_malloc_socket(name, name_len + 1, 0, numa_node); if (internal->iface_name == NULL) goto error; + strcpy(internal->iface_name, iface_name); + if (broker_key) { + strcpy(internal->iface_name + iface_name_len, ",broker-key="); + strcpy(internal->iface_name + iface_name_len + 12, broker_key); + } data->nb_rx_queues = queues; data->nb_tx_queues = queues; @@ -1471,14 +1486,14 @@ eth_dev_vhost_create(struct rte_vdev_device *dev, char *iface_name, } static inline int -open_iface(const char *key __rte_unused, const char *value, void *extra_args) +open_str(const char *key __rte_unused, const char *value, void *extra_args) { - const char **iface_name = extra_args; + const char **str = extra_args; if (value == NULL) return -1; - *iface_name = value; + *str = value; return 0; } @@ -1504,6 +1519,7 @@ rte_pmd_vhost_probe(struct rte_vdev_device *dev) struct rte_kvargs *kvlist = NULL; int ret = 0; char *iface_name; + char *broker_key = NULL; uint16_t queues; uint64_t flags = 0; uint64_t disable_flags = 0; @@ -1540,7 +1556,7 @@ rte_pmd_vhost_probe(struct rte_vdev_device *dev) if (rte_kvargs_count(kvlist, ETH_VHOST_IFACE_ARG) == 1) { ret = rte_kvargs_process(kvlist, ETH_VHOST_IFACE_ARG, - &open_iface, &iface_name); + &open_str, &iface_name); if (ret < 0) goto out_free; } else { @@ -1548,6 +1564,16 @@ rte_pmd_vhost_probe(struct rte_vdev_device *dev) goto out_free; } + if (rte_kvargs_count(kvlist, ETH_VHOST_BROKER_KEY_ARG) == 1) { + ret = rte_kvargs_process(kvlist, ETH_VHOST_BROKER_KEY_ARG, + &open_str, &broker_key); + if (ret < 0) + goto out_free; + + if (broker_key) + flags |= RTE_VHOST_USER_SOCKETPAIR_BROKER; + } + if (rte_kvargs_count(kvlist, ETH_VHOST_QUEUES_ARG) == 1) { ret = rte_kvargs_process(kvlist, ETH_VHOST_QUEUES_ARG, &open_int, &queues); @@ -1625,7 +1651,7 @@ rte_pmd_vhost_probe(struct rte_vdev_device *dev) if (dev->device.numa_node == SOCKET_ID_ANY) dev->device.numa_node = rte_socket_id(); - ret = eth_dev_vhost_create(dev, iface_name, queues, + ret = eth_dev_vhost_create(dev, iface_name, broker_key, queues, dev->device.numa_node, flags, disable_flags); if (ret == -1) VHOST_LOG(ERR, "Failed to create %s\n", name);