From patchwork Thu Sep 28 11:50:30 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Amit Prakash Shukla X-Patchwork-Id: 132136 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id F134A42660; Thu, 28 Sep 2023 13:50:51 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id E10CD4067C; Thu, 28 Sep 2023 13:50:51 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by mails.dpdk.org (Postfix) with ESMTP id EBB1D4067A for ; Thu, 28 Sep 2023 13:50:49 +0200 (CEST) Received: from pps.filterd (m0045849.ppops.net [127.0.0.1]) by mx0a-0016f401.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 38SAfadu003447; Thu, 28 Sep 2023 04:50:49 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-type : content-transfer-encoding; s=pfpt0220; bh=+qfTMb8aeuHqwF2ZgY9M3jbiLADqU5SXM67lqQu3oYA=; b=hzaMrC4f3KXVNrErdrS5KNw/MW/1bn8SZgoDHvfI5T7Dm4uaoYHaAQgRGrPodrP3DHSu I/5cLpka32Ti4GfO8FS7zT22Ph+sCZcXHGjgB2k+bboK/8jcTChqSQuPmZVWooynibn5 I8yjE5hNDsFFeUgKOYe9boZJOfh4R5Ol78qQTdCzPH3VxbcdeXlwR6OAhdSqnVlRwpOK H99GJJNCsRFBpih2zTLMxAxLO/gWEj9jxBYXe2rAI1RSEKzRXO18kV94PXlAqnEIJHmw aTrurC/4UwnR6CwOLprCPSi2YkDn/QJulRb0z+rCAbvT+zgMWV6ZBkkP1V6Nqw5tMVbH /A== Received: from dc5-exch02.marvell.com ([199.233.59.182]) by mx0a-0016f401.pphosted.com (PPS) with ESMTPS id 3td7y6r5vr-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Thu, 28 Sep 2023 04:50:48 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server (TLS) id 15.0.1497.48; Thu, 28 Sep 2023 04:50:47 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.48 via Frontend Transport; Thu, 28 Sep 2023 04:50:47 -0700 Received: from localhost.localdomain (unknown [10.28.36.157]) by maili.marvell.com (Postfix) with ESMTP id 1F8DF5C68EF; Thu, 28 Sep 2023 04:50:42 -0700 (PDT) From: Amit Prakash Shukla To: Chengwen Feng , Kevin Laatz , Bruce Richardson CC: , , , , , , , , , , , Amit Prakash Shukla Subject: [PATCH v3 1/2] dmadev: offload to free source buffer Date: Thu, 28 Sep 2023 17:20:30 +0530 Message-ID: <20230928115031.259592-2-amitprakashs@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230928115031.259592-1-amitprakashs@marvell.com> References: <20230926121747.4037154-1-amitprakashs@marvell.com> <20230928115031.259592-1-amitprakashs@marvell.com> MIME-Version: 1.0 X-Proofpoint-ORIG-GUID: cB1WB_ZGkJrfHJjAmeqJafZ59OVR5ffr X-Proofpoint-GUID: cB1WB_ZGkJrfHJjAmeqJafZ59OVR5ffr X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.267,Aquarius:18.0.980,Hydra:6.0.619,FMLib:17.11.176.26 definitions=2023-09-28_10,2023-09-28_01,2023-05-22_02 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org This changeset adds support in DMA library to free source DMA buffer by hardware. On a supported hardware, application can pass on the mempool information as part of vchan config when the DMA transfer direction is configured as RTE_DMA_DIR_MEM_TO_DEV. Signed-off-by: Amit Prakash Shukla Acked-by: Morten Brørup Acked-by: Anoob Joseph --- lib/dmadev/rte_dmadev.h | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/lib/dmadev/rte_dmadev.h b/lib/dmadev/rte_dmadev.h index b157ab7600..f7a6af2528 100644 --- a/lib/dmadev/rte_dmadev.h +++ b/lib/dmadev/rte_dmadev.h @@ -278,6 +278,13 @@ int16_t rte_dma_next_dev(int16_t start_dev_id); #define RTE_DMA_CAPA_OPS_COPY_SG RTE_BIT64(33) /** Support fill operation. */ #define RTE_DMA_CAPA_OPS_FILL RTE_BIT64(34) +/** Support for source buffer free for mem to dev transfer. + * + * @note Even though the DMA driver has this capability, it may not support all + * mempool drivers. If the mempool is not supported by the DMA driver, + * rte_dma_vchan_setup() will fail. + **/ +#define RTE_DMA_CAPA_MEM_TO_DEV_SOURCE_BUFFER_FREE RTE_BIT64(35) /**@}*/ /** @@ -581,6 +588,19 @@ struct rte_dma_vchan_conf { * @see struct rte_dma_port_param */ struct rte_dma_port_param dst_port; + /** Mempool from which source buffer is allocated. Mempool info is used + * for freeing source buffer by hardware when configured direction is + * RTE_DMA_DIR_MEM_TO_DEV. To free the source buffer by hardware, + * RTE_DMA_OP_FLAG_FREE_SBUF must be set while calling rte_dma_copy and + * rte_dma_copy_sg(). + * + * @note If the mempool is not supported by the DMA device, + * rte_dma_vchan_setup() will fail. + * + * @see RTE_DMA_OP_FLAG_FREE_SBUF + */ + struct rte_mempool *mem_to_dev_src_buf_pool; + }; /** @@ -818,6 +838,13 @@ struct rte_dma_sge { * capability bit for this, driver should not return error if this flag was set. */ #define RTE_DMA_OP_FLAG_LLC RTE_BIT64(2) +/** Mem to dev source buffer free flag. + * Used for freeing source DMA buffer by hardware when the transfer direction is + * configured as RTE_DMA_DIR_MEM_TO_DEV. + * + * @see struct rte_dma_vchan_conf::mem_to_dev_src_buf_pool + */ +#define RTE_DMA_OP_FLAG_FREE_SBUF RTE_BIT64(3) /**@}*/ /** From patchwork Thu Sep 28 11:50:31 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amit Prakash Shukla X-Patchwork-Id: 132137 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 2FED842660; Thu, 28 Sep 2023 13:51:02 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 1E944406B7; Thu, 28 Sep 2023 13:51:02 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by mails.dpdk.org (Postfix) with ESMTP id 840C1406B6 for ; Thu, 28 Sep 2023 13:51:00 +0200 (CEST) Received: from pps.filterd (m0045851.ppops.net [127.0.0.1]) by mx0b-0016f401.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 38SA9rxY012961; Thu, 28 Sep 2023 04:50:59 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding : content-type; s=pfpt0220; bh=9AKKr9K5y9gtSOia2J71zIpoG9t7t79YzgT0y6Rf8do=; b=fari5PdZWT+KH338A0x3M1RL7eJpc/Ug6514FDu9HjPGsQJjwzdOoxev15dTP7brtcLO 1UnbaYESHWwfTfq+2huhJsPoOJ/wHlQbUB3W5bRKwfBUmYlT2DqK7D4EDqAzU63+nxyg U+8wt5fHwadYIowBsftooBZS8TN2VZEd2geBLFWVMsM/s6Iv5h20TbjHG27Mz9fUpHGl 8yf9tNQqz8e6A1pcAcEXhZTujFmM2unWCcPB5IBG0wEy1XVSWgiJgxyYbOH6s5RmAo3E T0apQeUhh05ZpNucn5N0sUhC1QNCi515vRDC8cFSR7tIMdPmQImncH0YILWLXgo16D8A Aw== Received: from dc5-exch02.marvell.com ([199.233.59.182]) by mx0b-0016f401.pphosted.com (PPS) with ESMTPS id 3tcrrs3apv-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Thu, 28 Sep 2023 04:50:59 -0700 Received: from DC5-EXCH01.marvell.com (10.69.176.38) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server (TLS) id 15.0.1497.48; Thu, 28 Sep 2023 04:50:57 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server id 15.0.1497.48 via Frontend Transport; Thu, 28 Sep 2023 04:50:57 -0700 Received: from localhost.localdomain (unknown [10.28.36.157]) by maili.marvell.com (Postfix) with ESMTP id 5CE6A5C68EE; Thu, 28 Sep 2023 04:50:53 -0700 (PDT) From: Amit Prakash Shukla To: Chengwen Feng , Kevin Laatz , Bruce Richardson CC: , , , , , , , , , , , Amit Prakash Shukla Subject: [PATCH v3 2/2] test/dma: add source buffer offload free test Date: Thu, 28 Sep 2023 17:20:31 +0530 Message-ID: <20230928115031.259592-3-amitprakashs@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230928115031.259592-1-amitprakashs@marvell.com> References: <20230926121747.4037154-1-amitprakashs@marvell.com> <20230928115031.259592-1-amitprakashs@marvell.com> MIME-Version: 1.0 X-Proofpoint-ORIG-GUID: NcHZ0lBnMPJgbZKG9Djknu7FbdKkMoy7 X-Proofpoint-GUID: NcHZ0lBnMPJgbZKG9Djknu7FbdKkMoy7 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.267,Aquarius:18.0.980,Hydra:6.0.619,FMLib:17.11.176.26 definitions=2023-09-28_10,2023-09-28_01,2023-05-22_02 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Add a test case to validate the functionality of drivers' dma source buffer offload free. As part of dmadev_autotest, test case will be executed only if the driver supports source buffer offload free and if the test is exported by env variable DPDK_ADD_DMA_TEST. Signed-off-by: Amit Prakash Shukla Acked-by: Anoob Joseph --- app/test/test_dmadev.c | 166 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 165 insertions(+), 1 deletion(-) diff --git a/app/test/test_dmadev.c b/app/test/test_dmadev.c index 6ef875e545..0fdfe983af 100644 --- a/app/test/test_dmadev.c +++ b/app/test/test_dmadev.c @@ -18,11 +18,37 @@ #define ERR_RETURN(...) do { print_err(__func__, __LINE__, __VA_ARGS__); return -1; } while (0) +#define TEST_RINGSIZE 512 #define COPY_LEN 1024 static struct rte_mempool *pool; static uint16_t id_count; +enum { + TEST_PARAM_REMOTE_ADDR = 0, + TEST_PARAM_MAX, +}; + +static const char * const dma_test_param[] = { + [TEST_PARAM_REMOTE_ADDR] = "remote_addr", +}; + +static uint64_t env_test_param[TEST_PARAM_MAX]; + +enum { + TEST_SRC_BUF_FREE = 0, + TEST_MAX, +}; + +struct dma_add_test { + const char *name; + bool enabled; +}; + +struct dma_add_test dma_add_test[] = { + [TEST_SRC_BUF_FREE] = {.name = "sbuf_free", .enabled = false}, +}; + static void __rte_format_printf(3, 4) print_err(const char *func, int lineno, const char *format, ...) @@ -797,10 +823,103 @@ test_burst_capacity(int16_t dev_id, uint16_t vchan) return 0; } +static int +test_sbuf_free(int16_t dev_id, uint16_t vchan) +{ +#define NR_MBUF 256 + struct rte_mbuf *src[NR_MBUF], *dst[NR_MBUF]; + const struct rte_dma_vchan_conf qconf = { + .direction = RTE_DMA_DIR_MEM_TO_DEV, + .nb_desc = TEST_RINGSIZE, + .mem_to_dev_src_buf_pool = pool, + .dst_port.port_type = RTE_DMA_PORT_PCIE, + .dst_port.pcie.coreid = 0, + }; + uint32_t buf_cnt1, buf_cnt2; + struct rte_mempool_ops *ops; + static bool dev_init; + uint16_t nb_done = 0; + bool dma_err = false; + int retry = 100; + int i, ret = 0; + + if (!dev_init) { + /* Stop the device to reconfigure vchan. */ + if (rte_dma_stop(dev_id) < 0) + ERR_RETURN("Error stopping device %u\n", dev_id); + + if (rte_dma_vchan_setup(dev_id, vchan, &qconf) < 0) + ERR_RETURN("Error with queue configuration\n"); + + if (rte_dma_start(dev_id) != 0) + ERR_RETURN("Error with rte_dma_start()\n"); + + dev_init = true; + } + + if (rte_pktmbuf_alloc_bulk(pool, dst, NR_MBUF) != 0) + ERR_RETURN("alloc dst mbufs failed.\n"); + + for (i = 0; i < NR_MBUF; i++) { + /* Using mbuf structure to hold remote iova address. */ + rte_mbuf_iova_set(dst[i], (rte_iova_t)env_test_param[TEST_PARAM_REMOTE_ADDR]); + dst[i]->data_off = 0; + } + + /* Capture buffer count before allocating source buffer. */ + ops = rte_mempool_get_ops(pool->ops_index); + buf_cnt1 = ops->get_count(pool); + + if (rte_pktmbuf_alloc_bulk(pool, src, NR_MBUF) != 0) { + printf("alloc src mbufs failed.\n"); + ret = -1; + goto done; + } + + if ((buf_cnt1 - NR_MBUF) != ops->get_count(pool)) { + printf("Buffer count check failed.\n"); + ret = -1; + goto done; + } + + for (i = 0; i < NR_MBUF; i++) { + ret = rte_dma_copy(dev_id, vchan, rte_mbuf_data_iova(src[i]), + rte_mbuf_data_iova(dst[i]), COPY_LEN, + RTE_DMA_OP_FLAG_FREE_SBUF); + + if (ret < 0) { + printf("rte_dma_copy returned error.\n"); + goto done; + } + } + + rte_dma_submit(dev_id, vchan); + do { + nb_done += rte_dma_completed(dev_id, vchan, (NR_MBUF - nb_done), NULL, &dma_err); + if (dma_err) + break; + /* Sleep for 1 millisecond */ + rte_delay_us_sleep(1000); + } while (retry-- && (nb_done < NR_MBUF)); + + buf_cnt2 = ops->get_count(pool); + if ((buf_cnt1 != buf_cnt2) || dma_err) { + printf("Free source buffer test failed.\n"); + ret = -1; + } + +done: + rte_pktmbuf_free_bulk(dst, NR_MBUF); + /* If the test passes source buffer will be freed in hardware. */ + if (ret < 0) + rte_pktmbuf_free_bulk(&src[nb_done], (NR_MBUF - nb_done)); + + return ret; +} + static int test_dmadev_instance(int16_t dev_id) { -#define TEST_RINGSIZE 512 #define CHECK_ERRS true struct rte_dma_stats stats; struct rte_dma_info info; @@ -890,6 +1009,12 @@ test_dmadev_instance(int16_t dev_id) else if (runtest("fill", test_enqueue_fill, 1, dev_id, vchan, CHECK_ERRS) < 0) goto err; + if ((info.dev_capa & RTE_DMA_CAPA_MEM_TO_DEV_SOURCE_BUFFER_FREE) && + dma_add_test[TEST_SRC_BUF_FREE].enabled == true) { + if (runtest("sbuf_free", test_sbuf_free, 128, dev_id, vchan, CHECK_ERRS) < 0) + goto err; + } + rte_mempool_free(pool); if (rte_dma_stop(dev_id) < 0) @@ -922,11 +1047,50 @@ test_apis(void) return ret; } +static void +parse_dma_env_var(void) +{ + char *dma_env_param_str = getenv("DPDK_ADD_DMA_TEST_PARAM"); + char *dma_env_test_str = getenv("DPDK_ADD_DMA_TEST"); + char *params[32] = {0}; + char *tests[32] = {0}; + char *var[2] = {0}; + int n_var = 0; + int i, j; + + /* Additional test from commandline. */ + if (dma_env_test_str && strlen(dma_env_test_str) > 0) { + n_var = rte_strsplit(dma_env_test_str, strlen(dma_env_test_str), tests, + RTE_DIM(tests), ','); + for (i = 0; i < n_var; i++) { + for (j = 0; j < TEST_MAX; j++) { + if (!strcmp(tests[i], dma_add_test[j].name)) + dma_add_test[j].enabled = true; + } + } + } + + /* Commandline variables for test */ + if (dma_env_param_str && strlen(dma_env_param_str) > 0) { + n_var = rte_strsplit(dma_env_param_str, strlen(dma_env_param_str), params, + RTE_DIM(params), ','); + for (i = 0; i < n_var; i++) { + rte_strsplit(params[i], strlen(params[i]), var, RTE_DIM(var), '='); + for (j = 0; j < TEST_PARAM_MAX; j++) { + if (!strcmp(var[0], dma_test_param[j])) + env_test_param[j] = strtoul(var[1], NULL, 16); + } + } + } +} + static int test_dma(void) { int i; + parse_dma_env_var(); + /* basic sanity on dmadev infrastructure */ if (test_apis() < 0) ERR_RETURN("Error performing API tests\n");