From patchwork Tue Sep 26 12:17:46 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: 131966 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 B202C42643; Tue, 26 Sep 2023 14:18:27 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id A118640689; Tue, 26 Sep 2023 14:18:27 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by mails.dpdk.org (Postfix) with ESMTP id 8371440685 for ; Tue, 26 Sep 2023 14:18:25 +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 38Q9xi4K012823; Tue, 26 Sep 2023 05:18:24 -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=jlQ33P+AQYShGK5kkpwzVHiDqutEKsL7OOK4SlrWCilKejmaJDsAGnfzEt5S6k53y4Hl bfKs7Kl7W+F4/6MZKagZZtdvzwS0P4Ay1Oy6i6E/qY1+lkS+vFM2obG1T6by5cNaF4cT z3GFQIFToWF65lZXGyJ9VPiEG00BdjoBm2yg8M3mmGI6efnw+0HgSNxF8UHTLXINoG1D e0X1fNUEvBT88L2xITa0TiKYjOn327U+v1d2M7372ETokL19syaM5zJNWbnCEoQpQGxn QlUrDDDgT+kCAQsb+SNu7iY5JoUJG6eMEpvQhsGlcokqc0oEaPR2rV/hIPqUkfRk5UOC Lg== Received: from dc5-exch02.marvell.com ([199.233.59.182]) by mx0a-0016f401.pphosted.com (PPS) with ESMTPS id 3tbw5ggdby-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Tue, 26 Sep 2023 05:18:24 -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; Tue, 26 Sep 2023 05:18:23 -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; Tue, 26 Sep 2023 05:18:22 -0700 Received: from localhost.localdomain (unknown [10.28.36.157]) by maili.marvell.com (Postfix) with ESMTP id B0F6F3F7053; Tue, 26 Sep 2023 05:18:18 -0700 (PDT) From: Amit Prakash Shukla To: Chengwen Feng , Kevin Laatz , Bruce Richardson CC: , , , , , , , , , , , Amit Prakash Shukla Subject: [PATCH v2 1/2] dmadev: offload to free source buffer Date: Tue, 26 Sep 2023 17:47:46 +0530 Message-ID: <20230926121747.4037154-2-amitprakashs@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230926121747.4037154-1-amitprakashs@marvell.com> References: <20230907081040.1002478-1-amitprakashs@marvell.com> <20230926121747.4037154-1-amitprakashs@marvell.com> MIME-Version: 1.0 X-Proofpoint-GUID: cXQDXLZ9vCXnxrmO_RlUDsDPbsQdNN04 X-Proofpoint-ORIG-GUID: cXQDXLZ9vCXnxrmO_RlUDsDPbsQdNN04 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-26_08,2023-09-25_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 Tue Sep 26 12:17:47 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: 131967 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 E7E3D42643; Tue, 26 Sep 2023 14:18:39 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id D5F7440685; Tue, 26 Sep 2023 14:18:39 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by mails.dpdk.org (Postfix) with ESMTP id 6ABF64028C for ; Tue, 26 Sep 2023 14:18:38 +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 38QA03FO013346; Tue, 26 Sep 2023 05:18:37 -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=tQJH6Btg+W4dZ2YCgxefMNMVqEyixPOXrbT0hQJLjXE=; b=a2CYrM0mRTBVXJ0P4KnqaMn1uRZ4rgwCvfWMmucx0v2Qc97I7Gbkrb2Q/bSbYLSTBROY ulTgHdy5IMpCgp25zcXgXuNkpEo9zY1HoVZUTqygvzqOLpIbZ0q0eNYYfd9GL4I7B9nB hzJqCyKO1Y7vLzh4Wu/OQOBr3/cy1LotEg7GcXU36aWBn2B08UJBntruCOqZMYGtbdOS rFALmECAIcidgK8hwPB1eOlP7z6kSO4pO2f6qQIjtQibtJfy0aFjV0+Xwz8dzTNHj8wv JGa2H0lV43LN3g+lVqR//xDfPsvV93sPmsfkFVtrYaC/uPJeFjZPJiMoTyINMTZ4J2nv WQ== Received: from dc5-exch01.marvell.com ([199.233.59.181]) by mx0a-0016f401.pphosted.com (PPS) with ESMTPS id 3tbw5ggdct-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Tue, 26 Sep 2023 05:18:37 -0700 Received: from DC5-EXCH01.marvell.com (10.69.176.38) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.48; Tue, 26 Sep 2023 05:18:35 -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; Tue, 26 Sep 2023 05:18:35 -0700 Received: from localhost.localdomain (unknown [10.28.36.157]) by maili.marvell.com (Postfix) with ESMTP id 91A813F7053; Tue, 26 Sep 2023 05:18:31 -0700 (PDT) From: Amit Prakash Shukla To: Chengwen Feng , Kevin Laatz , Bruce Richardson CC: , , , , , , , , , , , Amit Prakash Shukla Subject: [PATCH v2 2/2] test/dma: add source buffer offload free test Date: Tue, 26 Sep 2023 17:47:47 +0530 Message-ID: <20230926121747.4037154-3-amitprakashs@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230926121747.4037154-1-amitprakashs@marvell.com> References: <20230907081040.1002478-1-amitprakashs@marvell.com> <20230926121747.4037154-1-amitprakashs@marvell.com> MIME-Version: 1.0 X-Proofpoint-GUID: PX6tHCSP-Qrqep5cRKm68j2uKW61J0UX X-Proofpoint-ORIG-GUID: PX6tHCSP-Qrqep5cRKm68j2uKW61J0UX 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-26_08,2023-09-25_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 --- app/test/test_dmadev.c | 167 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 166 insertions(+), 1 deletion(-) diff --git a/app/test/test_dmadev.c b/app/test/test_dmadev.c index 6ef875e545..45f1f12b17 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,104 @@ 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, + /* Assuming pemid as 0. */ + .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 +1010,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 +1048,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");