From patchwork Thu Oct 22 00:26:07 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Long Li X-Patchwork-Id: 81718 X-Patchwork-Delegate: ferruh.yigit@amd.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 88BE4A04DD; Thu, 22 Oct 2020 02:26:17 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 0FFE59AFF; Thu, 22 Oct 2020 02:26:15 +0200 (CEST) Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by dpdk.org (Postfix) with ESMTP id 1A2AF9AFC for ; Thu, 22 Oct 2020 02:26:13 +0200 (CEST) Received: by linux.microsoft.com (Postfix, from userid 1004) id 4524B20B4905; Wed, 21 Oct 2020 17:26:11 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 4524B20B4905 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linuxonhyperv.com; s=default; t=1603326371; bh=Itq7+UBZum9yGH7jBlaBdBkbGd23fTWfk4tcXF5nfkQ=; h=From:To:Cc:Subject:Date:From; b=GxpaY4vgWLpW9iteYIB12ViBI7hT0nEXoeROJe5Bbh9p/JdwPqP248W4Re4xm0eHj aqejmQ77noKj84Zbm86UnMSW1b5rBzg8brBWL2YZq/9h3HJZza5tCzzWfrDe5l32ph JthU88D6E6ugOc9+bOq0rD6VORGVkG8F+gxSxF7E= From: Long Li To: Stephen Hemminger Cc: dev@dpdk.org, Long Li Date: Wed, 21 Oct 2020 17:26:07 -0700 Message-Id: <1603326367-20395-1-git-send-email-longli@linuxonhyperv.com> X-Mailer: git-send-email 1.8.3.1 Subject: [dpdk-dev] [PATCH] net/netvsc: use memzone to allocate contiguous physical mem for rndis 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 sending data, netvsc assumes the tx_rndis buffer is contiguous and calculates physical addresses based on this assumption. Use memzone to allocate tx_rndis so it's guaranteed that this buffer is physically contiguous. Cc:stable@dpdk.org Signed-off-by: Long Li --- drivers/net/netvsc/hn_rxtx.c | 23 ++++++++++++----------- drivers/net/netvsc/hn_var.h | 2 ++ 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/drivers/net/netvsc/hn_rxtx.c b/drivers/net/netvsc/hn_rxtx.c index cea3157ca7..65d0725b16 100644 --- a/drivers/net/netvsc/hn_rxtx.c +++ b/drivers/net/netvsc/hn_rxtx.c @@ -280,10 +280,15 @@ hn_dev_tx_queue_setup(struct rte_eth_dev *dev, PMD_INIT_LOG(DEBUG, "TX descriptor pool %s n=%u size=%zu", name, nb_desc, sizeof(struct hn_txdesc)); - txq->tx_rndis = rte_calloc("hn_txq_rndis", nb_desc, - HN_RNDIS_PKT_ALIGNED, RTE_CACHE_LINE_SIZE); - if (txq->tx_rndis == NULL) + txq->tx_rndis_mz = rte_memzone_reserve_aligned(name, + nb_desc * HN_RNDIS_PKT_ALIGNED, rte_socket_id(), + RTE_MEMZONE_IOVA_CONTIG, HN_RNDIS_PKT_ALIGNED); + if (!txq->tx_rndis_mz) { + err = -rte_errno; goto error; + } + txq->tx_rndis = txq->tx_rndis_mz->addr; + txq->tx_rndis_iova = txq->tx_rndis_mz->iova; txq->txdesc_pool = rte_mempool_create(name, nb_desc, sizeof(struct hn_txdesc), @@ -312,7 +317,7 @@ hn_dev_tx_queue_setup(struct rte_eth_dev *dev, error: if (txq->txdesc_pool) rte_mempool_free(txq->txdesc_pool); - rte_free(txq->tx_rndis); + rte_memzone_free(txq->tx_rndis_mz); rte_free(txq); return err; } @@ -363,7 +368,7 @@ hn_dev_tx_queue_release(void *arg) if (txq->txdesc_pool) rte_mempool_free(txq->txdesc_pool); - rte_free(txq->tx_rndis); + rte_memzone_free(txq->tx_rndis_mz); rte_free(txq); } @@ -1442,12 +1447,8 @@ static int hn_xmit_sg(struct hn_tx_queue *txq, hn_rndis_dump(txd->rndis_pkt); /* pass IOVA of rndis header in first segment */ - addr = rte_malloc_virt2iova(txq->tx_rndis); - if (unlikely(addr == RTE_BAD_IOVA)) { - PMD_DRV_LOG(ERR, "RNDIS transmit can not get iova"); - return -EINVAL; - } - addr = addr + ((char *)txd->rndis_pkt - (char *)txq->tx_rndis); + addr = txq->tx_rndis_iova + + ((char *)txd->rndis_pkt - (char *)txq->tx_rndis); sg[0].page = addr / PAGE_SIZE; sg[0].ofs = addr & PAGE_MASK; diff --git a/drivers/net/netvsc/hn_var.h b/drivers/net/netvsc/hn_var.h index 9dcb669f7a..bd874c6b4d 100644 --- a/drivers/net/netvsc/hn_var.h +++ b/drivers/net/netvsc/hn_var.h @@ -59,7 +59,9 @@ struct hn_tx_queue { uint16_t queue_id; uint32_t free_thresh; struct rte_mempool *txdesc_pool; + const struct rte_memzone *tx_rndis_mz; void *tx_rndis; + rte_iova_t tx_rndis_iova; /* Applied packet transmission aggregation limits. */ uint32_t agg_szmax;