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 C6C59A04E6; Sat, 31 Oct 2020 01:24:33 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id A1275C866; Sat, 31 Oct 2020 01:24:19 +0100 (CET) Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by dpdk.org (Postfix) with ESMTP id 7F9B1C85C for ; Sat, 31 Oct 2020 01:24:16 +0100 (CET) Received: by linux.microsoft.com (Postfix, from userid 1004) id C132A20B4905; Fri, 30 Oct 2020 17:24:14 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com C132A20B4905 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linuxonhyperv.com; s=default; t=1604103854; bh=rNjMLO53gHueU6NoSTPrum764Wk1kvj+hSR1AZW/uWw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bl5+vRJg6uVRfH6am+jfNUaXEIquEyxz/MyuakiPbW/gDnBKd9hv+FBExTBuRbvUU eEtgz6E8wwLjEq7djAhy7yV+jMUychs8pdGwlIkmq7ykGVJOCHJDh5QGf1v4m4kZto mpBjNh09LzjrNnTXYGq1X5JsiD88lcA6J7+06No4= From: Long Li To: Stephen Hemminger Cc: dev@dpdk.org, Long Li Date: Fri, 30 Oct 2020 17:24:09 -0700 Message-Id: <1604103849-15879-2-git-send-email-longli@linuxonhyperv.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1604103849-15879-1-git-send-email-longli@linuxonhyperv.com> References: <1604103849-15879-1-git-send-email-longli@linuxonhyperv.com> Subject: [dpdk-dev] [PATCH V3 2/2] net/netvsc: introduce driver parameter to control the use of external mbuf on receiving data 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" From: Long Li When receiving packets, netvsp puts data in a buffer mapped through UIO. Depending on packet size, netvsc may attach the buffer as an external mbuf. This is not a problem if this mbuf is consumed in the application, and the application can correctly read data out of an external mbuf. However, there are two problems with data in an external mbuf. 1. Due to the limitation of the kernel UIO implementation, physical address of this external buffer is not exposed to the user-mode. If this mbuf is passed to another driver, the other driver is unable to map this buffer to iova. 2. Some DPDK applications are not aware of external mbuf, and may bug when they receive an mbuf with external buffer attached. Introduce a driver parameter "rx_extmbuf_enable" to control if netvsc should use external mbuf for receiving packets. The default value is 0. (netvsc doesn't use external mbuf, it always allocates mbuf and copy data to mbuf) A non-zero value tells netvsc to attach external buffers to mbuf on receiving packets, thus avoid copying memory. Signed-off-by: Long Li --- doc/guides/nics/netvsc.rst | 8 ++++++++ drivers/net/netvsc/hn_ethdev.c | 10 +++++++++- drivers/net/netvsc/hn_rxtx.c | 2 +- drivers/net/netvsc/hn_var.h | 3 +++ 4 files changed, 21 insertions(+), 2 deletions(-) diff --git a/doc/guides/nics/netvsc.rst b/doc/guides/nics/netvsc.rst index 5a68ffa8a..19f9940fe 100644 --- a/doc/guides/nics/netvsc.rst +++ b/doc/guides/nics/netvsc.rst @@ -133,3 +133,11 @@ The user can specify below argument in devargs. set larger than the MTU, then all packets smaller than the chunk size of the VMBus send buffer will be copied; larger packets always have to go as a single direct request. The default value is 512 (bytes). + +#. ``rx_extmbuf_enable``: + The rx_extmbuf_enable is used to control if netvsc should use external + mbuf for receiving packets. The default value is 0. (netvsc doesn't use + external mbuf, it always allocates mbuf and copy received data to mbuf) + A non-zero value tells netvsc to attach external buffers to mbuf on + receiving packets, thus avoid copying memory. Use of external buffers + requires the application is able to read data from external mbuf. diff --git a/drivers/net/netvsc/hn_ethdev.c b/drivers/net/netvsc/hn_ethdev.c index f7a02ef08..49f954305 100644 --- a/drivers/net/netvsc/hn_ethdev.c +++ b/drivers/net/netvsc/hn_ethdev.c @@ -48,6 +48,7 @@ #define NETVSC_ARG_LATENCY "latency" #define NETVSC_ARG_RXBREAK "rx_copybreak" #define NETVSC_ARG_TXBREAK "tx_copybreak" +#define NETVSC_ARG_RX_EXTMBUF_ENABLE "rx_extmbuf_enable" struct hn_xstats_name_off { char name[RTE_ETH_XSTATS_NAME_SIZE]; @@ -164,6 +165,10 @@ static int hn_set_parameter(const char *key, const char *value, void *opaque) hv->tx_copybreak = v; PMD_DRV_LOG(DEBUG, "tx copy break set to %u", hv->tx_copybreak); + } else if (!strcmp(key, NETVSC_ARG_RX_EXTMBUF_ENABLE)) { + hv->rx_extmbuf_enable = v; + PMD_DRV_LOG(DEBUG, "rx extmbuf enable set to %u", + hv->rx_extmbuf_enable); } return 0; @@ -178,6 +183,7 @@ static int hn_parse_args(const struct rte_eth_dev *dev) NETVSC_ARG_LATENCY, NETVSC_ARG_RXBREAK, NETVSC_ARG_TXBREAK, + NETVSC_ARG_RX_EXTMBUF_ENABLE, NULL }; struct rte_kvargs *kvlist; @@ -980,6 +986,7 @@ eth_hn_dev_init(struct rte_eth_dev *eth_dev) hv->latency = HN_CHAN_LATENCY_NS; hv->rx_copybreak = HN_RXCOPY_THRESHOLD; hv->tx_copybreak = HN_TXCOPY_THRESHOLD; + hv->rx_extmbuf_enable = HN_RX_EXTMBUF_ENABLE; hv->max_queues = 1; rte_rwlock_init(&hv->vf_lock); @@ -1140,4 +1147,5 @@ RTE_LOG_REGISTER(hn_logtype_driver, pmd.net.netvsc.driver, NOTICE); RTE_PMD_REGISTER_PARAM_STRING(net_netvsc, NETVSC_ARG_LATENCY "= " NETVSC_ARG_RXBREAK "= " - NETVSC_ARG_TXBREAK "="); + NETVSC_ARG_TXBREAK "= " + NETVSC_ARG_RX_EXTMBUF_ENABLE "=<0|1>"); diff --git a/drivers/net/netvsc/hn_rxtx.c b/drivers/net/netvsc/hn_rxtx.c index ce75b4d09..35c046b1a 100644 --- a/drivers/net/netvsc/hn_rxtx.c +++ b/drivers/net/netvsc/hn_rxtx.c @@ -565,7 +565,7 @@ static void hn_rxpkt(struct hn_rx_queue *rxq, struct hn_rx_bufinfo *rxb, * For large packets, avoid copy if possible but need to keep * some space available in receive area for later packets. */ - if (dlen > hv->rx_copybreak && + if (hv->rx_extmbuf_enable && dlen > hv->rx_copybreak && (uint32_t)rte_atomic32_read(&rxq->rxbuf_outstanding) < hv->rxbuf_section_cnt / 2) { struct rte_mbuf_ext_shared_info *shinfo; diff --git a/drivers/net/netvsc/hn_var.h b/drivers/net/netvsc/hn_var.h index c1bdafb41..9dcb669f7 100644 --- a/drivers/net/netvsc/hn_var.h +++ b/drivers/net/netvsc/hn_var.h @@ -26,6 +26,8 @@ #define HN_TXCOPY_THRESHOLD 512 #define HN_RXCOPY_THRESHOLD 256 +#define HN_RX_EXTMBUF_ENABLE 0 + /* Buffers need to be aligned */ #ifndef PAGE_SIZE #define PAGE_SIZE 4096 @@ -118,6 +120,7 @@ struct hn_data { struct rte_mem_resource *rxbuf_res; /* UIO resource for Rx */ uint32_t rxbuf_section_cnt; /* # of Rx sections */ uint32_t rx_copybreak; + uint32_t rx_extmbuf_enable; uint16_t max_queues; /* Max available queues */ uint16_t num_queues; uint64_t rss_offloads; -- 2.25.1