From nobody Fri Oct 10 09:22:15 2025 Received: from szxga02-in.huawei.com (szxga02-in.huawei.com [45.249.212.188]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1B5F11FC8 for ; Sat, 14 Jun 2025 14:35:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.188 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749911709; cv=none; b=cius5K8cdXrDN4pLI+Kt2AFYOvN4CUKA98U+q1ttRiDHEWGtMKPZ5MvuPBCUHkcPekgxtPY5uGr+inIjZu0uNElgLA3HczUdt/f4rK2+ZMldmbuXKFmxeeRfG8T3H4OxlIDGONI93COOj32F0FZQntvBoEIz1rofdkk5YPZgDI4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749911709; c=relaxed/simple; bh=LviThTNa7WFSySQCtkVWg9h/yH8uPysYxenL5Gkm01I=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=DTL8dQ8eBjHadWRfM3gFcPN9dzOjoFVpUk6N19uIbC87MhkmiSPfyzR0m6208HcC32BdYelLf4pHHu0a8rBN3jDN7H+bQmYxK+9a/5hosNmwFvjCAb7JR2T/Ggv5Vb69FRAs9QCVDSqP85WXEhKFvlMroIkjmKvbBNXdT90uTYg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com; spf=pass smtp.mailfrom=huawei.com; arc=none smtp.client-ip=45.249.212.188 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huawei.com Received: from mail.maildlp.com (unknown [172.19.163.48]) by szxga02-in.huawei.com (SkyGuard) with ESMTP id 4bKJbG0RyKzRk30; Sat, 14 Jun 2025 22:30:50 +0800 (CST) Received: from kwepemj200003.china.huawei.com (unknown [7.202.194.15]) by mail.maildlp.com (Postfix) with ESMTPS id B15CB1800B1; Sat, 14 Jun 2025 22:35:04 +0800 (CST) Received: from localhost.huawei.com (10.90.31.46) by kwepemj200003.china.huawei.com (7.202.194.15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.11; Sat, 14 Jun 2025 22:35:04 +0800 From: Qinxin Xia To: <21cnbao@gmail.com>, , CC: , , , , , , , , Subject: [RESEND PATCH v4 1/4] dma-mapping: benchmark: Add padding to ensure uABI remained consistent Date: Sat, 14 Jun 2025 22:34:51 +0800 Message-ID: <20250614143454.2927363-2-xiaqinxin@huawei.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20250614143454.2927363-1-xiaqinxin@huawei.com> References: <20250614143454.2927363-1-xiaqinxin@huawei.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: kwepems100002.china.huawei.com (7.221.188.206) To kwepemj200003.china.huawei.com (7.202.194.15) Content-Type: text/plain; charset="utf-8" The padding field in the structure was previously reserved to maintain a stable interface for potential new fields, ensuring compatibility with user-space shared data structures. However,it was accidentally removed by tiantao in a prior commit, which may lead to incompatibility between user space and the kernel. This patch reinstates the padding to restore the original structure layout and preserve compatibility. Fixes: 8ddde07a3d28 ("dma-mapping: benchmark: extract a common header file = for map_benchmark definition") Cc: stable@vger.kernel.org Acked-by: Barry Song Signed-off-by: Qinxin Xia Reviewed-by: Jonathan Cameron --- include/linux/map_benchmark.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/linux/map_benchmark.h b/include/linux/map_benchmark.h index 62674c83bde4..2ac2fe52f248 100644 --- a/include/linux/map_benchmark.h +++ b/include/linux/map_benchmark.h @@ -27,5 +27,6 @@ struct map_benchmark { __u32 dma_dir; /* DMA data direction */ __u32 dma_trans_ns; /* time for DMA transmission in ns */ __u32 granule; /* how many PAGE_SIZE will do map/unmap once a time */ + __u8 expansion[76]; /* For future use */ }; #endif /* _KERNEL_DMA_BENCHMARK_H */ --=20 2.33.0 From nobody Fri Oct 10 09:22:15 2025 Received: from szxga08-in.huawei.com (szxga08-in.huawei.com [45.249.212.255]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AA6E12E337C for ; Sat, 14 Jun 2025 14:35:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.255 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749911716; cv=none; b=f5am5l15Ey4oaIjKxPG++eACBUckVAKYnDh5h7gwnT1s+t8FB19CHEz4AjF5I10HKvWPfBYdRK424jzlJe1pkZo0OFFHePlUmRYtY/lxluHjuO7eYU1eB69puUkuSPezH1xzkMmwk0T7fPkZtOdPhP1lpk3IV0k8+RQ6QTA4Z0c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749911716; c=relaxed/simple; bh=DmYPolF3D2IG3Iz9Q5jhq3/pStdUj+Lyi/uPJ4380H8=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=dC+7Cdf/sT2nZjdD9LipD74GkI3VdXdvueP2IwfBN9nzDuzlZkbpg47xQU1WVWIFaSLHDE7Bpj9wniIjG3/H5Yj5sShM1RGcEyQk6X/TsXAOn7cMoeZgFQchy1POxJ7T6a2W5NoQxnhyW2KnRIizbUf5kewia8DJVOqcSapOXTg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com; spf=pass smtp.mailfrom=huawei.com; arc=none smtp.client-ip=45.249.212.255 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huawei.com Received: from mail.maildlp.com (unknown [172.19.162.254]) by szxga08-in.huawei.com (SkyGuard) with ESMTP id 4bKJdk4jmXz1d1YD; Sat, 14 Jun 2025 22:32:58 +0800 (CST) Received: from kwepemj200003.china.huawei.com (unknown [7.202.194.15]) by mail.maildlp.com (Postfix) with ESMTPS id 2C779180489; Sat, 14 Jun 2025 22:35:05 +0800 (CST) Received: from localhost.huawei.com (10.90.31.46) by kwepemj200003.china.huawei.com (7.202.194.15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.11; Sat, 14 Jun 2025 22:35:04 +0800 From: Qinxin Xia To: <21cnbao@gmail.com>, , CC: , , , , , , , , Subject: [RESEND PATCH v4 2/4] dma-mapping: benchmark: modify the framework to adapt to more map modes Date: Sat, 14 Jun 2025 22:34:52 +0800 Message-ID: <20250614143454.2927363-3-xiaqinxin@huawei.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20250614143454.2927363-1-xiaqinxin@huawei.com> References: <20250614143454.2927363-1-xiaqinxin@huawei.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: kwepems100002.china.huawei.com (7.221.188.206) To kwepemj200003.china.huawei.com (7.202.194.15) Content-Type: text/plain; charset="utf-8" In some service scenarios, the performance of dma_map_sg needs to be tested to support different map modes for benchmarks. This patch adjusts the DMA map benchmark framework to make the DMA map benchmark framework more flexible and adaptable to other mapping modes in the future. By abstracting the framework into four interfaces:prepare, unprepare, do_map, and do_unmap.The new map schema can be introduced more easily without major modifications to the existing code structure. Reviewed-by: Barry Song Signed-off-by: Qinxin Xia --- include/linux/map_benchmark.h | 8 ++- kernel/dma/map_benchmark.c | 122 +++++++++++++++++++++++++++------- 2 files changed, 106 insertions(+), 24 deletions(-) diff --git a/include/linux/map_benchmark.h b/include/linux/map_benchmark.h index 2ac2fe52f248..020b3155c262 100644 --- a/include/linux/map_benchmark.h +++ b/include/linux/map_benchmark.h @@ -15,6 +15,11 @@ #define DMA_MAP_TO_DEVICE 1 #define DMA_MAP_FROM_DEVICE 2 =20 +enum { + DMA_MAP_BENCH_SINGLE_MODE, + DMA_MAP_BENCH_MODE_MAX +}; + struct map_benchmark { __u64 avg_map_100ns; /* average map latency in 100ns */ __u64 map_stddev; /* standard deviation of map latency */ @@ -27,6 +32,7 @@ struct map_benchmark { __u32 dma_dir; /* DMA data direction */ __u32 dma_trans_ns; /* time for DMA transmission in ns */ __u32 granule; /* how many PAGE_SIZE will do map/unmap once a time */ - __u8 expansion[76]; /* For future use */ + __u8 map_mode; /* the mode of dma map */ + __u8 expansion[75]; /* For future use */ }; #endif /* _KERNEL_DMA_BENCHMARK_H */ diff --git a/kernel/dma/map_benchmark.c b/kernel/dma/map_benchmark.c index cc19a3efea89..05f85cf00c35 100644 --- a/kernel/dma/map_benchmark.c +++ b/kernel/dma/map_benchmark.c @@ -5,6 +5,7 @@ =20 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt =20 +#include #include #include #include @@ -31,17 +32,99 @@ struct map_benchmark_data { atomic64_t loops; }; =20 +struct map_benchmark_ops { + void *(*prepare)(struct map_benchmark_data *map); + void (*unprepare)(void *mparam); + int (*do_map)(void *mparam); + void (*do_unmap)(void *mparam); +}; + +struct dma_single_map_param { + struct device *dev; + dma_addr_t addr; + void *xbuf; + u32 npages; + u32 dma_dir; +}; + +static void *dma_single_map_benchmark_prepare(struct map_benchmark_data *m= ap) +{ + struct dma_single_map_param *params __free(kfree) =3D kzalloc(sizeof(*par= ams), + GFP_KERNEL); + if (!params) + return NULL; + + params->npages =3D map->bparam.granule; + params->dma_dir =3D map->bparam.dma_dir; + params->dev =3D map->dev; + params->xbuf =3D alloc_pages_exact(params->npages * PAGE_SIZE, GFP_KERNEL= ); + if (!params->xbuf) + return NULL; + + /* + * for a non-coherent device, if we don't stain them in the + * cache, this will give an underestimate of the real-world + * overhead of BIDIRECTIONAL or TO_DEVICE mappings; + * 66 means evertything goes well! 66 is lucky. + */ + if (params->dma_dir !=3D DMA_FROM_DEVICE) + memset(params->xbuf, 0x66, params->npages * PAGE_SIZE); + + return_ptr(params); +} + +static void dma_single_map_benchmark_unprepare(void *mparam) +{ + struct dma_single_map_param *params =3D mparam; + + free_pages_exact(params->xbuf, params->npages * PAGE_SIZE); + kfree(params); +} + +static int dma_single_map_benchmark_do_map(void *mparam) +{ + struct dma_single_map_param *params =3D mparam; + int ret =3D 0; + + params->addr =3D dma_map_single(params->dev, params->xbuf, + params->npages * PAGE_SIZE, params->dma_dir); + if (unlikely(dma_mapping_error(params->dev, params->addr))) { + pr_err("dma_map_single failed on %s\n", dev_name(params->dev)); + ret =3D -ENOMEM; + } + + return ret; +} + +static void dma_single_map_benchmark_do_unmap(void *mparam) +{ + struct dma_single_map_param *params =3D mparam; + + dma_unmap_single(params->dev, params->addr, + params->npages * PAGE_SIZE, params->dma_dir); +} + +static struct map_benchmark_ops dma_single_map_benchmark_ops =3D { + .prepare =3D dma_single_map_benchmark_prepare, + .unprepare =3D dma_single_map_benchmark_unprepare, + .do_map =3D dma_single_map_benchmark_do_map, + .do_unmap =3D dma_single_map_benchmark_do_unmap, +}; + +static struct map_benchmark_ops *dma_map_benchmark_ops[DMA_MAP_BENCH_MODE_= MAX] =3D { + [DMA_MAP_BENCH_SINGLE_MODE] =3D &dma_single_map_benchmark_ops, +}; + static int map_benchmark_thread(void *data) { - void *buf; - dma_addr_t dma_addr; struct map_benchmark_data *map =3D data; - int npages =3D map->bparam.granule; - u64 size =3D npages * PAGE_SIZE; + __u8 map_mode =3D map->bparam.map_mode; int ret =3D 0; =20 - buf =3D alloc_pages_exact(size, GFP_KERNEL); - if (!buf) + struct map_benchmark_ops *mb_ops =3D dma_map_benchmark_ops[map_mode]; + void *mparam =3D mb_ops->prepare(map); + + if (!mparam) return -ENOMEM; =20 while (!kthread_should_stop()) { @@ -49,23 +132,10 @@ static int map_benchmark_thread(void *data) ktime_t map_stime, map_etime, unmap_stime, unmap_etime; ktime_t map_delta, unmap_delta; =20 - /* - * for a non-coherent device, if we don't stain them in the - * cache, this will give an underestimate of the real-world - * overhead of BIDIRECTIONAL or TO_DEVICE mappings; - * 66 means evertything goes well! 66 is lucky. - */ - if (map->dir !=3D DMA_FROM_DEVICE) - memset(buf, 0x66, size); - map_stime =3D ktime_get(); - dma_addr =3D dma_map_single(map->dev, buf, size, map->dir); - if (unlikely(dma_mapping_error(map->dev, dma_addr))) { - pr_err("dma_map_single failed on %s\n", - dev_name(map->dev)); - ret =3D -ENOMEM; + ret =3D mb_ops->do_map(mparam); + if (ret) goto out; - } map_etime =3D ktime_get(); map_delta =3D ktime_sub(map_etime, map_stime); =20 @@ -73,7 +143,8 @@ static int map_benchmark_thread(void *data) ndelay(map->bparam.dma_trans_ns); =20 unmap_stime =3D ktime_get(); - dma_unmap_single(map->dev, dma_addr, size, map->dir); + mb_ops->do_unmap(mparam); + unmap_etime =3D ktime_get(); unmap_delta =3D ktime_sub(unmap_etime, unmap_stime); =20 @@ -108,7 +179,7 @@ static int map_benchmark_thread(void *data) } =20 out: - free_pages_exact(buf, size); + mb_ops->unprepare(mparam); return ret; } =20 @@ -209,6 +280,11 @@ static long map_benchmark_ioctl(struct file *file, uns= igned int cmd, =20 switch (cmd) { case DMA_MAP_BENCHMARK: + if (map->bparam.map_mode >=3D DMA_MAP_BENCH_MODE_MAX) { + pr_err("invalid map mode\n"); + return -EINVAL; + } + if (map->bparam.threads =3D=3D 0 || map->bparam.threads > DMA_MAP_MAX_THREADS) { pr_err("invalid thread number\n"); --=20 2.33.0 From nobody Fri Oct 10 09:22:15 2025 Received: from szxga05-in.huawei.com (szxga05-in.huawei.com [45.249.212.191]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BE3792E337E for ; Sat, 14 Jun 2025 14:35:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.191 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749911716; cv=none; b=Z5J86fLKpbPGaEyBFLQUYEBkDofBdaLhPJY5OWsAVuTafCpqvVOD/oonY6HsO+qjzhbXHOxfYfnjQWgN+Eb0sZUZ2bEryt1OYIW/VsMmEPTexhWb9qqGszpep6bgMi+atc/L+Nv6OX7HcXHZbvWgu1XanoiYajMKx96Bhy6kEmY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749911716; c=relaxed/simple; bh=2vnT2i1xN5daZtW7H4aFUWo3uraWJ893sxEvdprct/M=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=aqKqSsyI40Sv4D08IyPB8/SJWIbsqnmiBE2II0ahpXjWXs9/cUITvSS4BqShVfq5rCiEbb0N/StiUUf/5TCn735Vw87aGEFEtZ2GSqoq/KZaSF0y3ipbS4z44owEXK1P2nVpEd29N1EJPhMx/4zVeKN1fXIOU2QPD4+6sbM4l90= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com; spf=pass smtp.mailfrom=huawei.com; arc=none smtp.client-ip=45.249.212.191 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huawei.com Received: from mail.maildlp.com (unknown [172.19.162.112]) by szxga05-in.huawei.com (SkyGuard) with ESMTP id 4bKJdQ3vFtz1R89f; Sat, 14 Jun 2025 22:32:42 +0800 (CST) Received: from kwepemj200003.china.huawei.com (unknown [7.202.194.15]) by mail.maildlp.com (Postfix) with ESMTPS id 8EEAB140258; Sat, 14 Jun 2025 22:35:05 +0800 (CST) Received: from localhost.huawei.com (10.90.31.46) by kwepemj200003.china.huawei.com (7.202.194.15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.11; Sat, 14 Jun 2025 22:35:04 +0800 From: Qinxin Xia To: <21cnbao@gmail.com>, , CC: , , , , , , , , Subject: [RESEND PATCH v4 3/4] dma-mapping: benchmark: add support for dma_map_sg Date: Sat, 14 Jun 2025 22:34:53 +0800 Message-ID: <20250614143454.2927363-4-xiaqinxin@huawei.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20250614143454.2927363-1-xiaqinxin@huawei.com> References: <20250614143454.2927363-1-xiaqinxin@huawei.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: kwepems100002.china.huawei.com (7.221.188.206) To kwepemj200003.china.huawei.com (7.202.194.15) Content-Type: text/plain; charset="utf-8" Support for dma scatter-gather mapping and is intended for testing mapping performance. It achieves by introducing the dma_sg_map_param structure and related functions, which enable the implementation of scatter-gather mapping preparation, mapping, and unmapping operations. Additionally, the dma_map_benchmark_ops array is updated to include operations for scatter-gather mapping. This commit aims to provide a wider range of mapping performance test to cater to different scenarios. Reviewed-by: Barry Song Signed-off-by: Qinxin Xia --- include/linux/map_benchmark.h | 43 ++++++++++---- kernel/dma/map_benchmark.c | 103 ++++++++++++++++++++++++++++++++++ 2 files changed, 134 insertions(+), 12 deletions(-) diff --git a/include/linux/map_benchmark.h b/include/linux/map_benchmark.h index 020b3155c262..9e8ec59e027a 100644 --- a/include/linux/map_benchmark.h +++ b/include/linux/map_benchmark.h @@ -17,22 +17,41 @@ =20 enum { DMA_MAP_BENCH_SINGLE_MODE, + DMA_MAP_BENCH_SG_MODE, DMA_MAP_BENCH_MODE_MAX }; =20 +/** + * struct map_benchmark - Benchmarking data for DMA mapping operations. + * @avg_map_100ns: Average map latency in 100ns. + * @map_stddev: Standard deviation of map latency. + * @avg_unmap_100ns: Average unmap latency in 100ns. + * @unmap_stddev: Standard deviation of unmap latency. + * @threads: Number of threads performing map/unmap operations in parallel. + * @seconds: Duration of the test in seconds. + * @node: NUMA node on which this benchmark will run. + * @dma_bits: DMA addressing capability. + * @dma_dir: DMA data direction. + * @dma_trans_ns: Time for DMA transmission in ns. + * @granule: Number of PAGE_SIZE units to map/unmap at once. + In SG mode, this represents the number of scatterlist entries. + In single mode, this represents the total size of the mapping. + * @map_mode: Mode of DMA mapping. + * @expansion: Reserved for future use. + */ struct map_benchmark { - __u64 avg_map_100ns; /* average map latency in 100ns */ - __u64 map_stddev; /* standard deviation of map latency */ - __u64 avg_unmap_100ns; /* as above */ + __u64 avg_map_100ns; + __u64 map_stddev; + __u64 avg_unmap_100ns; __u64 unmap_stddev; - __u32 threads; /* how many threads will do map/unmap in parallel */ - __u32 seconds; /* how long the test will last */ - __s32 node; /* which numa node this benchmark will run on */ - __u32 dma_bits; /* DMA addressing capability */ - __u32 dma_dir; /* DMA data direction */ - __u32 dma_trans_ns; /* time for DMA transmission in ns */ - __u32 granule; /* how many PAGE_SIZE will do map/unmap once a time */ - __u8 map_mode; /* the mode of dma map */ - __u8 expansion[75]; /* For future use */ + __u32 threads; + __u32 seconds; + __s32 node; + __u32 dma_bits; + __u32 dma_dir; + __u32 dma_trans_ns; + __u32 granule; + __u8 map_mode; + __u8 expansion[75]; }; #endif /* _KERNEL_DMA_BENCHMARK_H */ diff --git a/kernel/dma/map_benchmark.c b/kernel/dma/map_benchmark.c index 05f85cf00c35..843be4dc0993 100644 --- a/kernel/dma/map_benchmark.c +++ b/kernel/dma/map_benchmark.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include =20 @@ -111,8 +112,110 @@ static struct map_benchmark_ops dma_single_map_benchm= ark_ops =3D { .do_unmap =3D dma_single_map_benchmark_do_unmap, }; =20 +struct dma_sg_map_param { + struct sg_table sgt; + struct device *dev; + void **buf; + u32 npages; + u32 dma_dir; +}; + +static void *dma_sg_map_benchmark_prepare(struct map_benchmark_data *map) +{ + struct scatterlist *sg; + int i; + + struct dma_sg_map_param *params __free(kfree) =3D kzalloc(sizeof(*params)= , GFP_KERNEL); + if (!params) + return NULL; + + /* + * Set the number of scatterlist entries based on the granule. + * In SG mode, 'granule' represents the number of scatterlist entries. + * Each scatterlist entry corresponds to a single page. + */ + params->npages =3D map->bparam.granule; + params->dma_dir =3D map->bparam.dma_dir; + params->dev =3D map->dev; + params->buf =3D kmalloc_array(params->npages, sizeof(*params->buf), + GFP_KERNEL); + if (!params->buf) + goto out; + + if (sg_alloc_table(¶ms->sgt, params->npages, GFP_KERNEL)) + goto free_buf; + + for_each_sgtable_sg(¶ms->sgt, sg, i) { + params->buf[i] =3D (void *)__get_free_page(GFP_KERNEL); + if (!params->buf[i]) + goto free_page; + + if (params->dma_dir !=3D DMA_FROM_DEVICE) + memset(params->buf[i], 0x66, PAGE_SIZE); + + sg_set_buf(sg, params->buf[i], PAGE_SIZE); + } + + return_ptr(params); + +free_page: + while (i-- > 0) + free_page((unsigned long)params->buf[i]); + + sg_free_table(¶ms->sgt); +free_buf: + kfree(params->buf); +out: + return NULL; +} + +static void dma_sg_map_benchmark_unprepare(void *mparam) +{ + struct dma_sg_map_param *params =3D mparam; + int i; + + for (i =3D 0; i < params->npages; i++) + free_page((unsigned long)params->buf[i]); + + sg_free_table(¶ms->sgt); + + kfree(params->buf); + kfree(params); +} + +static int dma_sg_map_benchmark_do_map(void *mparam) +{ + struct dma_sg_map_param *params =3D mparam; + int ret =3D 0; + + int sg_mapped =3D dma_map_sg(params->dev, params->sgt.sgl, + params->npages, params->dma_dir); + if (!sg_mapped) { + pr_err("dma_map_sg failed on %s\n", dev_name(params->dev)); + ret =3D -ENOMEM; + } + + return ret; +} + +static void dma_sg_map_benchmark_do_unmap(void *mparam) +{ + struct dma_sg_map_param *params =3D mparam; + + dma_unmap_sg(params->dev, params->sgt.sgl, params->npages, + params->dma_dir); +} + +static struct map_benchmark_ops dma_sg_map_benchmark_ops =3D { + .prepare =3D dma_sg_map_benchmark_prepare, + .unprepare =3D dma_sg_map_benchmark_unprepare, + .do_map =3D dma_sg_map_benchmark_do_map, + .do_unmap =3D dma_sg_map_benchmark_do_unmap, +}; + static struct map_benchmark_ops *dma_map_benchmark_ops[DMA_MAP_BENCH_MODE_= MAX] =3D { [DMA_MAP_BENCH_SINGLE_MODE] =3D &dma_single_map_benchmark_ops, + [DMA_MAP_BENCH_SG_MODE] =3D &dma_sg_map_benchmark_ops, }; =20 static int map_benchmark_thread(void *data) --=20 2.33.0 From nobody Fri Oct 10 09:22:15 2025 Received: from szxga02-in.huawei.com (szxga02-in.huawei.com [45.249.212.188]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 532732DECB0 for ; Sat, 14 Jun 2025 14:35:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.188 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749911710; cv=none; b=FGyuaiGaH3P0SqpsBUKOo/0C/npRISkqbNCEUyrzFK1rp7dtxmIJftVZaf8VkzRogJAVScECLJUe7jpX5KUXWEHj+47kKxBM/b+RbGzPBcYjny9gM8T75/+ecp5+nZXRHiukla/pWkcgGR4XIZKa8fzoLWC01/FE8gWErpqZ4t8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1749911710; c=relaxed/simple; bh=XngLg+UTC2r+gkvpHZBWpkkEKwZaiIp7X3MAB3zKVGk=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=J/it8TXLaxqT39oInJA20rp5AmcbFsIEnz/ioKP5eqvw02bF5hVk6XH4E5d7AVP9r+nW2kT4yzbNA4nKPD2ZSOpLflF0HiRGnJXRND8XIS2fqsrrccuAWGXu9c6DYy8R0cMz4E8TddyRNQVKsr3igYZ25tczjhJM97+41vk8nu4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com; spf=pass smtp.mailfrom=huawei.com; arc=none smtp.client-ip=45.249.212.188 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=huawei.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huawei.com Received: from mail.maildlp.com (unknown [172.19.88.105]) by szxga02-in.huawei.com (SkyGuard) with ESMTP id 4bKJfp6rPgztSLv; Sat, 14 Jun 2025 22:33:54 +0800 (CST) Received: from kwepemj200003.china.huawei.com (unknown [7.202.194.15]) by mail.maildlp.com (Postfix) with ESMTPS id 0948B140154; Sat, 14 Jun 2025 22:35:06 +0800 (CST) Received: from localhost.huawei.com (10.90.31.46) by kwepemj200003.china.huawei.com (7.202.194.15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.11; Sat, 14 Jun 2025 22:35:05 +0800 From: Qinxin Xia To: <21cnbao@gmail.com>, , CC: , , , , , , , , Subject: [RESEND PATCH v4 4/4] selftests/dma: Add dma_map_sg support for dma_map_benchmark Date: Sat, 14 Jun 2025 22:34:54 +0800 Message-ID: <20250614143454.2927363-5-xiaqinxin@huawei.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20250614143454.2927363-1-xiaqinxin@huawei.com> References: <20250614143454.2927363-1-xiaqinxin@huawei.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: kwepems100002.china.huawei.com (7.221.188.206) To kwepemj200003.china.huawei.com (7.202.194.15) Content-Type: text/plain; charset="utf-8" Support for dma_map_sg, add option '-m' to distinguish mode. i) Users can set option '-m' to select mode: DMA_MAP_BENCH_SINGLE_MODE=3D0, DMA_MAP_BENCH_SG_MODE:=3D1 (The mode is also show in the test result). ii) Users can set option '-g' to set sg_nents (total count of entries in scatterlist) the maximum number is 1024. Each of sg buf size is PAGE_SIZE. e.g [root@localhost]# ./dma_map_benchmark -m 1 -g 8 -t 8 -s 30 -d 2 dma mapping mode: DMA_MAP_BENCH_SG_MODE dma mapping benchmark: threads:8 seconds:30 node:-1 dir:FROM_DEVICE granule/sg_nents: 8 average map latency(us):1.4 standard deviation:0.3 average unmap latency(us):1.3 standard deviation:0.3 [root@localhost]# ./dma_map_benchmark -m 0 -g 8 -t 8 -s 30 -d 2 dma mapping mode: DMA_MAP_BENCH_SINGLE_MODE dma mapping benchmark: threads:8 seconds:30 node:-1 dir:FROM_DEVICE granule/sg_nents: 8 average map latency(us):1.0 standard deviation:0.3 average unmap latency(us):1.3 standard deviation:0.5 Reviewed-by: Barry Song Signed-off-by: Qinxin Xia Reviewed-by: Jonathan Cameron --- tools/testing/selftests/dma/dma_map_benchmark.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/tools/testing/selftests/dma/dma_map_benchmark.c b/tools/testin= g/selftests/dma/dma_map_benchmark.c index b12f1f9babf8..c37cbc7e8766 100644 --- a/tools/testing/selftests/dma/dma_map_benchmark.c +++ b/tools/testing/selftests/dma/dma_map_benchmark.c @@ -27,6 +27,7 @@ int main(int argc, char **argv) int fd, opt; /* default single thread, run 20 seconds on NUMA_NO_NODE */ int threads =3D 1, seconds =3D 20, node =3D -1; + int map_mode =3D DMA_MAP_BENCH_SINGLE_MODE; /* default dma mask 32bit, bidirectional DMA */ int bits =3D 32, xdelay =3D 0, dir =3D DMA_MAP_BIDIRECTIONAL; /* default granule 1 PAGESIZE */ @@ -34,7 +35,7 @@ int main(int argc, char **argv) =20 int cmd =3D DMA_MAP_BENCHMARK; =20 - while ((opt =3D getopt(argc, argv, "t:s:n:b:d:x:g:")) !=3D -1) { + while ((opt =3D getopt(argc, argv, "t:s:n:b:d:x:g:m:")) !=3D -1) { switch (opt) { case 't': threads =3D atoi(optarg); @@ -57,11 +58,20 @@ int main(int argc, char **argv) case 'g': granule =3D atoi(optarg); break; + case 'm': + map_mode =3D atoi(optarg); + break; default: return -1; } } =20 + if (map_mode >=3D DMA_MAP_BENCH_MODE_MAX) { + fprintf(stderr, "invalid map mode, DMA_MAP_BENCH_SINGLE_MODE:%d, DMA_MAP= _BENCH_SG_MODE:%d\n", + DMA_MAP_BENCH_SINGLE_MODE, DMA_MAP_BENCH_SG_MODE); + exit(1); + } + if (threads <=3D 0 || threads > DMA_MAP_MAX_THREADS) { fprintf(stderr, "invalid number of threads, must be in 1-%d\n", DMA_MAP_MAX_THREADS); @@ -111,13 +121,15 @@ int main(int argc, char **argv) map.dma_dir =3D dir; map.dma_trans_ns =3D xdelay; map.granule =3D granule; + map.map_mode =3D map_mode; =20 if (ioctl(fd, cmd, &map)) { perror("ioctl"); exit(1); } =20 - printf("dma mapping benchmark: threads:%d seconds:%d node:%d dir:%s granu= le: %d\n", + printf("dma mapping mode: %d\n", map_mode); + printf("dma mapping benchmark: threads:%d seconds:%d node:%d dir:%s granu= le/sg_nents: %d\n", threads, seconds, node, dir[directions], granule); printf("average map latency(us):%.1f standard deviation:%.1f\n", map.avg_map_100ns/10.0, map.map_stddev/10.0); --=20 2.33.0