Messages in this thread | | | Date | Tue, 8 Aug 2023 19:17:31 +0800 | Subject | Re: [RFC v1 4/5] maple_tree: avoid bulk alloc/free to use percpu array more | From | Peng Zhang <> |
| |
在 2023/8/8 17:53, Vlastimil Babka 写道: > Using bulk alloc/free on a cache with percpu array should not be > necessary and the bulk alloc actually bypasses the array (the prefill > functionality currently relies on this). > > The simplest change is just to convert the respective maple tree > wrappers to do a loop of normal alloc/free. > --- > lib/maple_tree.c | 11 +++++++++-- > 1 file changed, 9 insertions(+), 2 deletions(-) > > diff --git a/lib/maple_tree.c b/lib/maple_tree.c > index 1196d0a17f03..7a8e7c467d7c 100644 > --- a/lib/maple_tree.c > +++ b/lib/maple_tree.c > @@ -161,12 +161,19 @@ static inline struct maple_node *mt_alloc_one(gfp_t gfp) > > static inline int mt_alloc_bulk(gfp_t gfp, size_t size, void **nodes) > { > - return kmem_cache_alloc_bulk(maple_node_cache, gfp, size, nodes); > + int allocated = 0; > + for (size_t i = 0; i < size; i++) { > + nodes[i] = kmem_cache_alloc(maple_node_cache, gfp); > + if (nodes[i]) If the i-th allocation fails, node[i] will be NULL. This is wrong. We'd better guarantee that mt_alloc_bulk() allocates completely successfully, or returns 0. The following cases are not allowed: nodes: [addr1][addr2][NULL][addr3]. > + allocated++; > + } > + return allocated; > } > > static inline void mt_free_bulk(size_t size, void __rcu **nodes) > { > - kmem_cache_free_bulk(maple_node_cache, size, (void **)nodes); > + for (size_t i = 0; i < size; i++) > + kmem_cache_free(maple_node_cache, nodes[i]); > } > > static void mt_free_rcu(struct rcu_head *head)
| |