Re: [PATCH] mm/slab: improve kmem_cache_alloc_bulk
"Vlastimil Babka (SUSE)" <[email protected]>
| Newsgroups | org.kernel.vger.io-uring,org.freedesktop.lists.dri-devel,org.kernel.vger.bpf,org.kernel.vger.linux-arm-msm,org.kernel.vger.linux-kernel,org.kernel.vger.netdev,org.kvack.linux-mm |
|---|---|
| Message-ID | <[email protected]> |
On 5/28/26 11:34, Christoph Hellwig wrote: > The kmem_cache_alloc_bulk return value is weird. It returns the number > of allocated objects, but that must always be 0 or the requested number > based on the implementations and the handling in the callers, but that > assumption is not actually documented anywhere, which confuses automated > review tools. > > Fix this by returning a bool if the allocation succeeded and adding a > kerneldoc comment explaining the API. > > Signed-off-by: Christoph Hellwig <[email protected]> > Reviewed-by: Alexander Lobakin <[email protected]> # skbuff > --- > drivers/gpu/drm/msm/msm_iommu.c | 6 +-- > drivers/gpu/drm/panthor/panthor_mmu.c | 13 +++--- > include/linux/slab.h | 6 ++- > io_uring/io_uring.c | 23 ++++------- > lib/test_meminit.c | 23 +++++------ > mm/kasan/kasan_test_c.c | 5 +-- > mm/kfence/kfence_test.c | 9 ++-- > mm/slub.c | 59 +++++++++++++++------------ > net/bpf/test_run.c | 7 ++-- > net/core/skbuff.c | 24 ++++++----- > tools/include/linux/slab.h | 2 +- > tools/testing/shared/linux.c | 19 ++++----- > 12 files changed, 97 insertions(+), 99 deletions(-) Thanks, I applied it to slab/for-7.2/alloc_bulk and merged to slab/for-next (it's still yankable in case of issues) Did some fixups below (the comment was stale prior to the patch; restored unlikely(), simplified one line). A test merge into yesterday's -next found a conflict in drivers/gpu/drm/ panthor/panthor_mmu.c. Commit 1013bf53650e ("drm/panthor: Split panthor_vm_prepare_map_op_ctx() to prepare for reclaim") moved the changed codeto a new function panthor_vm_op_ctx_prealloc_pts(). But it's solvable so no need for a complicated coordination I think. diff --git a/mm/slub.c b/mm/slub.c index 6caf6f3ceeed..711df528c9a6 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -7372,10 +7372,7 @@ bool kmem_cache_alloc_bulk_noprof(struct kmem_cache *s, gfp_t flags, } out: - /* - * memcg and kmem_cache debug support and memory initialization. - * Done outside of the IRQ disabled fastpath loop. - */ + /* memcg and kmem_cache debug support and memory initialization */ return likely(slab_post_alloc_hook(s, NULL, flags, size, p, slab_want_init_on_alloc(flags, s), s->object_size)); } diff --git a/net/bpf/test_run.c b/net/bpf/test_run.c index 99ab9ddb05e3..dbf0d8eae8d8 100644 --- a/net/bpf/test_run.c +++ b/net/bpf/test_run.c @@ -246,8 +246,8 @@ static int xdp_recv_frames(struct xdp_frame **frames, int nframes, int i; LIST_HEAD(list); - if (!kmem_cache_alloc_bulk(net_hotdata.skbuff_cache, gfp, nframes, - (void **)skbs)) { + if (unlikely(!kmem_cache_alloc_bulk(net_hotdata.skbuff_cache, gfp, + nframes, (void **)skbs))) { for (i = 0; i < nframes; i++) xdp_return_frame(frames[i]); return -ENOMEM; diff --git a/tools/testing/shared/linux.c b/tools/testing/shared/linux.c index e9c3bc9b3272..e0a0693df08f 100644 --- a/tools/testing/shared/linux.c +++ b/tools/testing/shared/linux.c @@ -301,7 +301,7 @@ int kmem_cache_refill_sheaf(struct kmem_cache *s, gfp_t gfp, if (!kmem_cache_alloc_bulk(s, gfp, size - sheaf->size, &sheaf->objects[sheaf->size])) return -ENOMEM; - sheaf->size += (size - sheaf->size); + sheaf->size = size; return 0; }