From: "Liam R. Howlett" <Liam.Howlett@Oracle.com>
To: Vlastimil Babka <vbabka@suse.cz>
Cc: Matthew Wilcox <willy@infradead.org>,
Christoph Lameter <cl@linux.com>,
David Rientjes <rientjes@google.com>,
Pekka Enberg <penberg@kernel.org>,
Joonsoo Kim <iamjoonsoo.kim@lge.com>,
Hyeonggon Yoo <42.hyeyoo@gmail.com>,
Roman Gushchin <roman.gushchin@linux.dev>,
linux-mm@kvack.org, linux-kernel@vger.kernel.org,
patches@lists.linux.dev
Subject: Re: [RFC v1 5/5] maple_tree: replace preallocation with slub percpu array prefill
Date: Tue, 8 Aug 2023 15:03:32 -0400 [thread overview]
Message-ID: <20230808190332.3kf7bprtxdjvm4d3@revolver> (raw)
In-Reply-To: <20230808095342.12637-12-vbabka@suse.cz>
[-- Attachment #1: Type: text/plain, Size: 1935 bytes --]
* Vlastimil Babka <vbabka@suse.cz> [230808 05:53]:
> With the percpu array we can try not doing the preallocations in maple
> tree, and instead make sure the percpu array is prefilled, and using
> GFP_ATOMIC in places that relied on the preallocation (in case we miss
> or fail trylock on the array), i.e. mas_store_prealloc(). For now simply
> add __GFP_NOFAIL there as well.
>
> First I tried to change mas_node_count_gfp() to not preallocate anything
> anywhere, but that lead to warns and panics, even though the other
> caller mas_node_count() uses GFP_NOWAIT | __GFP_NOWARN so it has no
> guarantees... So I changed just mas_preallocate(). I let it still to
> truly preallocate a single node, but maybe it's not necessary?
Here's a patch to add the percpu array interface to the testing code.
Note that the maple tree preallocation testing isn't updated.
> ---
> lib/maple_tree.c | 10 ++++++++--
> 1 file changed, 8 insertions(+), 2 deletions(-)
>
> diff --git a/lib/maple_tree.c b/lib/maple_tree.c
> index 7a8e7c467d7c..5a209d88c318 100644
> --- a/lib/maple_tree.c
> +++ b/lib/maple_tree.c
> @@ -5534,7 +5534,12 @@ void mas_store_prealloc(struct ma_state *mas, void *entry)
>
> mas_wr_store_setup(&wr_mas);
> trace_ma_write(__func__, mas, 0, entry);
> +
> +retry:
> mas_wr_store_entry(&wr_mas);
> + if (unlikely(mas_nomem(mas, GFP_ATOMIC | __GFP_NOFAIL)))
> + goto retry;
> +
> MAS_WR_BUG_ON(&wr_mas, mas_is_err(mas));
> mas_destroy(mas);
> }
> @@ -5550,9 +5555,10 @@ EXPORT_SYMBOL_GPL(mas_store_prealloc);
> int mas_preallocate(struct ma_state *mas, gfp_t gfp)
> {
> int ret;
> + int count = 1 + mas_mt_height(mas) * 3;
>
> - mas_node_count_gfp(mas, 1 + mas_mt_height(mas) * 3, gfp);
> - mas->mas_flags |= MA_STATE_PREALLOC;
> + mas_node_count_gfp(mas, 1, gfp);
> + kmem_cache_prefill_percpu_array(maple_node_cache, count, gfp);
> if (likely(!mas_is_err(mas)))
> return 0;
>
> --
> 2.41.0
>
[-- Attachment #2: 0001-tools-Add-SLUB-percpu-array-functions-for-testing.patch --]
[-- Type: text/x-diff, Size: 2645 bytes --]
From 3d4ac32997cab4fc8e957deb4a58a5a7afa485bc Mon Sep 17 00:00:00 2001
From: "Liam R. Howlett" <Liam.Howlett@oracle.com>
Date: Tue, 8 Aug 2023 14:58:13 -0400
Subject: [PATCH] tools: Add SLUB percpu array functions for testing
Support new percpu array functions to the test code so they can be used
in the maple tree testing.
Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
---
tools/include/linux/slab.h | 4 ++++
tools/testing/radix-tree/linux.c | 14 ++++++++++++++
tools/testing/radix-tree/linux/kernel.h | 1 +
3 files changed, 19 insertions(+)
diff --git a/tools/include/linux/slab.h b/tools/include/linux/slab.h
index 311759ea25e9..1043f9c5ef4e 100644
--- a/tools/include/linux/slab.h
+++ b/tools/include/linux/slab.h
@@ -7,6 +7,7 @@
#define SLAB_PANIC 2
#define SLAB_RECLAIM_ACCOUNT 0x00020000UL /* Objects are reclaimable */
+#define SLAB_NO_MERGE 0x01000000UL /* Prevent merging with compatible kmem caches */
#define kzalloc_node(size, flags, node) kmalloc(size, flags)
@@ -45,4 +46,7 @@ void kmem_cache_free_bulk(struct kmem_cache *cachep, size_t size, void **list);
int kmem_cache_alloc_bulk(struct kmem_cache *cachep, gfp_t gfp, size_t size,
void **list);
+int kmem_cache_setup_percpu_array(struct kmem_cache *s, unsigned int count);
+int kmem_cache_prefill_percpu_array(struct kmem_cache *s, unsigned int count,
+ gfp_t gfp);
#endif /* _TOOLS_SLAB_H */
diff --git a/tools/testing/radix-tree/linux.c b/tools/testing/radix-tree/linux.c
index d587a558997f..cbe7937fdd5e 100644
--- a/tools/testing/radix-tree/linux.c
+++ b/tools/testing/radix-tree/linux.c
@@ -187,6 +187,20 @@ int kmem_cache_alloc_bulk(struct kmem_cache *cachep, gfp_t gfp, size_t size,
return size;
}
+int kmem_cache_setup_percpu_array(struct kmem_cache *s, unsigned int count)
+{
+ return 0;
+}
+
+int kmem_cache_prefill_percpu_array(struct kmem_cache *s, unsigned int count,
+ gfp_t gfp)
+{
+ if (count > s->non_kernel)
+ return s->non_kernel;
+
+ return count;
+}
+
struct kmem_cache *
kmem_cache_create(const char *name, unsigned int size, unsigned int align,
unsigned int flags, void (*ctor)(void *))
diff --git a/tools/testing/radix-tree/linux/kernel.h b/tools/testing/radix-tree/linux/kernel.h
index c5c9d05f29da..fc75018974de 100644
--- a/tools/testing/radix-tree/linux/kernel.h
+++ b/tools/testing/radix-tree/linux/kernel.h
@@ -15,6 +15,7 @@
#define printk printf
#define pr_err printk
+#define pr_warn printk
#define pr_info printk
#define pr_debug printk
#define pr_cont printk
--
2.39.2
prev parent reply other threads:[~2023-08-08 19:04 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-08 9:53 [RFC v1 0/5] SLUB percpu array caches and maple tree nodes Vlastimil Babka
2023-08-08 9:53 ` [RFC v1 1/5] mm, slub: fix bulk alloc and free stats Vlastimil Babka
2023-08-18 11:47 ` Hyeonggon Yoo
2023-08-08 9:53 ` [RFC v1 2/5] mm, slub: add opt-in slub_percpu_array Vlastimil Babka
2023-08-08 12:06 ` Pedro Falcato
2023-08-08 9:53 ` [RFC v1 3/5] maple_tree: use slub percpu array Vlastimil Babka
2023-08-08 9:53 ` [RFC v1 4/5] maple_tree: avoid bulk alloc/free to use percpu array more Vlastimil Babka
2023-08-08 11:17 ` Peng Zhang
2023-08-08 14:29 ` Liam R. Howlett
2023-08-08 15:08 ` Vlastimil Babka
2023-08-08 9:53 ` [RFC v1 5/5] maple_tree: replace preallocation with slub percpu array prefill Vlastimil Babka
2023-08-08 14:37 ` Liam R. Howlett
2023-08-08 19:01 ` Liam R. Howlett
2023-08-08 19:03 ` Liam R. Howlett [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230808190332.3kf7bprtxdjvm4d3@revolver \
--to=liam.howlett@oracle.com \
--cc=42.hyeyoo@gmail.com \
--cc=cl@linux.com \
--cc=iamjoonsoo.kim@lge.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=patches@lists.linux.dev \
--cc=penberg@kernel.org \
--cc=rientjes@google.com \
--cc=roman.gushchin@linux.dev \
--cc=vbabka@suse.cz \
--cc=willy@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.