From patchwork Thu Feb 27 14:16:14 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ivan Dyukov X-Patchwork-Id: 66091 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 3E4C9A055F; Thu, 27 Feb 2020 15:20:31 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id CABEB1BFD3; Thu, 27 Feb 2020 15:20:25 +0100 (CET) Received: from mailout2.w1.samsung.com (mailout2.w1.samsung.com [210.118.77.12]) by dpdk.org (Postfix) with ESMTP id CA1511F1C for ; Thu, 27 Feb 2020 15:20:24 +0100 (CET) Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20200227142024euoutp027f5fc369b23e9cae9dce25bd5855e117~3SD3eyDKP2266022660euoutp029 for ; Thu, 27 Feb 2020 14:20:24 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20200227142024euoutp027f5fc369b23e9cae9dce25bd5855e117~3SD3eyDKP2266022660euoutp029 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1582813224; bh=0prRFzPe9J8TuMkjIkIaK1G//w3sfm9lk3YvbCSucPY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ph9eB+de5rPc3TlfCjIgyjYNJCdvHMjk/aOEpwnx2hn1N0bhAA4SxHrcSpJZ5+VkJ IcdsplbDX6b3OXgRiy18WXpDqfbVHnK+HcX8QdRizhRoHAE/9AgM11yw2Cj4WAr5Dh xCNvrxunTH+iqQ3mqvzEQUHsR2TwDPmbkTMDkqOg= Received: from eusmges2new.samsung.com (unknown [203.254.199.244]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20200227142023eucas1p2c98d78dbf2e87c7495df6307f87f0727~3SD2M3LDd1431114311eucas1p2c; Thu, 27 Feb 2020 14:20:23 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges2new.samsung.com (EUCPMTA) with SMTP id A5.84.60679.720D75E5; Thu, 27 Feb 2020 14:20:23 +0000 (GMT) Received: from eusmtrp2.samsung.com (unknown [182.198.249.139]) by eucas1p2.samsung.com (KnoxPortal) with ESMTPA id 20200227142022eucas1p2b3cebb5af8470f715bffe20367226bff~3SD10ZXJ11637716377eucas1p2O; Thu, 27 Feb 2020 14:20:22 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eusmtrp2.samsung.com (KnoxPortal) with ESMTP id 20200227142022eusmtrp2e00f48706405ae8fc10fb2b55061a8d7~3SD1zv4hp2816928169eusmtrp2E; Thu, 27 Feb 2020 14:20:22 +0000 (GMT) X-AuditID: cbfec7f4-0cbff7000001ed07-5e-5e57d027c853 Received: from eusmtip2.samsung.com ( [203.254.199.222]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id DB.89.08375.620D75E5; Thu, 27 Feb 2020 14:20:22 +0000 (GMT) Received: from idyukov.rnd.samsung.ru (unknown [106.109.129.29]) by eusmtip2.samsung.com (KnoxPortal) with ESMTPA id 20200227142022eusmtip2c1ca722837d314c0f46faffa07d3f7f8~3SD1UAzjA1312413124eusmtip2C; Thu, 27 Feb 2020 14:20:22 +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: Thu, 27 Feb 2020 17:16:14 +0300 Message-Id: <20200227141840.15835-3-i.dyukov@samsung.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200227141840.15835-1-i.dyukov@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrGIsWRmVeSWpSXmKPExsWy7djPc7rqF8LjDJ6d4bZo3fGAxeLdp+1M FrMuNbFbHOvcw2KxteE/k8WfN6YWmy9OYnJg9/i1YCmrx+I9L5k83u+7yubRt2UVYwBLFJdN SmpOZllqkb5dAlfGkkkL2Qr2mlT8XvuTsYHxslYXIweHhICJxP/H6V2MXBxCAisYJbrW9zBB OF8YJaZ872eDcD4zSuxeso61i5ETrGPBjnlQieWMEkueTIVyvjJKPPqzhgmkik1AQ+J0xzyw WSIC7YwSq6a0sIAkmAXUJD70vAezhQUsJSbNOAtmswioSmy+uZwdxOYFind1/YdaJy+xesMB ZhCbU8BKYn7LO0aQoRICr9kkljceY4cocpH4v24XI4QtLPHq+BaouIzE/53zmSDsaonvm66z QzR3MErcW9QKVWQvseX1OXZQcDALaEqs36UPEXaU2H/yFysklPgkbrwVhLifT2LStunMEGFe iY42IYhqJYkDJy9BhSUk/v7mgQh7SLx+8xwapJsZJTo+dDFOYJSfhbBrASPjKkbx1NLi3PTU YqO81HK94sTc4tK8dL3k/NxNjMDUcPrf8S87GHf9STrEKMDBqMTDu2BHeJwQa2JZcWXuIUYJ DmYlEd6NX0PjhHhTEiurUovy44tKc1KLDzFKc7AoifMaL3oZKySQnliSmp2aWpBaBJNl4uCU amBUuvSVb4PPprmZL8sl3piZKChkeqlfUY1WV5r4oYKDw8Qq1VI98IfsM+PgqLbHR/Q+/O2U vyUdfOVABctux7wnaoY7kgRuZWwJd7cXv3/zlKxdGqPpBbd/0kuNOE7YeHPv3qN04dVzPQmX Kys6XmpeK89VXiNm+/mj8V6x+Bs2sQ8+7zqz5L4SS3FGoqEWc1FxIgAllMlLCQMAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrBLMWRmVeSWpSXmKPExsVy+t/xe7pqF8LjDD49MbBo3fGAxeLdp+1M FrMuNbFbHOvcw2KxteE/k8WfN6YWmy9OYnJg9/i1YCmrx+I9L5k83u+7yubRt2UVYwBLlJ5N UX5pSapCRn5xia1StKGFkZ6hpYWekYmlnqGxeayVkamSvp1NSmpOZllqkb5dgl7GkkkL2Qr2 mlT8XvuTsYHxslYXIyeHhICJxIId89i6GLk4hASWMkrsu3INyOEASkhIvH7CDFEjLPHnWhdU zWdGib/v9rKDJNgENCROd8xjAkmICPQzSmz89Rusg1lATeJDz3sWEFtYwFJi0oyzYDaLgKrE 5pvLwZp5geJdXf9ZITbIS6zecACsl1PASmJ+yztGEFtIIF7i4/fz7BMY+RYwMqxiFEktLc5N zy021CtOzC0uzUvXS87P3cQIDNVtx35u3sF4aWPwIUYBDkYlHt4FO8LjhFgTy4orcw8xSnAw K4nwbvwaGifEm5JYWZValB9fVJqTWnyI0RToqInMUqLJ+cA4yiuJNzQ1NLewNDQ3Njc2s1AS 5+0QOBgjJJCeWJKanZpakFoE08fEwSnVwOicemGip8t/ds07u9T+PX7NFtB1cPXWYDkRn9Ux ip8CHv87xLvd+O8yzTijsl+fvO1Zpl/peFO4xdAu68TsiCT90133b21p/PS7a5l2si9D2j3b N1/2hXz/8SHu/v0isfNMZ6VeZyk0ih47dneO6ekNT5/e3edzYO4N6T2qKm/Tz/it2b+973eA EktxRqKhFnNRcSIAGNLfymsCAAA= X-CMS-MailID: 20200227142022eucas1p2b3cebb5af8470f715bffe20367226bff X-Msg-Generator: CA X-RootMTR: 20200227142022eucas1p2b3cebb5af8470f715bffe20367226bff X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20200227142022eucas1p2b3cebb5af8470f715bffe20367226bff References: <20200226075503.GA108150@intel.com> <20200227141840.15835-1-i.dyukov@samsung.com> Subject: [dpdk-dev] [PATCH v5 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 d2c7f8c61..1fc1f1139 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_INIG_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;