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 711F7A0577; Mon, 6 Apr 2020 10:59:30 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id ECD981BEE1; Mon, 6 Apr 2020 10:59:19 +0200 (CEST) Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) by dpdk.org (Postfix) with ESMTP id 092D2F12 for ; Mon, 6 Apr 2020 10:59:18 +0200 (CEST) Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20200406085917euoutp01bedbf78b28eadb33a99d171afa134791~DL1oKbSCb2568625686euoutp01n for ; Mon, 6 Apr 2020 08:59:17 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20200406085917euoutp01bedbf78b28eadb33a99d171afa134791~DL1oKbSCb2568625686euoutp01n DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1586163557; bh=kjCql4u9252iZaMyyvDdJSv8maEhw1BXsfy/eMO+iD0=; h=From:To:Subject:Date:In-Reply-To:References:From; b=LlOtVcmou7ZUxxCmMgHVcvC1TOIX046LlrrYBYtwAhFWthJ+miPaB23gw7mFoaRwo oYIv5Y9WeWqFMhROGMgi6O57Z/feqfBfbj4h4yzyJLx7TwFol6haHcXslOgkTYYiDf oefCYDYnEx0cMiuHXhKQBTsO/U4Oli8bRoqW947M= Received: from eusmges3new.samsung.com (unknown [203.254.199.245]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20200406085917eucas1p2d19aa95ae67bd87941b9b66b04ab134c~DL1n1t4rg3059930599eucas1p2B; Mon, 6 Apr 2020 08:59:17 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges3new.samsung.com (EUCPMTA) with SMTP id 14.56.60698.56FEA8E5; Mon, 6 Apr 2020 09:59:17 +0100 (BST) Received: from eusmtrp1.samsung.com (unknown [182.198.249.138]) by eucas1p1.samsung.com (KnoxPortal) with ESMTPA id 20200406085916eucas1p1e4b9a43f89e63e71aa877adca6046dc4~DL1nOTwM31458014580eucas1p1N; Mon, 6 Apr 2020 08:59:16 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eusmtrp1.samsung.com (KnoxPortal) with ESMTP id 20200406085916eusmtrp141172e0006755435036d54bc9315ed27~DL1nNmLus1258512585eusmtrp1B; Mon, 6 Apr 2020 08:59:16 +0000 (GMT) X-AuditID: cbfec7f5-a29ff7000001ed1a-b0-5e8aef65dfd6 Received: from eusmtip2.samsung.com ( [203.254.199.222]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id 6B.FC.08375.46FEA8E5; Mon, 6 Apr 2020 09:59:16 +0100 (BST) Received: from idyukov.rnd.samsung.ru (unknown [106.109.129.29]) by eusmtip2.samsung.com (KnoxPortal) with ESMTPA id 20200406085915eusmtip21cb8f17e54c97864652b8d617f0a3841~DL1mr6Bl_2530225302eusmtip2W; Mon, 6 Apr 2020 08:59:15 +0000 (GMT) From: Ivan Dyukov To: dev@dpdk.org, maxime.coquelin@redhat.com, i.dyukov@samsung.com, v.kuramshin@samsung.com, amorenoz@redhat.com, zhihong.wang@intel.com, xiaolong.ye@intel.com, mb@smartsharesystems.com Date: Mon, 6 Apr 2020 11:58:00 +0300 Message-Id: <20200406085855.25773-3-i.dyukov@samsung.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200406085855.25773-1-i.dyukov@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrPIsWRmVeSWpSXmKPExsWy7djP87qp77viDLrPM1u07njAYvHu03Ym i1mXmtgtjnXuYbHo+3WV0eL0zc3sFn/emFpsvjiJyYHD49eCpawei/e8ZPJ4v+8qm0ffllWM HqcedTMHsEZx2aSk5mSWpRbp2yVwZSy/c5a1YJ5lxby/MxgbGLfodTFyckgImEh8vXKSrYuR i0NIYAWjRNOLi4wQzhdGiUefXrGDVAkJfGaU+HDXF6Zj0t8l7BBFy4HiC9uYIJyvjBK96zsZ QarYBDQkTnfMYwKxRQT2MkocO1PQxcjOISxgKTHXGCTKIqAqcXTRJVYQmxcoevN5KxPEfHmJ 1RsOMIPYnAJWElP2/GUBGS8h8J5N4uiqZqgiF4lnnxayQtjCEq+Ob2GHsGUkTk/uYYGwqyX2 dL1lh2juYJT42rCVESJhL7Hl9TmgBAcHs4CmxPpd+iCmhICjxJlTThAmn8SNt4IgxcxA5qRt 05khwrwSHW1CEDOUJA6cvAQVlpD4+5sHIuwh8XvRXiZIoO1hlJh9x2QCo9wshE0LGBlXMYqn lhbnpqcWG+ellusVJ+YWl+al6yXn525iBCaD0/+Of93BuO9P0iFGAQ5GJR5ehtudcUKsiWXF lbmHGCU4mJVEeKV6gUK8KYmVValF+fFFpTmpxYcYpTlYlMR5jRe9jBUSSE8sSc1OTS1ILYLJ MnFwSjUwxq9m09Q9LGots9Ju78TGQ6KBLu2ba4wnHla5yDHfTz/Z2t2o+WDlkicvLpzkypL7 /VVK6dqdWZdP9qyquJra1XAiqilC13x5YNSmuzyLvNO27F6RYrQ7nX1/lEqh9xrhiZ1SD7/L 7ah7v06lUFVqX2Ft3t8PFVFeE2T3Bt3PYO26fe/a5wtJSizFGYmGWsxFxYkAKp8kkQIDAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrELMWRmVeSWpSXmKPExsVy+t/xe7op77viDBrWyFm07njAYvHu03Ym i1mXmtgtjnXuYbHo+3WV0eL0zc3sFn/emFpsvjiJyYHD49eCpawei/e8ZPJ4v+8qm0ffllWM HqcedTMHsEbp2RTll5akKmTkF5fYKkUbWhjpGVpa6BmZWOoZGpvHWhmZKunb2aSk5mSWpRbp 2yXoZSy/c5a1YJ5lxby/MxgbGLfodTFyckgImEhM+ruEvYuRi0NIYCmjxMV/Dxi7GDmAEhIS r58wQ9QIS/y51sUGYgsJfGaU6H4qAWKzCWhInO6YxwTSKyJwnFGid9Z/IIedQ1jAUmKuMUgJ i4CqxNFFl1hBbF6g6M3nrUwQI+UlVm84ADaeU8BKYsqevywgW4UEMiQ2PsybwMi7gJFhFaNI amlxbnpusaFecWJucWleul5yfu4mRmB4bjv2c/MOxksbgw8xCnAwKvHwMtzujBNiTSwrrsw9 xCjBwawkwivVCxTiTUmsrEotyo8vKs1JLT7EaAp000RmKdHkfGDs5JXEG5oamltYGpobmxub WSiJ83YIHIwREkhPLEnNTk0tSC2C6WPi4JRqYGzrX8NxP7RYaobJi1tXV3TYT/xg9m356SXZ 7fEG51cYXLrTKX7lklfe5PNxfPUvzRO1TD4sOnfO4LEvx/LZD5P1xdNklryZ9uPa5HN57teC 3tyxlz2zrO63n5vSQuX3L7eWbmzx/MJ51nb+Ut7wbvnyy6+iHtleCl2osbFLkzGpQfuYUvDH GjElluKMREMt5qLiRADfmTIhZQIAAA== X-CMS-MailID: 20200406085916eucas1p1e4b9a43f89e63e71aa877adca6046dc4 X-Msg-Generator: CA Content-Type: text/plain; charset="utf-8" X-RootMTR: 20200406085916eucas1p1e4b9a43f89e63e71aa877adca6046dc4 X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20200406085916eucas1p1e4b9a43f89e63e71aa877adca6046dc4 References: <20191212085012.9170-1-i.dyukov@samsung.com> <20200406085855.25773-1-i.dyukov@samsung.com> Subject: [dpdk-dev] [PATCH v9 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 | 108 ++++++++++++++++++++++++----- drivers/net/virtio/virtio_pci.h | 1 + 3 files changed, 100 insertions(+), 16 deletions(-) diff --git a/doc/guides/nics/virtio.rst b/doc/guides/nics/virtio.rst index d1f5fb898..e579c6aa9 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, in units of 1Mb. + 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..eb46a5a11 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,100 @@ static int vdpa_check_handler(__rte_unused const char *key, return 0; } + +static uint32_t +virtio_dev_speed_capa_get(uint32_t speed) +{ + struct speed_caps { + uint32_t min_speed; + uint32_t speed_capa; + }; + struct speed_caps caps[] = { + {ETH_SPEED_NUM_10M, ETH_LINK_SPEED_10M}, + {ETH_SPEED_NUM_100M, ETH_LINK_SPEED_100M}, + {ETH_SPEED_NUM_1G, ETH_LINK_SPEED_1G}, + {ETH_SPEED_NUM_2_5G, ETH_LINK_SPEED_2_5G}, + {ETH_SPEED_NUM_5G, ETH_LINK_SPEED_5G}, + {ETH_SPEED_NUM_10G, ETH_LINK_SPEED_10G}, + {ETH_SPEED_NUM_20G, ETH_LINK_SPEED_20G}, + {ETH_SPEED_NUM_25G, ETH_LINK_SPEED_25G}, + {ETH_SPEED_NUM_40G, ETH_LINK_SPEED_40G}, + {ETH_SPEED_NUM_50G, ETH_LINK_SPEED_50G}, + {ETH_SPEED_NUM_56G, ETH_LINK_SPEED_56G}, + {ETH_SPEED_NUM_100G, ETH_LINK_SPEED_100G} + }; + const uint32_t caps_size = sizeof(caps) / sizeof(struct speed_caps); + uint32_t speed_capa = ETH_LINK_SPEED_AUTONEG; + if (speed != ETH_SPEED_NUM_UNKNOWN) { + /* find maximum suitable speed capability */ + for (uint32_t i = 0; i < caps_size; i++) { + if (speed >= caps[i].min_speed) + speed_capa = caps[i].speed_capa; + } + } + return speed_capa; +} + + +#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; + errno = 0; + val = strtoul(value, NULL, 0); + /* validate input */ + if (errno != 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 +2083,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 +2462,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 +2517,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