[PATCH 15/19] block: pass a block_device and opf to bio_alloc_bioset

2022-01-24 Thread Christoph Hellwig
Pass the block_device and operation that we plan to use this bio for to
bio_alloc_bioset to optimize the assigment.  NULL/0 can be passed, both
for the passthrough case on a raw request_queue and to temporarily avoid
refactoring some nasty code.

Also move the gfp_mask argument after the nr_vecs argument for a much
more logical calling convention matching what most of the kernel does.

Signed-off-by: Christoph Hellwig 
Reviewed-by: Chaitanya Kulkarni 
---
 block/bio.c | 30 +
 block/bounce.c  |  6 ++
 drivers/block/drbd/drbd_actlog.c|  5 ++---
 drivers/block/drbd/drbd_bitmap.c|  7 +++
 drivers/md/bcache/request.c | 12 +---
 drivers/md/dm-crypt.c   |  5 ++---
 drivers/md/dm-io.c  |  5 ++---
 drivers/md/dm-writecache.c  |  7 ---
 drivers/md/dm.c |  5 +++--
 drivers/md/md.c | 16 +++
 drivers/md/raid1.c  |  3 ++-
 drivers/md/raid10.c |  6 ++
 drivers/md/raid5-cache.c|  8 
 drivers/md/raid5-ppl.c  | 11 +--
 drivers/target/target_core_iblock.c |  6 ++
 fs/btrfs/extent_io.c|  2 +-
 fs/f2fs/data.c  |  7 +++
 fs/iomap/buffered-io.c  |  6 +++---
 include/linux/bio.h |  7 ---
 19 files changed, 75 insertions(+), 79 deletions(-)

diff --git a/block/bio.c b/block/bio.c
index a0166f29a05c3..9afc0c2aca6e4 100644
--- a/block/bio.c
+++ b/block/bio.c
@@ -417,8 +417,10 @@ static void punt_bios_to_rescuer(struct bio_set *bs)
 
 /**
  * bio_alloc_bioset - allocate a bio for I/O
+ * @bdev:  block device to allocate the bio for (can be %NULL)
+ * @nr_vecs:   number of bvecs to pre-allocate
+ * @opf:   operation and flags for bio
  * @gfp_mask:   the GFP_* mask given to the slab allocator
- * @nr_iovecs: number of iovecs to pre-allocate
  * @bs:the bio_set to allocate from.
  *
  * Allocate a bio from the mempools in @bs.
@@ -447,15 +449,16 @@ static void punt_bios_to_rescuer(struct bio_set *bs)
  *
  * Returns: Pointer to new bio on success, NULL on failure.
  */
-struct bio *bio_alloc_bioset(gfp_t gfp_mask, unsigned short nr_iovecs,
+struct bio *bio_alloc_bioset(struct block_device *bdev, unsigned short nr_vecs,
+unsigned int opf, gfp_t gfp_mask,
 struct bio_set *bs)
 {
gfp_t saved_gfp = gfp_mask;
struct bio *bio;
void *p;
 
-   /* should not use nobvec bioset for nr_iovecs > 0 */
-   if (WARN_ON_ONCE(!mempool_initialized(>bvec_pool) && nr_iovecs > 0))
+   /* should not use nobvec bioset for nr_vecs > 0 */
+   if (WARN_ON_ONCE(!mempool_initialized(>bvec_pool) && nr_vecs > 0))
return NULL;
 
/*
@@ -492,26 +495,29 @@ struct bio *bio_alloc_bioset(gfp_t gfp_mask, unsigned 
short nr_iovecs,
return NULL;
 
bio = p + bs->front_pad;
-   if (nr_iovecs > BIO_INLINE_VECS) {
+   if (nr_vecs > BIO_INLINE_VECS) {
struct bio_vec *bvl = NULL;
 
-   bvl = bvec_alloc(>bvec_pool, _iovecs, gfp_mask);
+   bvl = bvec_alloc(>bvec_pool, _vecs, gfp_mask);
if (!bvl && gfp_mask != saved_gfp) {
punt_bios_to_rescuer(bs);
gfp_mask = saved_gfp;
-   bvl = bvec_alloc(>bvec_pool, _iovecs, gfp_mask);
+   bvl = bvec_alloc(>bvec_pool, _vecs, gfp_mask);
}
if (unlikely(!bvl))
goto err_free;
 
-   bio_init(bio, bvl, nr_iovecs);
-   } else if (nr_iovecs) {
+   bio_init(bio, bvl, nr_vecs);
+   } else if (nr_vecs) {
bio_init(bio, bio->bi_inline_vecs, BIO_INLINE_VECS);
} else {
bio_init(bio, NULL, 0);
}
 
bio->bi_pool = bs;
+   if (bdev)
+   bio_set_dev(bio, bdev);
+   bio->bi_opf = opf;
return bio;
 
 err_free:
@@ -767,7 +773,7 @@ struct bio *bio_clone_fast(struct bio *bio, gfp_t gfp_mask, 
struct bio_set *bs)
 {
struct bio *b;
 
-   b = bio_alloc_bioset(gfp_mask, 0, bs);
+   b = bio_alloc_bioset(NULL, 0, 0, gfp_mask, bs);
if (!b)
return NULL;
 
@@ -1743,7 +1749,7 @@ struct bio *bio_alloc_kiocb(struct kiocb *kiocb, unsigned 
short nr_vecs,
struct bio *bio;
 
if (!(kiocb->ki_flags & IOCB_ALLOC_CACHE) || nr_vecs > BIO_INLINE_VECS)
-   return bio_alloc_bioset(GFP_KERNEL, nr_vecs, bs);
+   return bio_alloc_bioset(NULL, nr_vecs, 0, GFP_KERNEL, bs);
 
cache = per_cpu_ptr(bs->cache, get_cpu());
if (cache->free_list) {
@@ -1757,7 +1763,7 @@ struct bio *bio_alloc_kiocb(struct kiocb *kiocb, unsigned 
short nr_vecs,
return bio;
}

Re: [PATCH 15/19] block: pass a block_device and opf to bio_alloc_bioset

2022-01-18 Thread Chaitanya Kulkarni
On 1/17/22 11:19 PM, Christoph Hellwig wrote:
> Pass the block_device and operation that we plan to use this bio for to
> bio_alloc_bioset to optimize the assigment.  NULL/0 can be passed, both
> for the passthrough case on a raw request_queue and to temporarily avoid
> refactoring some nasty code.
> 
> Also move the gfp_mask argument after the nr_vecs argument for a much
> more logical calling convention matching what most of the kernel does.
> 
> Signed-off-by: Christoph Hellwig 


Looks good.

Reviewed-by: Chaitanya Kulkarni 




[PATCH 15/19] block: pass a block_device and opf to bio_alloc_bioset

2022-01-17 Thread Christoph Hellwig
Pass the block_device and operation that we plan to use this bio for to
bio_alloc_bioset to optimize the assigment.  NULL/0 can be passed, both
for the passthrough case on a raw request_queue and to temporarily avoid
refactoring some nasty code.

Also move the gfp_mask argument after the nr_vecs argument for a much
more logical calling convention matching what most of the kernel does.

Signed-off-by: Christoph Hellwig 
---
 block/bio.c | 29 +
 block/bounce.c  |  6 ++
 drivers/block/drbd/drbd_actlog.c|  5 ++---
 drivers/block/drbd/drbd_bitmap.c|  7 +++
 drivers/md/bcache/request.c | 12 +---
 drivers/md/dm-crypt.c   |  5 ++---
 drivers/md/dm-io.c  |  5 ++---
 drivers/md/dm-writecache.c  |  7 ---
 drivers/md/dm.c |  5 +++--
 drivers/md/md.c | 16 
 drivers/md/raid1.c  |  3 ++-
 drivers/md/raid10.c |  6 ++
 drivers/md/raid5-cache.c|  8 
 drivers/md/raid5-ppl.c  | 11 +--
 drivers/target/target_core_iblock.c |  6 ++
 fs/btrfs/extent_io.c|  2 +-
 fs/f2fs/data.c  |  7 +++
 fs/iomap/buffered-io.c  |  6 +++---
 include/linux/bio.h |  7 ---
 19 files changed, 74 insertions(+), 79 deletions(-)

diff --git a/block/bio.c b/block/bio.c
index 52c99bfa8008d..a58bc82d3c85f 100644
--- a/block/bio.c
+++ b/block/bio.c
@@ -417,8 +417,10 @@ static void punt_bios_to_rescuer(struct bio_set *bs)
 
 /**
  * bio_alloc_bioset - allocate a bio for I/O
+ * @bdev:  block device to allocate the bio for (can be %NULL)
+ * @nr_vecs:   number of bvecs to pre-allocate
+ * @opf:   operation and flags for bio
  * @gfp_mask:   the GFP_* mask given to the slab allocator
- * @nr_iovecs: number of iovecs to pre-allocate
  * @bs:the bio_set to allocate from.
  *
  * Allocate a bio from the mempools in @bs.
@@ -447,15 +449,16 @@ static void punt_bios_to_rescuer(struct bio_set *bs)
  *
  * Returns: Pointer to new bio on success, NULL on failure.
  */
-struct bio *bio_alloc_bioset(gfp_t gfp_mask, unsigned short nr_iovecs,
+struct bio *bio_alloc_bioset(struct block_device *bdev, unsigned short nr_vecs,
+unsigned int opf, gfp_t gfp_mask,
 struct bio_set *bs)
 {
gfp_t saved_gfp = gfp_mask;
struct bio *bio;
void *p;
 
-   /* should not use nobvec bioset for nr_iovecs > 0 */
-   if (WARN_ON_ONCE(!mempool_initialized(>bvec_pool) && nr_iovecs > 0))
+   /* should not use nobvec bioset for nr_vecs > 0 */
+   if (WARN_ON_ONCE(!mempool_initialized(>bvec_pool) && nr_vecs > 0))
return NULL;
 
/*
@@ -492,26 +495,28 @@ struct bio *bio_alloc_bioset(gfp_t gfp_mask, unsigned 
short nr_iovecs,
return NULL;
 
bio = p + bs->front_pad;
-   if (nr_iovecs > BIO_INLINE_VECS) {
+   if (nr_vecs > BIO_INLINE_VECS) {
struct bio_vec *bvl = NULL;
 
-   bvl = bvec_alloc(>bvec_pool, _iovecs, gfp_mask);
+   bvl = bvec_alloc(>bvec_pool, _vecs, gfp_mask);
if (!bvl && gfp_mask != saved_gfp) {
punt_bios_to_rescuer(bs);
gfp_mask = saved_gfp;
-   bvl = bvec_alloc(>bvec_pool, _iovecs, gfp_mask);
+   bvl = bvec_alloc(>bvec_pool, _vecs, gfp_mask);
}
if (unlikely(!bvl))
goto err_free;
 
-   bio_init(bio, bvl, nr_iovecs);
-   } else if (nr_iovecs) {
+   bio_init(bio, bvl, nr_vecs);
+   } else if (nr_vecs) {
bio_init(bio, bio->bi_inline_vecs, BIO_INLINE_VECS);
} else {
bio_init(bio, NULL, 0);
}
 
bio->bi_pool = bs;
+   bio_set_dev(bio, bdev);
+   bio->bi_opf = opf;
return bio;
 
 err_free:
@@ -766,7 +771,7 @@ struct bio *bio_clone_fast(struct bio *bio, gfp_t gfp_mask, 
struct bio_set *bs)
 {
struct bio *b;
 
-   b = bio_alloc_bioset(gfp_mask, 0, bs);
+   b = bio_alloc_bioset(NULL, 0, 0, gfp_mask, bs);
if (!b)
return NULL;
 
@@ -1742,7 +1747,7 @@ struct bio *bio_alloc_kiocb(struct kiocb *kiocb, unsigned 
short nr_vecs,
struct bio *bio;
 
if (!(kiocb->ki_flags & IOCB_ALLOC_CACHE) || nr_vecs > BIO_INLINE_VECS)
-   return bio_alloc_bioset(GFP_KERNEL, nr_vecs, bs);
+   return bio_alloc_bioset(NULL, nr_vecs, 0, GFP_KERNEL, bs);
 
cache = per_cpu_ptr(bs->cache, get_cpu());
if (cache->free_list) {
@@ -1756,7 +1761,7 @@ struct bio *bio_alloc_kiocb(struct kiocb *kiocb, unsigned 
short nr_vecs,
return bio;
}
put_cpu();
-   bio = bio_alloc_bioset(GFP_KERNEL,