From nobody Sun Feb 8 05:08:14 2026 Received: from canpmsgout07.his.huawei.com (canpmsgout07.his.huawei.com [113.46.200.222]) (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 D856B32C922 for ; Mon, 22 Dec 2025 15:33:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=113.46.200.222 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766417602; cv=none; b=TGJjH+cza+JhC+TonopI7UAkdJxA57S0A+WrXiOdTpHbPiqc60XihUGgl6oC+/UFmch/Rod765G2DGNa/p9Bf2bsB3z8zWFmaTwHjVEDlMP4DyLf/1VV4lSOMMIZmsc97e1t4oKd9Q0qTB0y+0IWMSO0PBZcti8fYgCf63KYsaQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766417602; c=relaxed/simple; bh=iH03pfoF4mvkTa2wcRHUM9Z8ksajUOI4hdloQnHz4Jk=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=YXtovvzfok551QTyYAHCmc0mR9bCFSesfk//gKHBuJ6R8nyZels/qJR9nUC0RyAoudjSBQMI7noLxu8U102KWHJJs+wcIx/MAtas+m5y5wVlDrCTtw/ObusyRGtZ1hNh/aYaUPmhW/zkoD+2zmu3BcenAuyPe/8630FIz4ZX+JM= 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; dkim=pass (1024-bit key) header.d=huawei.com header.i=@huawei.com header.b=6CKovsEY; arc=none smtp.client-ip=113.46.200.222 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=huawei.com header.i=@huawei.com header.b="6CKovsEY" dkim-signature: v=1; a=rsa-sha256; d=huawei.com; s=dkim; c=relaxed/relaxed; q=dns/txt; h=From; bh=doI5KMdG3Xum6cEQbVdMde7Z+vfULP8iPsOF4kcO7Qw=; b=6CKovsEYt5BUKpe0tqKF3abFx6zVjmzQsM/Hg04VHr52Q3t3SRnb2/CRnFa218AbKe1UczaNH vmbRi00kUV+cxs1NhjvFfnlMeKsUOFDvFTvXp+df8s0pO9OxCsmBJGal3fzn6GflJnUuWe4/1f6 9Qnt5Hh21F6swyF3p6oSGJg= Received: from mail.maildlp.com (unknown [172.19.162.92]) by canpmsgout07.his.huawei.com (SkyGuard) with ESMTPS id 4dZhsX0Y9pzLlTC; Mon, 22 Dec 2025 23:30:08 +0800 (CST) Received: from kwepemj200003.china.huawei.com (unknown [7.202.194.15]) by mail.maildlp.com (Postfix) with ESMTPS id 462D740562; Mon, 22 Dec 2025 23:33:13 +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; Mon, 22 Dec 2025 23:33:12 +0800 From: Qinxin Xia To: <21cnbao@gmail.com>, , , CC: , , , , , Barry Song Subject: [PATCH v5 1/3] dma-mapping: benchmark: modify the framework to adapt to more map modes Date: Mon, 22 Dec 2025 23:32:44 +0800 Message-ID: <20251222153246.2220659-2-xiaqinxin@huawei.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20251222153246.2220659-1-xiaqinxin@huawei.com> References: <20251222153246.2220659-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" 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, prepare_data, 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/uapi/linux/map_benchmark.h | 8 +- kernel/dma/map_benchmark.c | 130 ++++++++++++++++++++++++----- 2 files changed, 115 insertions(+), 23 deletions(-) diff --git a/include/uapi/linux/map_benchmark.h b/include/uapi/linux/map_be= nchmark.h index c2d91088a40d..e076748f2120 100644 --- a/include/uapi/linux/map_benchmark.h +++ b/include/uapi/linux/map_benchmark.h @@ -17,6 +17,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 */ @@ -29,7 +34,8 @@ 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 */ }; =20 #endif /* _UAPI_DMA_BENCHMARK_H */ diff --git a/kernel/dma/map_benchmark.c b/kernel/dma/map_benchmark.c index 794041a39e65..a6345c10901c 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,105 @@ struct map_benchmark_data { atomic64_t loops; }; =20 +struct map_benchmark_ops { + void *(*prepare)(struct map_benchmark_data *map); + void (*unprepare)(void *mparam); + void (*prepare_data)(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; + + 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 void dma_single_map_benchmark_prepare_data(void *mparam) +{ + struct dma_single_map_param *params =3D mparam; + + /* + * 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); +} + +static int dma_single_map_benchmark_do_map(void *mparam) +{ + struct dma_single_map_param *params =3D mparam; + + 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)); + return -ENOMEM; + } + + return 0; +} + +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, + .prepare_data =3D dma_single_map_benchmark_prepare_data, + .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 +138,14 @@ 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); + if (!mb_ops->prepare_data) + mb_ops->prepare_data(mparam); =20 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 +153,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 +189,7 @@ static int map_benchmark_thread(void *data) } =20 out: - free_pages_exact(buf, size); + mb_ops->unprepare(mparam); return ret; } =20 @@ -209,6 +290,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 Sun Feb 8 05:08:14 2026 Received: from canpmsgout01.his.huawei.com (canpmsgout01.his.huawei.com [113.46.200.216]) (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 802652D46C0 for ; Mon, 22 Dec 2025 15:33:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=113.46.200.216 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766417601; cv=none; b=izs+7K6tTWeTOG9+tYNf5gmLzDKn/cQw0JJDURMgc0f1oSwBSTpnEZyf5Q+/pozAC/AXHer5R2bTd5rnSSTOYhONC8jv9LwuIMkxN48Wnn3UybCpLZyIGB0Da4Urvhd1sYldtVoJEclGP087MAbSykF9ex5V8k+V8Yc9jvhqbT0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766417601; c=relaxed/simple; bh=3ORkZSqrryRlwuouwJX2eBKc9+YX6usq4fRVveD/X0M=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=j8GUUYsubctMamQBwctd9A43UbmoVrTACjG5jl0l9ICXr2wZ7FpeTZ7NdQu0lWJu1y0nhO0ixu9iJ7YuTbtarXw6Loyjhtk60mh1cGYrqqWAZqrIPZkC9KeD4x37cH1WOwWaEXcnnXQVSapy4aubb75hAcY+tFeFwJM+w73A5RY= 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; dkim=pass (1024-bit key) header.d=huawei.com header.i=@huawei.com header.b=BLHvy/hq; arc=none smtp.client-ip=113.46.200.216 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=huawei.com header.i=@huawei.com header.b="BLHvy/hq" dkim-signature: v=1; a=rsa-sha256; d=huawei.com; s=dkim; c=relaxed/relaxed; q=dns/txt; h=From; bh=8Nn9Tf6p9jv3oIFqF6C3yOaSQKn/TVtZ2Dbbt/Kekjc=; b=BLHvy/hqm1LhNdND4b8nhJY+525RXnN/gN1ofe3iulsbl4LEfldQVzBxnRu5bqZMo6RkfMFGA C7L7tg+9A4zGSpwLvnrvcFIL8nkyNUgzdJ7JcBM8FrDw1orwdSHfVoEnWQv89hpo2WLx2w8E/Oc wI10n1F/IZRrmIwMNMHg2yc= Received: from mail.maildlp.com (unknown [172.19.163.0]) by canpmsgout01.his.huawei.com (SkyGuard) with ESMTPS id 4dZhtT3fp4z1T4GK; Mon, 22 Dec 2025 23:30:57 +0800 (CST) Received: from kwepemj200003.china.huawei.com (unknown [7.202.194.15]) by mail.maildlp.com (Postfix) with ESMTPS id 07D934036C; Mon, 22 Dec 2025 23:33:17 +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; Mon, 22 Dec 2025 23:33:16 +0800 From: Qinxin Xia To: <21cnbao@gmail.com>, , , CC: , , , , , Barry Song Subject: [PATCH v5 2/3] dma-mapping: benchmark: add support for dma_map_sg Date: Mon, 22 Dec 2025 23:32:45 +0800 Message-ID: <20251222153246.2220659-3-xiaqinxin@huawei.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20251222153246.2220659-1-xiaqinxin@huawei.com> References: <20251222153246.2220659-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/uapi/linux/map_benchmark.h | 1 + kernel/dma/map_benchmark.c | 117 ++++++++++++++++++++++++++++- 2 files changed, 117 insertions(+), 1 deletion(-) diff --git a/include/uapi/linux/map_benchmark.h b/include/uapi/linux/map_be= nchmark.h index e076748f2120..5fa3745e1651 100644 --- a/include/uapi/linux/map_benchmark.h +++ b/include/uapi/linux/map_benchmark.h @@ -19,6 +19,7 @@ =20 enum { DMA_MAP_BENCH_SINGLE_MODE, + DMA_MAP_BENCH_SG_MODE, DMA_MAP_BENCH_MODE_MAX }; =20 diff --git a/kernel/dma/map_benchmark.c b/kernel/dma/map_benchmark.c index a6345c10901c..76c0e1d5ff08 100644 --- a/kernel/dma/map_benchmark.c +++ b/kernel/dma/map_benchmark.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -117,8 +118,121 @@ 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 =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; + + 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 void dma_sg_map_benchmark_prepare_data(void *mparam) +{ + struct dma_sg_map_param *params =3D mparam; + struct scatterlist *sg; + int i =3D 0; + + if (params->dma_dir =3D=3D DMA_FROM_DEVICE) + return; + + for_each_sgtable_sg(¶ms->sgt, sg, i) + memset(params->buf[i], 0x66, PAGE_SIZE); +} + +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, + .prepare_data =3D dma_sg_map_benchmark_prepare_data, + .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) @@ -290,7 +404,8 @@ static long map_benchmark_ioctl(struct file *file, unsi= gned int cmd, =20 switch (cmd) { case DMA_MAP_BENCHMARK: - if (map->bparam.map_mode >=3D DMA_MAP_BENCH_MODE_MAX) { + if (map->bparam.threads < 0 || + map->bparam.map_mode >=3D DMA_MAP_BENCH_MODE_MAX) { pr_err("invalid map mode\n"); return -EINVAL; } --=20 2.33.0 From nobody Sun Feb 8 05:08:14 2026 Received: from canpmsgout08.his.huawei.com (canpmsgout08.his.huawei.com [113.46.200.223]) (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 2979F32D44B for ; Mon, 22 Dec 2025 15:33:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=113.46.200.223 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766417604; cv=none; b=E8pHiHBjzuk9mjtUt3DdBps4P8r6ttiFluXrcePOkO4Z87plmb9oqSSUqZY6MNzU7j495oF24WqHDO1o3QOHDx5ZsQzIBLsqgH33lEhGw5pgC1FVhSDUTsfE+88yfw8Z/XlZTw4zEavXCeHzViVbYp4ILoMDmNzg2CRKunLYB7Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766417604; c=relaxed/simple; bh=VNXPhfrOvZBh1UB58HP3yaLCp6REoMsvb4uoZRGnOn8=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=P6efIFSudcBqq2y22c59bpNi7gzAWQ8V4eMY/NZWdXJmJNilC3wFx3SkVgBqk4+wxE13oWWN8NO+z+l/c1A8rIgbtfA+KwGNzoa/tuEZ+62H7inI5yJotRR1K1DPrsiG8AAGk8hBs/4GNpCpGDPEp5lOsPc7qJqf+CIxS8a1BI0= 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; dkim=pass (1024-bit key) header.d=huawei.com header.i=@huawei.com header.b=Oi6rC7rE; arc=none smtp.client-ip=113.46.200.223 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 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=huawei.com header.i=@huawei.com header.b="Oi6rC7rE" dkim-signature: v=1; a=rsa-sha256; d=huawei.com; s=dkim; c=relaxed/relaxed; q=dns/txt; h=From; bh=9B2/v5pOCvFdYbTALgJXOXDiEuIrsZcDluGt7zDPl1M=; b=Oi6rC7rEfC6ZtN0yjn7t5mZvrDIYZ4U5rXs19elbCq9QBym2ezQZOhDZlaXwfkiDTWR6lKAOr LF6lCCoscOJu144IVmYA1QcrL81UpVtZsQbYlaM26L+CVsJykzKn4lYR8eWjNDQmCj362Ru4TxP AeiNNsAOUV5vPguzOgFi4+g= Received: from mail.maildlp.com (unknown [172.19.163.15]) by canpmsgout08.his.huawei.com (SkyGuard) with ESMTPS id 4dZhsc6WywzmV7t; Mon, 22 Dec 2025 23:30:12 +0800 (CST) Received: from kwepemj200003.china.huawei.com (unknown [7.202.194.15]) by mail.maildlp.com (Postfix) with ESMTPS id 66C9840565; Mon, 22 Dec 2025 23:33:19 +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; Mon, 22 Dec 2025 23:33:18 +0800 From: Qinxin Xia To: <21cnbao@gmail.com>, , , CC: , , , , , Barry Song Subject: [PATCH v5 3/3] tools/dma: Add dma_map_sg support Date: Mon, 22 Dec 2025 23:32:46 +0800 Message-ID: <20251222153246.2220659-4-xiaqinxin@huawei.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20251222153246.2220659-1-xiaqinxin@huawei.com> References: <20251222153246.2220659-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 --- tools/dma/dma_map_benchmark.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/tools/dma/dma_map_benchmark.c b/tools/dma/dma_map_benchmark.c index dd0ed528e6df..39102330a43f 100644 --- a/tools/dma/dma_map_benchmark.c +++ b/tools/dma/dma_map_benchmark.c @@ -26,6 +26,8 @@ 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; + /* default single map mode */ + 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 */ @@ -33,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); @@ -56,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 < 0 || map_mode >=3D DMA_MAP_BENCH_MODE_MAX) { + fprintf(stderr, "invalid map mode, SINGLE_MODE:%d, 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); @@ -110,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, directions[dir], 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