#include <linux/highmem.h>
#include <linux/blk-crypto.h>
#include <linux/xarray.h>
+#include <linux/kmemleak.h>
#include <trace/events/block.h>
#include "blk.h"
return bs->front_pad + sizeof(struct bio) + bs->back_pad;
}
+static inline void *bio_slab_addr(struct bio *bio)
+{
+ return (void *)bio - bio->bi_pool->front_pad;
+}
+
static struct kmem_cache *bio_find_or_create_slab(struct bio_set *bs)
{
unsigned int size = bs_bio_slab_size(bs);
cache->nr--;
put_cpu();
bio->bi_pool = bs;
+
+ kmemleak_alloc(bio_slab_addr(bio),
+ kmem_cache_size(bs->bio_slab), 1, GFP_NOIO);
return bio;
}
while ((bio = cache->free_list) != NULL) {
cache->free_list = bio->bi_next;
cache->nr--;
+ kmemleak_alloc(bio_slab_addr(bio),
+ kmem_cache_size(bio->bi_pool->bio_slab),
+ 1, GFP_KERNEL);
bio_free(bio);
if (++i == nr)
break;
bio->bi_bdev = NULL;
cache->free_list = bio;
cache->nr++;
+ kmemleak_free(bio_slab_addr(bio));
} else if (in_hardirq()) {
lockdep_assert_irqs_disabled();
bio->bi_next = cache->free_list_irq;
cache->free_list_irq = bio;
cache->nr_irq++;
+ kmemleak_free(bio_slab_addr(bio));
} else {
goto out_free;
}