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 E2271A0562; Mon, 30 Mar 2020 09:58:43 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id EDAC41C07C; Mon, 30 Mar 2020 09:58:32 +0200 (CEST) Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) by dpdk.org (Postfix) with ESMTP id DC1FF1C06A for ; Mon, 30 Mar 2020 09:58:30 +0200 (CEST) Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20200330075830euoutp01f8d2fe698bf931a99714ff292c895c88~BBfjla6dW2510925109euoutp01X for ; Mon, 30 Mar 2020 07:58:30 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20200330075830euoutp01f8d2fe698bf931a99714ff292c895c88~BBfjla6dW2510925109euoutp01X DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1585555110; bh=ZbN59GHW4ffE3sG8tYnOAPv/kl6HquKSHf4JmyUTkGE=; h=From:To:Subject:Date:In-Reply-To:References:From; b=jzOEP+pGi5i2FHW8jgJpNbyDqS5kZjvuqGR0euYTyuWAJ/wb+oyE3ICMhnCbdqlnA tQ5eq+iobIKhFHTYjOnIkQyV6aLzpZG4rKHLtWffznhT7KOrZZ4vWGPVb5SVcWXtov YBHW06cZcRbwP8G2ppzaqcGhK4RdeO5dPKm36VIs= Received: from eusmges2new.samsung.com (unknown [203.254.199.244]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20200330075830eucas1p22044bedf12ad0e94586ee29fb74417f3~BBfjWM5DN3036230362eucas1p2x; Mon, 30 Mar 2020 07:58:30 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges2new.samsung.com (EUCPMTA) with SMTP id C2.FE.60679.5A6A18E5; Mon, 30 Mar 2020 08:58:30 +0100 (BST) Received: from eusmtrp1.samsung.com (unknown [182.198.249.138]) by eucas1p1.samsung.com (KnoxPortal) with ESMTPA id 20200330075829eucas1p1b21f029dafd6056b950bdd810fe8458e~BBfjBoaZE3137131371eucas1p1q; Mon, 30 Mar 2020 07:58:29 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eusmtrp1.samsung.com (KnoxPortal) with ESMTP id 20200330075829eusmtrp1563ea5d47f4fd07de1c5e8956d02a581~BBfjBEKXL2812428124eusmtrp1Z; Mon, 30 Mar 2020 07:58:29 +0000 (GMT) X-AuditID: cbfec7f4-0cbff7000001ed07-76-5e81a6a54a26 Received: from eusmtip2.samsung.com ( [203.254.199.222]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id 31.AE.08375.5A6A18E5; Mon, 30 Mar 2020 08:58:29 +0100 (BST) Received: from idyukov.rnd.samsung.ru (unknown [106.109.129.29]) by eusmtip2.samsung.com (KnoxPortal) with ESMTPA id 20200330075829eusmtip2cd1017b94a6387d578323b5b31695834~BBfidxbis0192701927eusmtip2J; Mon, 30 Mar 2020 07:58:29 +0000 (GMT) From: Ivan Dyukov To: dev@dpdk.org, maxime.coquelin@redhat.com, i.dyukov@samsung.com, tiwei.bie@intel.com, amorenoz@redhat.com, zhihong.wang@intel.com, xiaolong.ye@intel.com Date: Mon, 30 Mar 2020 10:57:59 +0300 Message-Id: <20200330075814.6857-3-i.dyukov@samsung.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200330075814.6857-1-i.dyukov@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrNIsWRmVeSWpSXmKPExsWy7djPc7rLljXGGWzuZbRo3fGAxeLdp+1M FrMuNbFbHOvcw2KxteE/k8WfN6YWmy9OYnJg9/i1YCmrx+I9L5k83u+7yubRt2UVYwBLFJdN SmpOZllqkb5dAlfGtl/nmQv2mlScXLeWsYHxslYXIyeHhICJRPun5exdjFwcQgIrGCVW3d/N BuF8YZSY0nKECcL5zCjxfMleZpiW3k0/oKqWM0p0rX4J5XxllHi37iNYFZuAhsTpjnlg7SIC 8xklTvZ8BksIC1hKNG7bywpiswioSvz8eRHM5hWwkDjWthVqhbzE6g0HwGxOoPozE7eCDZIQ uM0m0TBhHwtEkYvEhj/9UA3CEq+Ob2GHsGUkTk/ugaqpltjT9ZYdormDUeJrw1ZGiIS9xJbX 54ASHBzMApoS63fpQ4QdJU59u8AEEpYQ4JO48VYQJMwMZE7aNp0ZIswr0dEmBFGtJHHg5CWo sITE3988EGEPialrfkHDdDejxNT/exknMMrNQti1gJFxFaN4amlxbnpqsVFearlecWJucWle ul5yfu4mRmASOP3v+JcdjLv+JB1iFOBgVOLhnbG1IU6INbGsuDL3EKMEB7OSCC+bP1CINyWx siq1KD++qDQntfgQozQHi5I4r/Gil7FCAumJJanZqakFqUUwWSYOTqkGxgi5vyGGuVsmseq1 BPvk7jxvr977+pdSnRrj5gVGL66qruZ+fDQ0o2RBc1U9F+t9JSVp2bj5R86vsNA1fsj7tFZv nlVlYZLp8jDThDciZ7bsLn31i/H4Kg2DXadSnk3iX6s/41Jre0tZuZalP9+c9vD3b9Icds5e Lbzp+vTZ4Z2BH95Y6T4rUGIpzkg01GIuKk4EAPwAHub+AgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrDLMWRmVeSWpSXmKPExsVy+t/xe7pLlzXGGRydqGnRuuMBi8W7T9uZ LGZdamK3ONa5h8Via8N/Jos/b0wtNl+cxOTA7vFrwVJWj8V7XjJ5vN93lc2jb8sqxgCWKD2b ovzSklSFjPziElulaEMLIz1DSws9IxNLPUNj81grI1MlfTublNSczLLUIn27BL2Mbb/OMxfs Nak4uW4tYwPjZa0uRk4OCQETid5NP9i6GLk4hASWMkoc2HMLyOEASkhIvH7CDFEjLPHnWhdU zWdGiZu3mhlBEmwCGhKnO+YxgSREBJYzSvRfbmUDSQgLWEo0btvLCmKzCKhK/Px5EczmFbCQ ONa2FWqqvMTqDQfAbE6g+jMTtzKB2EIC6RKNtzuYJjDyLmBkWMUoklpanJueW2yoV5yYW1ya l66XnJ+7iREYktuO/dy8g/HSxuBDjAIcjEo8vDO2NsQJsSaWFVfmHmKU4GBWEuFl8wcK8aYk VlalFuXHF5XmpBYfYjQFOmois5Rocj4wXvJK4g1NDc0tLA3Njc2NzSyUxHk7BA7GAJ2RWJKa nZpakFoE08fEwSnVwOjw9YCCLlOFJuOKPf9Ff0ibTDtme7nM9cinG3W6+kmLF7QUPlzgY6bf euLxpquv/ZxOfK17fdrLWveP09Xn5x7Yc978fYtfQ/bN3CazPxsyb22RuLnz2Y2Fz/R+tzud tLZfnmxzWORZaapR7vcogRlbH17Yqabx8ubnM4c+MdWYHJ2z6utEGYtCJZbijERDLeai4kQA AMO6Q18CAAA= X-CMS-MailID: 20200330075829eucas1p1b21f029dafd6056b950bdd810fe8458e X-Msg-Generator: CA Content-Type: text/plain; charset="utf-8" X-RootMTR: 20200330075829eucas1p1b21f029dafd6056b950bdd810fe8458e X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20200330075829eucas1p1b21f029dafd6056b950bdd810fe8458e References: <20191212085012.9170-1-i.dyukov@samsung.com> <20200330075814.6857-1-i.dyukov@samsung.com> Subject: [dpdk-dev] [PATCH v8 2/5] 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 870ff7801..fe0e292ef 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. @@ -1956,6 +1965,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) { @@ -1967,33 +1977,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); @@ -2006,7 +2072,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 7433d2f08..ed98e11c3 100644 --- a/drivers/net/virtio/virtio_pci.h +++ b/drivers/net/virtio/virtio_pci.h @@ -259,6 +259,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