]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-client.git/commit
bio: fix kmemleak false positives from percpu bio alloc cache
authorMing Lei <ming.lei@redhat.com>
Thu, 26 Mar 2026 14:40:58 +0000 (22:40 +0800)
committerJens Axboe <axboe@kernel.dk>
Thu, 2 Apr 2026 13:07:03 +0000 (07:07 -0600)
commitc691e4b0d80be423f0a7443b53898eafe9c8754b
tree103f42da1ce9f5ca67e8ce036e19afcb26bd885d
parentf91ffe89b2016d280995a9c28d73288b02d83615
bio: fix kmemleak false positives from percpu bio alloc cache

When a bio is allocated from the mempool with REQ_ALLOC_CACHE set and
later completed, bio_put() places it into the per-cpu bio_alloc_cache
via bio_put_percpu_cache() instead of freeing it back to the
mempool/slab. The slab allocation remains tracked by kmemleak, but the
only reference to the bio is through the percpu cache's free_list,
which kmemleak fails to trace through percpu memory. This causes
kmemleak to report the cached bios as unreferenced objects.

Use symmetric kmemleak_free()/kmemleak_alloc() calls to properly track
bios across percpu cache transitions:

 - bio_put_percpu_cache: call kmemleak_free() when a bio enters the
   cache, unregistering it from kmemleak tracking.

 - bio_alloc_percpu_cache: call kmemleak_alloc() when a bio is taken
   from the cache for reuse, re-registering it so that genuine leaks
   of reused bios remain detectable.

 - __bio_alloc_cache_prune: call kmemleak_alloc() before bio_free() so
   that kmem_cache_free()'s internal kmemleak_free() has a matching
   allocation to pair with.

Tested-by: Yi Zhang <yi.zhang@redhat.com>
Signed-off-by: Ming Lei <ming.lei@redhat.com>
Link: https://patch.msgid.link/20260326144058.2392319-1-ming.lei@redhat.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/bio.c