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 933DCA056A; Tue, 3 Mar 2020 19:29:20 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id CE77B1C01E; Tue, 3 Mar 2020 19:29:08 +0100 (CET) Received: from mailout2.w1.samsung.com (mailout2.w1.samsung.com [210.118.77.12]) by dpdk.org (Postfix) with ESMTP id 308861C00D for ; Tue, 3 Mar 2020 19:29:07 +0100 (CET) Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20200303182906euoutp0216f03b6a1eff8048fa8146921901ead0~43rcXxYEr0648806488euoutp02K for ; Tue, 3 Mar 2020 18:29:06 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20200303182906euoutp0216f03b6a1eff8048fa8146921901ead0~43rcXxYEr0648806488euoutp02K DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1583260147; bh=5nZc/m8zxjlfWjEgC7vErVyqdF3f5obuiAOahTkliJE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=AHrze7wJZZpTqAUjgTVYCJMiRLyhPErcaQaj6N5beWw2jZ26k0dhddU9dntxmyaly 0Tbxj4foWH0f0prn+VmHGDBJHgGx/67Vc3eEyJPj4l1Hv8v6du9UVpoZTm9tdqZbPu mON8bEQl4l62Dk1X8vAR9FC20GH4C2jnsiGmFY1s= Received: from eusmges3new.samsung.com (unknown [203.254.199.245]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20200303182905eucas1p1dc2e0581074d2b44fc201b61128a780d~43rbYhFuK0540705407eucas1p1R; Tue, 3 Mar 2020 18:29:05 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges3new.samsung.com (EUCPMTA) with SMTP id 63.C1.60698.1F1AE5E5; Tue, 3 Mar 2020 18:29:05 +0000 (GMT) Received: from eusmtrp2.samsung.com (unknown [182.198.249.139]) by eucas1p2.samsung.com (KnoxPortal) with ESMTPA id 20200303182905eucas1p2a39607c525e04492db830062b28cedd2~43rbKXgux2239622396eucas1p2Y; Tue, 3 Mar 2020 18:29:05 +0000 (GMT) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eusmtrp2.samsung.com (KnoxPortal) with ESMTP id 20200303182905eusmtrp2485ca2bfefd164142f1db7e64fa8f3c9~43rbJzbzK0347103471eusmtrp2k; Tue, 3 Mar 2020 18:29:05 +0000 (GMT) X-AuditID: cbfec7f5-a0fff7000001ed1a-9f-5e5ea1f12462 Received: from eusmtip1.samsung.com ( [203.254.199.221]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id BA.A4.07950.1F1AE5E5; Tue, 3 Mar 2020 18:29:05 +0000 (GMT) Received: from idyukov.rnd.samsung.ru (unknown [106.109.129.29]) by eusmtip1.samsung.com (KnoxPortal) with ESMTPA id 20200303182905eusmtip111b10bcba8c365119a4d89ad47041b61~43raqUM0H0781607816eusmtip1a; Tue, 3 Mar 2020 18:29:05 +0000 (GMT) From: Ivan Dyukov To: dev@dpdk.org, maxime.coquelin@redhat.com, tiwei.bie@intel.com, amorenoz@redhat.com, zhihong.wang@intel.com, xiaolong.ye@intel.com Cc: Ivan Dyukov Date: Tue, 3 Mar 2020 21:27:03 +0300 Message-Id: <20200303182846.26109-3-i.dyukov@samsung.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200303182846.26109-1-i.dyukov@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrKIsWRmVeSWpSXmKPExsWy7djPc7ofF8bFGXQ+MLVo3fGAxeLdp+1M FrMuNbFbHOvcw2KxteE/k8WfN6YWmy9OYnJg9/i1YCmrx+I9L5k83u+7yubRt2UVYwBLFJdN SmpOZllqkb5dAlfGmqcdLAV7TSqOTb3E0sB4WauLkYNDQsBEYvNiri5GLg4hgRWMEj3dL5kg nC+MEhMfvGWHcD4zSmyY0wDkcIJ1zPi7gA0isZxR4sabyVAtXxklzrWcYAWpYhPQkDjdMQ8s ISLQziixakoLC0iCWUBN4kPPezBbWMBS4tmaV2A2i4CqxPKvUxlBjuIFiu9rUofYJi+xesMB ZhCbU8BK4sSdNhaQmRICr9kklm1vY4YocpG4/WgCI4QtLPHq+BaoU2Uk/u+czwRhV0t833Sd HaK5g1Hi3qJWqCJ7iS2vz7GDLGYW0JRYv0sfIuwocXf/UXZIIPFJ3HgrCHE+n8SkbdOZIcK8 Eh1tQhDVShIHTl6CCktI/P3NAxH2kPi64DwrJHiuMEpcWXaRZQKj/CyEXQsYGVcxiqeWFuem pxYb56WW6xUn5haX5qXrJefnbmIEJobT/45/3cG470/SIUYBDkYlHl4Jz7g4IdbEsuLK3EOM EhzMSiK8vpzRcUK8KYmVValF+fFFpTmpxYcYpTlYlMR5jRe9jBUSSE8sSc1OTS1ILYLJMnFw SjUwNsfprc5J/ceSfHfX5Iy7y1dV8bTabL9k863GT/DmheTtFzLcT97ILDy2u8rklVYix/80 439xr5VPtM8Wuzejtlh1yxcZe3Y7W8tpprcf2pYvsPr3tvGKALM7P4dUtHAbT/ntH1eOnlbW N/zifuqr68nvz2vDQ9Zo/ivz8JR+8jgy5VHB8m+FSizFGYmGWsxFxYkAHR+mLAgDAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrBLMWRmVeSWpSXmKPExsVy+t/xu7ofF8bFGay5pm7RuuMBi8W7T9uZ LGZdamK3ONa5h8Via8N/Jos/b0wtNl+cxOTA7vFrwVJWj8V7XjJ5vN93lc2jb8sqxgCWKD2b ovzSklSFjPziElulaEMLIz1DSws9IxNLPUNj81grI1MlfTublNSczLLUIn27BL2MNU87WAr2 mlQcm3qJpYHxslYXIyeHhICJxIy/C9i6GLk4hASWMko03VrB2sXIAZSQkHj9hBmiRljiz7Uu qJrPjBInv3xmB0mwCWhInO6YxwSSEBHoZ5TY+Os3WAezgJrEh573LCC2sIClxLM1r8BsFgFV ieVfpzKCLOAFiu9rUodYIC+xesMBsFZOASuJE3faWCCWNTBKbNi1mGUCI98CRoZVjCKppcW5 6bnFRnrFibnFpXnpesn5uZsYgaG67djPLTsYu94FH2IU4GBU4uGV8IyLE2JNLCuuzD3EKMHB rCTC68sZHSfEm5JYWZValB9fVJqTWnyI0RToqInMUqLJ+cA4yiuJNzQ1NLewNDQ3Njc2s1AS 5+0QOBgjJJCeWJKanZpakFoE08fEwSnVwLjn766MyV/udf866tb7RKLjWd3MJx0xkXcU64Q0 bWxdP23VV5mVwhLjPiM+7DvbU7Zav/Um35zOt+0VEFd64ZXFNUlhgnqpctEnlyXZAg/3P6ic O0N1kZDspgUiFimm+3/Wtse8U5Nza9w2tWXe2U/udXG7T9gcfn8kjufe1Xbx2WxTIy4+UlVi Kc5INNRiLipOBABIlGTmawIAAA== X-CMS-MailID: 20200303182905eucas1p2a39607c525e04492db830062b28cedd2 X-Msg-Generator: CA Content-Type: text/plain; charset="utf-8" X-RootMTR: 20200303182905eucas1p2a39607c525e04492db830062b28cedd2 X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20200303182905eucas1p2a39607c525e04492db830062b28cedd2 References: <20200303182846.26109-1-i.dyukov@samsung.com> Subject: [dpdk-dev] [PATCH v6 2/4] net/virtio: add link speed devarg 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" Some applications like pktgen use link speed to calculate transmission rate. It limits outcome traffic to hardcoded 10G. This patch adds speed devarg which allows to configure link speed of virtio device. Signed-off-by: Ivan Dyukov --- doc/guides/nics/virtio.rst | 7 +++ drivers/net/virtio/virtio_ethdev.c | 97 +++++++++++++++++++++++++----- drivers/net/virtio/virtio_pci.h | 1 + 3 files changed, 89 insertions(+), 16 deletions(-) diff --git a/doc/guides/nics/virtio.rst b/doc/guides/nics/virtio.rst index d1f5fb898..0341907ef 100644 --- a/doc/guides/nics/virtio.rst +++ b/doc/guides/nics/virtio.rst @@ -356,6 +356,13 @@ Below devargs are supported by the PCI virtio driver: a virtio device needs to work in vDPA mode. (Default: 0 (disabled)) +#. ``speed``: + + It is used to specify link speed of virtio device. Link speed is a part of + link status structure. It could be requested by application using + rte_eth_link_get_nowait function. + (Default: 10000 (10G)) + Below devargs are supported by the virtio-user vdev: #. ``path``: diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index f814aa926..24fed9966 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -45,6 +45,10 @@ static int virtio_dev_promiscuous_enable(struct rte_eth_dev *dev); static int virtio_dev_promiscuous_disable(struct rte_eth_dev *dev); static int virtio_dev_allmulticast_enable(struct rte_eth_dev *dev); static int virtio_dev_allmulticast_disable(struct rte_eth_dev *dev); +static uint32_t virtio_dev_speed_capa_get(uint32_t speed); +static int virtio_dev_devargs_parse(struct rte_devargs *devargs, + int *vdpa, + uint32_t *speed); static int virtio_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info); static int virtio_dev_link_update(struct rte_eth_dev *dev, @@ -1861,6 +1865,7 @@ int eth_virtio_dev_init(struct rte_eth_dev *eth_dev) { struct virtio_hw *hw = eth_dev->data->dev_private; + uint32_t speed = ETH_SPEED_NUM_10G; int ret; if (sizeof(struct virtio_net_hdr_mrg_rxbuf) > RTE_PKTMBUF_HEADROOM) { @@ -1886,7 +1891,11 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev) return 0; } - + ret = virtio_dev_devargs_parse(eth_dev->device->devargs, + NULL, &speed); + if (ret < 0) + return ret; + hw->speed = speed; /* * Pass the information to the rte_eth_dev_close() that it should also * release the private port resources. @@ -1954,6 +1963,7 @@ eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev) return 0; } + static int vdpa_check_handler(__rte_unused const char *key, const char *value, void *ret_val) { @@ -1965,33 +1975,89 @@ static int vdpa_check_handler(__rte_unused const char *key, return 0; } + +static uint32_t +virtio_dev_speed_capa_get(uint32_t speed) +{ + switch (speed) { + case ETH_SPEED_NUM_10G: + return ETH_LINK_SPEED_10G; + case ETH_SPEED_NUM_20G: + return ETH_LINK_SPEED_20G; + case ETH_SPEED_NUM_25G: + return ETH_LINK_SPEED_25G; + case ETH_SPEED_NUM_40G: + return ETH_LINK_SPEED_40G; + case ETH_SPEED_NUM_50G: + return ETH_LINK_SPEED_50G; + case ETH_SPEED_NUM_56G: + return ETH_LINK_SPEED_56G; + case ETH_SPEED_NUM_100G: + return ETH_LINK_SPEED_100G; + default: + return 0; + } +} + + +#define VIRTIO_ARG_SPEED "speed" +#define VIRTIO_ARG_VDPA "vdpa" + + +static int +link_speed_handler(const char *key __rte_unused, + const char *value, void *ret_val) +{ + uint32_t val; + if (!value || !ret_val) + return -EINVAL; + val = strtoul(value, NULL, 0); + /* validate input */ + if (virtio_dev_speed_capa_get(val) == 0) + return -EINVAL; + *(uint32_t *)ret_val = val; + + return 0; +} + + static int -virtio_dev_devargs_parse(struct rte_devargs *devargs, int *vdpa) +virtio_dev_devargs_parse(struct rte_devargs *devargs, int *vdpa, + uint32_t *speed) { struct rte_kvargs *kvlist; - const char *key = "vdpa"; int ret = 0; if (devargs == NULL) return 0; kvlist = rte_kvargs_parse(devargs->args, NULL); - if (kvlist == NULL) + if (kvlist == NULL) { + PMD_INIT_LOG(ERR, "error when parsing param"); return 0; - - if (!rte_kvargs_count(kvlist, key)) - goto exit; - - if (vdpa) { + } + if (vdpa && rte_kvargs_count(kvlist, VIRTIO_ARG_VDPA) == 1) { /* vdpa mode selected when there's a key-value pair: * vdpa=1 */ - ret = rte_kvargs_process(kvlist, key, + ret = rte_kvargs_process(kvlist, VIRTIO_ARG_VDPA, vdpa_check_handler, vdpa); - if (ret < 0) + if (ret < 0) { + PMD_INIT_LOG(ERR, "Failed to parse %s", + VIRTIO_ARG_VDPA); goto exit; + } + } + if (speed && rte_kvargs_count(kvlist, VIRTIO_ARG_SPEED) == 1) { + ret = rte_kvargs_process(kvlist, + VIRTIO_ARG_SPEED, + link_speed_handler, speed); + if (ret < 0) { + PMD_INIT_LOG(ERR, "Failed to parse %s", + VIRTIO_ARG_SPEED); + goto exit; + } } - exit: rte_kvargs_free(kvlist); @@ -2004,7 +2070,7 @@ static int eth_virtio_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, int vdpa = 0; int ret = 0; - ret = virtio_dev_devargs_parse(pci_dev->device.devargs, &vdpa); + ret = virtio_dev_devargs_parse(pci_dev->device.devargs, &vdpa, NULL); if (ret < 0) { PMD_INIT_LOG(ERR, "devargs parsing is failed"); return ret; @@ -2385,7 +2451,7 @@ virtio_dev_link_update(struct rte_eth_dev *dev, __rte_unused int wait_to_complet memset(&link, 0, sizeof(link)); link.link_duplex = ETH_LINK_FULL_DUPLEX; - link.link_speed = ETH_SPEED_NUM_10G; + link.link_speed = hw->speed; link.link_autoneg = ETH_LINK_FIXED; if (!hw->started) { @@ -2440,8 +2506,7 @@ virtio_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info) { uint64_t tso_mask, host_features; struct virtio_hw *hw = dev->data->dev_private; - - dev_info->speed_capa = ETH_LINK_SPEED_10G; /* fake value */ + dev_info->speed_capa = virtio_dev_speed_capa_get(hw->speed); dev_info->max_rx_queues = RTE_MIN(hw->max_queue_pairs, VIRTIO_MAX_RX_QUEUES); diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h index a38cb45ad..59012d55a 100644 --- a/drivers/net/virtio/virtio_pci.h +++ b/drivers/net/virtio/virtio_pci.h @@ -253,6 +253,7 @@ struct virtio_hw { uint16_t port_id; uint8_t mac_addr[RTE_ETHER_ADDR_LEN]; uint32_t notify_off_multiplier; + uint32_t speed; /* link speed in MB */ uint8_t *isr; uint16_t *notify_base; struct virtio_pci_common_cfg *common_cfg; -- 2.17.1