block: allow use of per-cpu bio alloc cache by block drivers
authorMike Snitzer <snitzer@kernel.org>
Thu, 24 Mar 2022 20:35:25 +0000 (16:35 -0400)
committerJens Axboe <axboe@kernel.dk>
Sun, 17 Apr 2022 22:49:40 +0000 (16:49 -0600)
Refine per-cpu bio alloc cache interfaces so that DM and other block
drivers can properly create and use the cache:

DM uses bioset_init_from_src() to do its final bioset initialization,
so must update bioset_init_from_src() to set BIOSET_PERCPU_CACHE if
%src bioset has a cache.

Also move bio_clear_polled() to include/linux/bio.h to allow users
outside of block core.

Signed-off-by: Mike Snitzer <snitzer@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20220324203526.62306-3-snitzer@kernel.org
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/bio.c
block/blk.h
include/linux/bio.h

index c67f47c..643a3a0 100644 (file)
@@ -1767,6 +1767,8 @@ int bioset_init_from_src(struct bio_set *bs, struct bio_set *src)
                flags |= BIOSET_NEED_BVECS;
        if (src->rescue_workqueue)
                flags |= BIOSET_NEED_RESCUER;
+       if (src->cache)
+               flags |= BIOSET_PERCPU_CACHE;
 
        return bioset_init(bs, src->bio_pool.min_nr, src->front_pad, flags);
 }
index 0d33e4c..4ea5167 100644 (file)
@@ -450,12 +450,6 @@ extern struct device_attribute dev_attr_events;
 extern struct device_attribute dev_attr_events_async;
 extern struct device_attribute dev_attr_events_poll_msecs;
 
-static inline void bio_clear_polled(struct bio *bio)
-{
-       /* can't support alloc cache if we turn off polling */
-       bio->bi_opf &= ~(REQ_POLLED | REQ_ALLOC_CACHE);
-}
-
 long blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg);
 long compat_blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg);
 
index 0fe8a51..8e87f30 100644 (file)
@@ -780,6 +780,12 @@ static inline void bio_set_polled(struct bio *bio, struct kiocb *kiocb)
                bio->bi_opf |= REQ_NOWAIT;
 }
 
+static inline void bio_clear_polled(struct bio *bio)
+{
+       /* can't support alloc cache if we turn off polling */
+       bio->bi_opf &= ~(REQ_POLLED | REQ_ALLOC_CACHE);
+}
+
 struct bio *blk_next_bio(struct bio *bio, struct block_device *bdev,
                unsigned int nr_pages, unsigned int opf, gfp_t gfp);