From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 94541C61DB3 for ; Thu, 26 Jan 2023 21:51:42 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 836196B0074; Thu, 26 Jan 2023 16:51:40 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 7715B8E0001; Thu, 26 Jan 2023 16:51:40 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 3ECA56B0075; Thu, 26 Jan 2023 16:51:40 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 1C2656B0072 for ; Thu, 26 Jan 2023 16:51:40 -0500 (EST) Received: from smtpin30.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id E942C1C5E0B for ; Thu, 26 Jan 2023 21:51:39 +0000 (UTC) X-FDA: 80398297518.30.AEA59AA Received: from mx0b-00082601.pphosted.com (mx0b-00082601.pphosted.com [67.231.153.30]) by imf17.hostedemail.com (Postfix) with ESMTP id F16C14000F for ; Thu, 26 Jan 2023 21:51:37 +0000 (UTC) Authentication-Results: imf17.hostedemail.com; dkim=pass header.d=meta.com header.s=s2048-2021-q4 header.b=ASRbVkEP; spf=pass (imf17.hostedemail.com: domain of "prvs=4390123481=kbusch@meta.com" designates 67.231.153.30 as permitted sender) smtp.mailfrom="prvs=4390123481=kbusch@meta.com"; dmarc=pass (policy=reject) header.from=meta.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1674769898; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=s5rbVdHY8if3NZwBpxyqPHsyHy0AGgbbdnlk67jswfk=; b=7VwZ1oTB5T9tPLm1693Zqs7QfoK1LZePXLmBv+5+qC4HTPD49cv7Sf6Irygge8FRqw8yG5 8mR89CQoJbeBSExyj4DTLRxM8Dc7+058lhr/KYC8fU1mMNnHKM58d1XZPb7HMP2ZX91CM1 FoOtxOBIShod1LXJokT01S8xuI0jjRU= ARC-Authentication-Results: i=1; imf17.hostedemail.com; dkim=pass header.d=meta.com header.s=s2048-2021-q4 header.b=ASRbVkEP; spf=pass (imf17.hostedemail.com: domain of "prvs=4390123481=kbusch@meta.com" designates 67.231.153.30 as permitted sender) smtp.mailfrom="prvs=4390123481=kbusch@meta.com"; dmarc=pass (policy=reject) header.from=meta.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1674769898; a=rsa-sha256; cv=none; b=coA4Pp9cwF4ALq6gTr0sN//OUH1yT8TSldhTFcicqaxWdfhh2B9Z3l53VtpmR5d4Yojr2w HkF+lz8xVDoHybei2JeHTT5hXZl+kbcKTlKrSy7W8x9+vmIo+lpINYUv2Lu7lSvkEHs0Mu f2CiEXBdhO/yeD5W1Ybofo6ARWn0cs4= Received: from pps.filterd (m0109331.ppops.net [127.0.0.1]) by mx0a-00082601.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 30QJ4q2i024956 for ; Thu, 26 Jan 2023 13:51:37 -0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=meta.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding : content-type; s=s2048-2021-q4; bh=s5rbVdHY8if3NZwBpxyqPHsyHy0AGgbbdnlk67jswfk=; b=ASRbVkEP1febABvLy/E0M7KjVontma+WpIWKpp2bOHChITSLbdpyiQfexfBcy6D/RptR bDSRXFGJLr4hPl6ETgdfbdd1EhaMZFsw38KGwRzHFEt+c/fOQ29gMBwyA3uuLvfY+4QX bWYQRjIMczLp7ifZe7xe4b+nWOnp/G5In2o/uYYqMwzBDXf/dRCjX2hJd94JsWXjlJBr 20kd7KkQ1Mf+Ocz8gB9pqjlaD1P2Hy0H4It4QcwGSyeHKoJy7nlMDujxK6i1XjDdzGPk 0TAfTJOE6d47lcv6WTJ64X4xWgdP+b+ZqAj6Xxbrx5b/cBu8sLHCTHF8GFsJ6LpmuGlt cw== Received: from mail.thefacebook.com ([163.114.132.120]) by mx0a-00082601.pphosted.com (PPS) with ESMTPS id 3nbb800mma-4 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Thu, 26 Jan 2023 13:51:37 -0800 Received: from twshared24547.08.ash9.facebook.com (2620:10d:c085:208::11) by mail.thefacebook.com (2620:10d:c085:11d::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.17; Thu, 26 Jan 2023 13:51:35 -0800 Received: by devbig007.nao1.facebook.com (Postfix, from userid 544533) id DC4FCFE80A8D; Thu, 26 Jan 2023 13:51:25 -0800 (PST) From: Keith Busch To: , , , , , CC: , Keith Busch Subject: [PATCHv4 01/12] dmapool: add alloc/free performance test Date: Thu, 26 Jan 2023 13:51:14 -0800 Message-ID: <20230126215125.4069751-2-kbusch@meta.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230126215125.4069751-1-kbusch@meta.com> References: <20230126215125.4069751-1-kbusch@meta.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-FB-Internal: Safe Content-Type: text/plain X-Proofpoint-ORIG-GUID: AQG0iXHdMdTUl4BOBZzykvpjqhf_V5Wg X-Proofpoint-GUID: AQG0iXHdMdTUl4BOBZzykvpjqhf_V5Wg X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.219,Aquarius:18.0.930,Hydra:6.0.562,FMLib:17.11.122.1 definitions=2023-01-26_09,2023-01-26_01,2022-06-22_01 X-Stat-Signature: xjhfnpiysofqwygk45k5doiha6crqwzt X-Rspam-User: X-Rspamd-Queue-Id: F16C14000F X-Rspamd-Server: rspam06 X-HE-Tag: 1674769897-720149 X-HE-Meta: U2FsdGVkX1/i6/ajW6OIOPt1Qb4BleoeFGzSh/JMJUUFoDrV0lQ4NqRdowjYTMdNcimxc96fDAskrjN/nwGSFl4bVF4gYt2BrbvDPGVxXXuSufaMv6pMRSP7nVATyJdqSg2cD4aG0nB2+pIdSMA23h4aDWH1yBNcKgDvESyLFZcYD6XAj4MbJsFa6TdV7iff2gLvVr+qIo3hliW5p4ovRYxZSFmkfVFwbz1gz+hY8lNgvYvHZKd6gWkJ+KTsu+iOR7BV60vWYbzvL/SvY1zjkeJtfIp2Pgp/f+sk+9xbUayHQYK5nD+HLQxgTBihspXAGKrYYX6IYa+v/eGAvHA/7ja4AmmZXnY/3Fuy3IPpPUrqK2rmAameQvAs+VaxC/CTZ9227xwE9J2MObHLM40xD77xGc0kvZ6tMYIuhgVE6uREtISaDRJmaP6TjEXzxyHLSwBi1nlRS9U0BCiyhQHHvF6oWF8ErEgY2wbnokGL/bvk1EplQ1wQcqPsQWG0hF9rd9u2SsBfYmKtUoh+xB2KSWQJ6tBi8kjJxlcNjwxAEHXPng/xzYPGkmVjt8RkaPJbQI7yPd4ntyiDGc4Y3d7Nc/aIaYc99O7jwBiBZ68eavU8TwPYrrex71q+gabNprIkFTM0WvTzo9L1QCLeNnTw9u/ArHlm1e9OJcUAo1ctsE7PQggsWa10hTDOnuSnwt+7d4kEIssaqWGTY0CDXlTgoWhxNB9qfA4lWQ1j4EaWg6PgF2HSTkYV9n7Tmcf+4SqPS1KMIbRoTMqgj41Cv3I2g4MP0fl0H+CvtlvcHZ6pOdFU2rGdVOWrKgM7dThONPk2+QWU5GMc01mL7Pwiu2ykxTjHijiPLFA5ZWIopnX2cBCkLNgjgYD5auHuoRCiW14hGrKrz6ANv/j1phYq7ySe0bwyviAi+wonhzokgG2h+K8yqEVvAuaPyRmmChxAnPzH6BBDy711BJYJw3ArW+Q MN7+GEge U4ohiyu73Go0gaYJuL9F2/2RHpuqfJlhhKWWq2HtR5ItveTY6QQUtO0SYUEgzmsisge1wJz/vT+kXVQf28pGtvoSmKlBk7M8NdJwpaHNirmK/RDC2Q2WaQj9QPUGq2kYf0SPtpCC71SaRBUbsHCWyaW5bgypZmbdKoazZm0OgJ/AqTDb8DYkBX+v8OznDmmmn7gJkN93aX0LEwFJSmXifuxJgTpMljU/gpEC5C7NSwux1fbNvURReKtIs0YkWQfWAPgCmxASsmPiJ/xP1BuDZkpnnUS6Tq0V+s1Td92EJba7wjf+W8Peq9amNEsDTKCTjXVhCTn7AYuaXBxNpCdhlSvhg9bv5ZNVXogjXfWsOZ22nR7dul1353jyaSRbTPwxCthWw+hXhI8XFEAY= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: From: Keith Busch Provide a module that allocates and frees many blocks of various sizes and report how long it takes. This is intended to provide a consistent way to measure how changes to the dma_pool_alloc/free routines affect timing. Signed-off-by: Keith Busch --- mm/Kconfig | 9 +++ mm/Makefile | 1 + mm/dmapool_test.c | 147 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 157 insertions(+) create mode 100644 mm/dmapool_test.c diff --git a/mm/Kconfig b/mm/Kconfig index ebfe5796adf83..28ee03f39e93f 100644 --- a/mm/Kconfig +++ b/mm/Kconfig @@ -1099,6 +1099,15 @@ comment "GUP_TEST needs to have DEBUG_FS enabled" config GUP_GET_PXX_LOW_HIGH bool =20 +config DMAPOOL_TEST + tristate "Enable a module to run time tests on dma_pool" + depends on HAS_DMA + help + Provides a test module that will allocate and free many blocks of + various sizes and report how long it takes. This is intended to + provide a consistent way to measure how changes to the + dma_pool_alloc/free routines affect performance. + config ARCH_HAS_PTE_SPECIAL bool =20 diff --git a/mm/Makefile b/mm/Makefile index 8e105e5b3e293..3a08f5d7b1782 100644 --- a/mm/Makefile +++ b/mm/Makefile @@ -103,6 +103,7 @@ obj-$(CONFIG_MEMCG) +=3D swap_cgroup.o endif obj-$(CONFIG_CGROUP_HUGETLB) +=3D hugetlb_cgroup.o obj-$(CONFIG_GUP_TEST) +=3D gup_test.o +obj-$(CONFIG_DMAPOOL_TEST) +=3D dmapool_test.o obj-$(CONFIG_MEMORY_FAILURE) +=3D memory-failure.o obj-$(CONFIG_HWPOISON_INJECT) +=3D hwpoison-inject.o obj-$(CONFIG_DEBUG_KMEMLEAK) +=3D kmemleak.o diff --git a/mm/dmapool_test.c b/mm/dmapool_test.c new file mode 100644 index 0000000000000..370fb9e209eff --- /dev/null +++ b/mm/dmapool_test.c @@ -0,0 +1,147 @@ +#include +#include +#include +#include +#include +#include +#include + +#define NR_TESTS (100) + +struct dma_pool_pair { + dma_addr_t dma; + void *v; +}; + +struct dmapool_parms { + size_t size; + size_t align; + size_t boundary; +}; + +static const struct dmapool_parms pool_parms[] =3D { + { .size =3D 16, .align =3D 16, .boundary =3D 0 }, + { .size =3D 64, .align =3D 64, .boundary =3D 0 }, + { .size =3D 256, .align =3D 256, .boundary =3D 0 }, + { .size =3D 1024, .align =3D 1024, .boundary =3D 0 }, + { .size =3D 4096, .align =3D 4096, .boundary =3D 0 }, + { .size =3D 68, .align =3D 32, .boundary =3D 4096 }, +}; + +static struct dma_pool *pool; +static struct device test_dev; +static u64 dma_mask; + +static inline int nr_blocks(int size) +{ + return clamp_t(int, (PAGE_SIZE / size) * 512, 1024, 8192); +} + +static int dmapool_test_alloc(struct dma_pool_pair *p, int blocks) +{ + int i; + + for (i =3D 0; i < blocks; i++) { + p[i].v =3D dma_pool_alloc(pool, GFP_KERNEL, + &p[i].dma); + if (!p[i].v) + goto pool_fail; + } + + for (i =3D 0; i < blocks; i++) + dma_pool_free(pool, p[i].v, p[i].dma); + + return 0; + +pool_fail: + for (--i; i >=3D 0; i--) + dma_pool_free(pool, p[i].v, p[i].dma); + return -ENOMEM; +} + +static int dmapool_test_block(const struct dmapool_parms *parms) +{ + int blocks =3D nr_blocks(parms->size); + ktime_t start_time, end_time; + struct dma_pool_pair *p; + int i, ret; + + p =3D kcalloc(blocks, sizeof(*p), GFP_KERNEL); + if (!p) + return -ENOMEM; + + pool =3D dma_pool_create("test pool", &test_dev, parms->size, + parms->align, parms->boundary); + if (!pool) { + ret =3D -ENOMEM; + goto free_pairs; + } + + start_time =3D ktime_get(); + for (i =3D 0; i < NR_TESTS; i++) { + ret =3D dmapool_test_alloc(p, blocks); + if (ret) + goto free_pool; + if (need_resched()) + cond_resched(); + } + end_time =3D ktime_get(); + + printk("dmapool test: size:%-4zu align:%-4zu blocks:%-4d time:%llu\n", + parms->size, parms->align, blocks, + ktime_us_delta(end_time, start_time)); + +free_pool: + dma_pool_destroy(pool); +free_pairs: + kfree(p); + return ret; +} + +static void dmapool_test_release(struct device *dev) +{ +} + +static int dmapool_checks(void) +{ + int i, ret; + + ret =3D dev_set_name(&test_dev, "dmapool-test"); + if (ret) + return ret; + + ret =3D device_register(&test_dev); + if (ret) { + printk("%s: register failed:%d\n", __func__, ret); + goto put_device; + } + + test_dev.release =3D dmapool_test_release; + set_dma_ops(&test_dev, NULL); + test_dev.dma_mask =3D &dma_mask; + ret =3D dma_set_mask_and_coherent(&test_dev, DMA_BIT_MASK(64)); + if (ret) { + printk("%s: mask failed:%d\n", __func__, ret); + goto del_device; + } + + for (i =3D 0; i < ARRAY_SIZE(pool_parms); i++) { + ret =3D dmapool_test_block(&pool_parms[i]); + if (ret) + break; + } + +del_device: + device_del(&test_dev); +put_device: + put_device(&test_dev); + return ret; +} + +static void dmapool_exit(void) +{ +} + +module_init(dmapool_checks); +module_exit(dmapool_exit); +MODULE_LICENSE("GPL"); --=20 2.30.2