From patchwork Thu Jun 7 09:26:12 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 40707 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 113B71B021; Thu, 7 Jun 2018 11:26:36 +0200 (CEST) Received: from mx1.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by dpdk.org (Postfix) with ESMTP id 3EE861B018 for ; Thu, 7 Jun 2018 11:26:34 +0200 (CEST) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9A10579D36; Thu, 7 Jun 2018 09:26:33 +0000 (UTC) Received: from localhost.localdomain (ovpn-112-46.ams2.redhat.com [10.36.112.46]) by smtp.corp.redhat.com (Postfix) with ESMTP id 19AB520357CA; Thu, 7 Jun 2018 09:26:31 +0000 (UTC) From: Maxime Coquelin To: zhihong.wang@intel.com, tiwei.bie@intel.com, dev@dpdk.org Cc: Maxime Coquelin Date: Thu, 7 Jun 2018 11:26:12 +0200 Message-Id: <20180607092616.27720-2-maxime.coquelin@redhat.com> In-Reply-To: <20180607092616.27720-1-maxime.coquelin@redhat.com> References: <20180607092616.27720-1-maxime.coquelin@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.2]); Thu, 07 Jun 2018 09:26:33 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.2]); Thu, 07 Jun 2018 09:26:33 +0000 (UTC) for IP:'10.11.54.6' DOMAIN:'int-mx06.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'maxime.coquelin@redhat.com' RCPT:'' Subject: [dpdk-dev] [PATCH v3 1/5] net/virtio: forbid simple Tx path by default 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" Simple Tx path is not compliant with the Virtio specification, as it assumes the device will use the descriptors in order. VIRTIO_F_IN_ORDER feature has been introduced recently, but the simple Tx path is not compliant with it as VIRTIO_F_IN_ORDER requires that chained descriptors are used sequentially, which is not the case in simple Tx path. This patch introduces 'simple_tx_support' devarg to unlock Tx simple path selection. Reported-by: Tiwei Bie Signed-off-by: Maxime Coquelin --- doc/guides/nics/virtio.rst | 9 +++++ drivers/net/virtio/virtio_ethdev.c | 73 +++++++++++++++++++++++++++++++++++++- drivers/net/virtio/virtio_pci.h | 1 + 3 files changed, 82 insertions(+), 1 deletion(-) diff --git a/doc/guides/nics/virtio.rst b/doc/guides/nics/virtio.rst index 8922f9c0b..53ce1c12a 100644 --- a/doc/guides/nics/virtio.rst +++ b/doc/guides/nics/virtio.rst @@ -222,6 +222,9 @@ Tx callbacks: #. ``virtio_xmit_pkts_simple``: Vector version fixes the available ring indexes to optimize performance. + This implementation does not comply with the Virtio specification, and so + is not selectable by default. "simple_tx_support=1" devarg must be passed + to unlock it. By default, the non-vector callbacks are used: @@ -331,3 +334,9 @@ The user can specify below argument in devargs. driver, and works as a HW vhost backend. This argument is used to specify a virtio device needs to work in vDPA mode. (Default: 0 (disabled)) + +#. ``simple_tx_support``: + + This argument enables support for the simple Tx path, which is not + compliant with the Virtio specification. + (Default: 0 (disabled)) diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index 5833dad73..052dd056a 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -1331,6 +1331,8 @@ set_rxtx_funcs(struct rte_eth_dev *eth_dev) if (hw->use_simple_tx) { PMD_INIT_LOG(INFO, "virtio: using simple Tx path on port %u", eth_dev->data->port_id); + PMD_INIT_LOG(WARNING, + "virtio: simple Tx path does not comply with Virtio spec"); eth_dev->tx_pkt_burst = virtio_xmit_pkts_simple; } else { PMD_INIT_LOG(INFO, "virtio: using standard Tx path on port %u", @@ -1790,6 +1792,66 @@ rte_virtio_pmd_init(void) rte_pci_register(&rte_virtio_pmd); } +#define VIRTIO_SIMPLE_TX_SUPPORT "simple_tx_support" + +static int virtio_dev_args_check(const char *key, const char *val, + void *opaque) +{ + struct rte_eth_dev *dev = opaque; + struct virtio_hw *hw = dev->data->dev_private; + unsigned long tmp; + int ret = 0; + + errno = 0; + tmp = strtoul(val, NULL, 0); + if (errno) { + PMD_INIT_LOG(INFO, + "%s: \"%s\" is not a valid integer", key, val); + return errno; + } + + if (strcmp(VIRTIO_SIMPLE_TX_SUPPORT, key) == 0) + hw->support_simple_tx = !!tmp; + + return ret; +} + +static int +virtio_dev_args(struct rte_eth_dev *dev) +{ + struct rte_kvargs *kvlist; + struct rte_devargs *devargs; + const char *valid_args[] = { + VIRTIO_SIMPLE_TX_SUPPORT, + NULL, + }; + int ret; + int i; + + devargs = dev->device->devargs; + if (!devargs) + return 0; /* return success */ + + kvlist = rte_kvargs_parse(devargs->args, NULL); + if (kvlist == NULL) + return -EINVAL; + + /* Process parameters. */ + for (i = 0; valid_args[i] != NULL; i++) { + if (rte_kvargs_count(kvlist, valid_args[i])) { + ret = rte_kvargs_process(kvlist, valid_args[i], + virtio_dev_args_check, dev); + if (ret) { + rte_kvargs_free(kvlist); + return ret; + } + } + } + rte_kvargs_free(kvlist); + + return 0; +} + /* * Configure virtio device * It returns 0 on success. @@ -1804,6 +1866,10 @@ virtio_dev_configure(struct rte_eth_dev *dev) int ret; PMD_INIT_LOG(DEBUG, "configure"); + + if (virtio_dev_args(dev)) + return -ENOTSUP; + req_features = VIRTIO_PMD_DEFAULT_GUEST_FEATURES; if (dev->data->dev_conf.intr_conf.rxq) { @@ -1869,7 +1935,12 @@ virtio_dev_configure(struct rte_eth_dev *dev) rte_spinlock_init(&hw->state_lock); hw->use_simple_rx = 1; - hw->use_simple_tx = 1; + /* + * Simple Tx does not comply with Virtio spec, + * "simple_tx_support=1" devarg needs to be passed + * to unlock it. + */ + hw->use_simple_tx = hw->support_simple_tx; #if defined RTE_ARCH_ARM64 || defined RTE_ARCH_ARM if (!rte_cpu_get_flag_enabled(RTE_CPUFLAG_NEON)) { diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h index a28ba8339..7318bb318 100644 --- a/drivers/net/virtio/virtio_pci.h +++ b/drivers/net/virtio/virtio_pci.h @@ -231,6 +231,7 @@ struct virtio_hw { uint8_t vlan_strip; uint8_t use_msix; uint8_t modern; + uint8_t support_simple_tx; uint8_t use_simple_rx; uint8_t use_simple_tx; uint16_t port_id;