From: Ivan Dyukov <i.dyukov@samsung.com>
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 <i.dyukov@samsung.com>
Subject: [dpdk-dev] [PATCH v5 2/4] net/virtio: add link speed devarg
Date: Thu, 27 Feb 2020 17:16:14 +0300 [thread overview]
Message-ID: <20200227141840.15835-3-i.dyukov@samsung.com> (raw)
In-Reply-To: <20200227141840.15835-1-i.dyukov@samsung.com>
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 <i.dyukov@samsung.com>
---
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;
--
2.17.1
next prev parent reply other threads:[~2020-02-27 14:20 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <CGME20200207112535eucas1p2e333a3f5788b70f6de679332eff266e0@eucas1p2.samsung.com>
2020-02-07 11:25 ` [dpdk-dev] [PATCH v3 1/2] net/virtio: refactor devargs parsing Ivan Dyukov
[not found] ` <CGME20200207112542eucas1p149c88c52b887aab888351eab73fe7639@eucas1p1.samsung.com>
2020-02-07 11:25 ` [dpdk-dev] [PATCH v3 2/2] net/virtio: add link speed devarg Ivan Dyukov
2020-02-12 10:00 ` Maxime Coquelin
2020-02-12 10:35 ` Tiwei Bie
2020-02-12 10:40 ` Maxime Coquelin
2020-02-12 10:47 ` Tiwei Bie
2020-02-13 13:54 ` Maxime Coquelin
2020-02-14 7:59 ` Ivan Dyukov
2020-02-14 12:32 ` Maxime Coquelin
[not found] ` <CGME20200225073054eucas1p26665d3b2fde29eedd264e905ffc643bb@eucas1p2.samsung.com>
2020-02-25 7:28 ` [dpdk-dev] speed devarg for virtio driver Ivan Dyukov
[not found] ` <CGME20200225073100eucas1p19097473ba40bb36c69b42e0479e42a00@eucas1p1.samsung.com>
2020-02-25 7:28 ` [dpdk-dev] [PATCH v4 1/4] net/virtio: refactor devargs parsing Ivan Dyukov
2020-02-26 7:16 ` Ye Xiaolong
[not found] ` <CGME20200225073107eucas1p2255c2df9fb15b1e17b8447b7d88dbf2d@eucas1p2.samsung.com>
2020-02-25 7:28 ` [dpdk-dev] [PATCH v4 2/4] net/virtio: add link speed devarg Ivan Dyukov
2020-02-26 7:55 ` Ye Xiaolong
[not found] ` <CGME20200227142004eucas1p29809efb73784d660f57613374cfdbb55@eucas1p2.samsung.com>
2020-02-27 14:16 ` [dpdk-dev] [PATCH v5 0/4] " Ivan Dyukov
[not found] ` <CGME20200227142018eucas1p1fd60eac2a28295736ee07a3730cb5a53@eucas1p1.samsung.com>
2020-02-27 14:16 ` [dpdk-dev] [PATCH v5 1/4] net/virtio: refactor devargs parsing Ivan Dyukov
2020-03-03 8:42 ` David Marchand
[not found] ` <CGME20200303182901eucas1p2cd9ec41b46d898afdaae50c6a4546785@eucas1p2.samsung.com>
2020-03-03 18:27 ` [dpdk-dev] [PATCH v6 0/4] net/virtio: add link speed devarg Ivan Dyukov
[not found] ` <CGME20200303182903eucas1p2f46d594c58b9add3aa09fa05a7aa037c@eucas1p2.samsung.com>
2020-03-03 18:27 ` [dpdk-dev] [PATCH v6 1/4] net/virtio: refactor devargs parsing Ivan Dyukov
[not found] ` <CGME20200303182905eucas1p2a39607c525e04492db830062b28cedd2@eucas1p2.samsung.com>
2020-03-03 18:27 ` [dpdk-dev] [PATCH v6 2/4] net/virtio: add link speed devarg Ivan Dyukov
[not found] ` <CGME20200303182906eucas1p2a80e3e02c52746e750c743accda56d34@eucas1p2.samsung.com>
2020-03-03 18:27 ` [dpdk-dev] [PATCH v6 3/4] net/virtio-user: fix devargs parsing Ivan Dyukov
[not found] ` <CGME20200303182908eucas1p13a1c21150d9548cf62e3ed7079689270@eucas1p1.samsung.com>
2020-03-03 18:27 ` [dpdk-dev] [PATCH v6 4/4] net/virtio-user: adding link speed devarg Ivan Dyukov
2020-03-04 3:43 ` [dpdk-dev] [PATCH v6 0/4] net/virtio: add " Ye Xiaolong
[not found] ` <CGME20200227142022eucas1p2b3cebb5af8470f715bffe20367226bff@eucas1p2.samsung.com>
2020-02-27 14:16 ` Ivan Dyukov [this message]
[not found] ` <CGME20200227142024eucas1p1e356ee11b8eda65208682b1591e3cc00@eucas1p1.samsung.com>
2020-02-27 14:16 ` [dpdk-dev] [PATCH v5 3/4] net/virtio-user: fix devargs parsing Ivan Dyukov
[not found] ` <CGME20200227142026eucas1p2101b3ca97559c155fc34cfbdec8cbdbc@eucas1p2.samsung.com>
2020-02-27 14:16 ` [dpdk-dev] [PATCH v5 4/4] net/virtio-user: adding link speed devarg Ivan Dyukov
[not found] ` <CGME20200225073110eucas1p2919a401942e01f3710de17730b16d400@eucas1p2.samsung.com>
2020-02-25 7:28 ` [dpdk-dev] [PATCH v4 3/4] net/virtio-user: fix devargs parsing Ivan Dyukov
[not found] ` <CGME20200225073112eucas1p2eb93d3723d3c417f82a2e8e230f79a9a@eucas1p2.samsung.com>
2020-02-25 7:28 ` [dpdk-dev] [PATCH v4 4/4] net/virtio-user: adding link speed devarg Ivan Dyukov
2020-02-12 18:25 ` [dpdk-dev] [PATCH v3 2/2] net/virtio: add " Ivan Dyukov
2020-02-12 9:01 ` [dpdk-dev] [PATCH v3 1/2] net/virtio: refactor devargs parsing Maxime Coquelin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200227141840.15835-3-i.dyukov@samsung.com \
--to=i.dyukov@samsung.com \
--cc=amorenoz@redhat.com \
--cc=dev@dpdk.org \
--cc=maxime.coquelin@redhat.com \
--cc=tiwei.bie@intel.com \
--cc=xiaolong.ye@intel.com \
--cc=zhihong.wang@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).