linux-btrfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Anand Jain <anand.jain@oracle.com>
To: Christoph Hellwig <hch@lst.de>, Chris Mason <clm@fb.com>,
	Josef Bacik <josef@toxicpanda.com>,
	David Sterba <dsterba@suse.com>
Cc: Nikolay Borisov <nborisov@suse.com>,
	Johannes Thumshirn <johannes.thumshirn@wdc.com>,
	linux-btrfs@vger.kernel.org
Subject: Re: [PATCH 02/11] btrfs: move btrfs_bio allocation to volumes.c
Date: Wed, 10 Aug 2022 22:42:41 +0800	[thread overview]
Message-ID: <357c360d-5cb0-a6ad-d87a-2f88a73ba0eb@oracle.com> (raw)
In-Reply-To: <20220806080330.3823644-3-hch@lst.de>

On 06/08/2022 16:03, Christoph Hellwig wrote:
> volumes.c is the place that implements the storage layer using the
> btrfs_bio structure, so move the bio_set and allocation helpers there
> as well.
> 
> To make up for the new initialization boilerplate, merge the two
> init/exit helpers in extent_io.c into a single one.
> 


Reviewed-by: Anand Jain <anand.jain@oracle.com>

Thanks, Anand


> Signed-off-by: Christoph Hellwig <hch@lst.de>
> Reviewed-by: Nikolay Borisov <nborisov@suse.com>
> Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
> Tested-by: Nikolay Borisov <nborisov@suse.com>
> Tested-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
> ---
>   fs/btrfs/extent-io-tree.h |  4 +--
>   fs/btrfs/extent_io.c      | 74 ++++-----------------------------------
>   fs/btrfs/extent_io.h      |  3 --
>   fs/btrfs/super.c          |  6 ++--
>   fs/btrfs/volumes.c        | 58 ++++++++++++++++++++++++++++++
>   fs/btrfs/volumes.h        |  3 ++
>   6 files changed, 72 insertions(+), 76 deletions(-)
> 
> diff --git a/fs/btrfs/extent-io-tree.h b/fs/btrfs/extent-io-tree.h
> index c3eb52dbe61cc..819763ace0aca 100644
> --- a/fs/btrfs/extent-io-tree.h
> +++ b/fs/btrfs/extent-io-tree.h
> @@ -96,8 +96,8 @@ struct extent_state {
>   #endif
>   };
>   
> -int __init extent_state_cache_init(void);
> -void __cold extent_state_cache_exit(void);
> +int __init volumes_init(void);
> +void __cold volumes_exit(void);
>   
>   void extent_io_tree_init(struct btrfs_fs_info *fs_info,
>   			 struct extent_io_tree *tree, unsigned int owner,
> diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
> index ca8b79d991f5e..068208244d925 100644
> --- a/fs/btrfs/extent_io.c
> +++ b/fs/btrfs/extent_io.c
> @@ -33,7 +33,6 @@
>   
>   static struct kmem_cache *extent_state_cache;
>   static struct kmem_cache *extent_buffer_cache;
> -static struct bio_set btrfs_bioset;
>   
>   static inline bool extent_state_in_tree(const struct extent_state *state)
>   {
> @@ -232,41 +231,23 @@ static void submit_write_bio(struct extent_page_data *epd, int ret)
>   	}
>   }
>   
> -int __init extent_state_cache_init(void)
> +int __init extent_io_init(void)
>   {
>   	extent_state_cache = kmem_cache_create("btrfs_extent_state",
>   			sizeof(struct extent_state), 0,
>   			SLAB_MEM_SPREAD, NULL);
>   	if (!extent_state_cache)
>   		return -ENOMEM;
> -	return 0;
> -}
>   
> -int __init extent_io_init(void)
> -{
>   	extent_buffer_cache = kmem_cache_create("btrfs_extent_buffer",
>   			sizeof(struct extent_buffer), 0,
>   			SLAB_MEM_SPREAD, NULL);
> -	if (!extent_buffer_cache)
> +	if (!extent_buffer_cache) {
> +		kmem_cache_destroy(extent_state_cache);
>   		return -ENOMEM;
> -
> -	if (bioset_init(&btrfs_bioset, BIO_POOL_SIZE,
> -			offsetof(struct btrfs_bio, bio),
> -			BIOSET_NEED_BVECS))
> -		goto free_buffer_cache;
> +	}
>   
>   	return 0;
> -
> -free_buffer_cache:
> -	kmem_cache_destroy(extent_buffer_cache);
> -	extent_buffer_cache = NULL;
> -	return -ENOMEM;
> -}
> -
> -void __cold extent_state_cache_exit(void)
> -{
> -	btrfs_extent_state_leak_debug_check();
> -	kmem_cache_destroy(extent_state_cache);
>   }
>   
>   void __cold extent_io_exit(void)
> @@ -277,7 +258,8 @@ void __cold extent_io_exit(void)
>   	 */
>   	rcu_barrier();
>   	kmem_cache_destroy(extent_buffer_cache);
> -	bioset_exit(&btrfs_bioset);
> +	btrfs_extent_state_leak_debug_check();
> +	kmem_cache_destroy(extent_state_cache);
>   }
>   
>   /*
> @@ -3156,50 +3138,6 @@ int btrfs_alloc_page_array(unsigned int nr_pages, struct page **page_array)
>   	return 0;
>   }
>   
> -/*
> - * Initialize the members up to but not including 'bio'. Use after allocating a
> - * new bio by bio_alloc_bioset as it does not initialize the bytes outside of
> - * 'bio' because use of __GFP_ZERO is not supported.
> - */
> -static inline void btrfs_bio_init(struct btrfs_bio *bbio)
> -{
> -	memset(bbio, 0, offsetof(struct btrfs_bio, bio));
> -}
> -
> -/*
> - * Allocate a btrfs_io_bio, with @nr_iovecs as maximum number of iovecs.
> - *
> - * The bio allocation is backed by bioset and does not fail.
> - */
> -struct bio *btrfs_bio_alloc(unsigned int nr_iovecs)
> -{
> -	struct bio *bio;
> -
> -	ASSERT(0 < nr_iovecs && nr_iovecs <= BIO_MAX_VECS);

  This check was removed
> -	bio = bio_alloc_bioset(NULL, nr_iovecs, 0, GFP_NOFS, &btrfs_bioset);
> -	btrfs_bio_init(btrfs_bio(bio));
> -	return bio;
> -}
> -
> -struct bio *btrfs_bio_clone_partial(struct bio *orig, u64 offset, u64 size)
> -{
> -	struct bio *bio;
> -	struct btrfs_bio *bbio;
> -
> -	ASSERT(offset <= UINT_MAX && size <= UINT_MAX);
> -
> -	/* this will never fail when it's backed by a bioset */
> -	bio = bio_alloc_clone(orig->bi_bdev, orig, GFP_NOFS, &btrfs_bioset);
> -	ASSERT(bio);
> -
> -	bbio = btrfs_bio(bio);
> -	btrfs_bio_init(bbio);
> -
> -	bio_trim(bio, offset >> 9, size >> 9);
> -	bbio->iter = bio->bi_iter;
> -	return bio;
> -}
> -
>   /**
>    * Attempt to add a page to bio
>    *
> diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h
> index 4bc72a87b9a99..69a86ae6fd508 100644
> --- a/fs/btrfs/extent_io.h
> +++ b/fs/btrfs/extent_io.h
> @@ -60,7 +60,6 @@ enum {
>   struct btrfs_bio;
>   struct btrfs_root;
>   struct btrfs_inode;
> -struct btrfs_io_bio;
>   struct btrfs_fs_info;
>   struct io_failure_record;
>   struct extent_io_tree;
> @@ -242,8 +241,6 @@ void extent_clear_unlock_delalloc(struct btrfs_inode *inode, u64 start, u64 end,
>   				  u32 bits_to_clear, unsigned long page_ops);
>   
>   int btrfs_alloc_page_array(unsigned int nr_pages, struct page **page_array);
> -struct bio *btrfs_bio_alloc(unsigned int nr_iovecs);
> -struct bio *btrfs_bio_clone_partial(struct bio *orig, u64 offset, u64 size);
>   
>   void end_extent_writepage(struct page *page, int err, u64 start, u64 end);
>   int btrfs_repair_eb_io_failure(const struct extent_buffer *eb, int mirror_num);
> diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
> index 4c7089b1681b3..96b22ee7b12ce 100644
> --- a/fs/btrfs/super.c
> +++ b/fs/btrfs/super.c
> @@ -2664,7 +2664,7 @@ static int __init init_btrfs_fs(void)
>   	if (err)
>   		goto free_cachep;
>   
> -	err = extent_state_cache_init();
> +	err = volumes_init();
>   	if (err)
>   		goto free_extent_io;
>   
> @@ -2723,7 +2723,7 @@ static int __init init_btrfs_fs(void)
>   free_extent_map:
>   	extent_map_exit();
>   free_extent_state_cache:
> -	extent_state_cache_exit();
> +	volumes_exit();
>   free_extent_io:
>   	extent_io_exit();
>   free_cachep:
> @@ -2744,7 +2744,7 @@ static void __exit exit_btrfs_fs(void)
>   	btrfs_prelim_ref_exit();
>   	ordered_data_exit();
>   	extent_map_exit();
> -	extent_state_cache_exit();
> +	volumes_exit();
>   	extent_io_exit();
>   	btrfs_interface_exit();
>   	unregister_filesystem(&btrfs_fs_type);
> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
> index 8c64dda69404e..bb614bb890709 100644
> --- a/fs/btrfs/volumes.c
> +++ b/fs/btrfs/volumes.c
> @@ -34,6 +34,8 @@
>   #include "discard.h"
>   #include "zoned.h"
>   
> +static struct bio_set btrfs_bioset;
> +
>   #define BTRFS_BLOCK_GROUP_STRIPE_MASK	(BTRFS_BLOCK_GROUP_RAID0 | \
>   					 BTRFS_BLOCK_GROUP_RAID10 | \
>   					 BTRFS_BLOCK_GROUP_RAID56_MASK)
> @@ -6606,6 +6608,48 @@ int btrfs_map_sblock(struct btrfs_fs_info *fs_info, enum btrfs_map_op op,
>   	return __btrfs_map_block(fs_info, op, logical, length, bioc_ret, 0, 1);
>   }
>   
> +/*
> + * Initialize a btrfs_bio structure.  This skips the embedded bio itself as it
> + * is already initialized by the block layer.
> + */
> +static inline void btrfs_bio_init(struct btrfs_bio *bbio)
> +{
> +	memset(bbio, 0, offsetof(struct btrfs_bio, bio));
> +}
> +
> +/*
> + * Allocate a btrfs_bio structure.  The btrfs_bio is the main I/O container for
> + * btrfs, and is used for all I/O submitted through btrfs_submit_bio.
> + *
> + * Just like the underlying bio_alloc_bioset it will no fail as it is backed by
> + * a mempool.
> + */
> +struct bio *btrfs_bio_alloc(unsigned int nr_vecs)
> +{
> +	struct bio *bio;
> +
> +	bio = bio_alloc_bioset(NULL, nr_vecs, 0, GFP_NOFS, &btrfs_bioset);
> +	btrfs_bio_init(btrfs_bio(bio));
> +	return bio;
> +}
> +
> +struct bio *btrfs_bio_clone_partial(struct bio *orig, u64 offset, u64 size)
> +{
> +	struct bio *bio;
> +	struct btrfs_bio *bbio;
> +
> +	ASSERT(offset <= UINT_MAX && size <= UINT_MAX);
> +
> +	bio = bio_alloc_clone(orig->bi_bdev, orig, GFP_NOFS, &btrfs_bioset);
> +	bbio = btrfs_bio(bio);
> +	btrfs_bio_init(bbio);
> +
> +	bio_trim(bio, offset >> 9, size >> 9);
> +	bbio->iter = bio->bi_iter;
> +	return bio;
> +
> +}
> +
>   static struct workqueue_struct *btrfs_end_io_wq(struct btrfs_io_context *bioc)
>   {
>   	if (bioc->orig_bio->bi_opf & REQ_META)
> @@ -8283,3 +8327,17 @@ bool btrfs_repair_one_zone(struct btrfs_fs_info *fs_info, u64 logical)
>   
>   	return true;
>   }
> +
> +int __init volumes_init(void)
> +{
> +	if (bioset_init(&btrfs_bioset, BIO_POOL_SIZE,
> +			offsetof(struct btrfs_bio, bio),
> +			BIOSET_NEED_BVECS))
> +		return -ENOMEM;
> +	return 0;
> +}
> +
> +void __cold volumes_exit(void)
> +{
> +	bioset_exit(&btrfs_bioset);
> +}
> diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h
> index 5639961b3626f..fb57b50fb60b1 100644
> --- a/fs/btrfs/volumes.h
> +++ b/fs/btrfs/volumes.h
> @@ -393,6 +393,9 @@ static inline struct btrfs_bio *btrfs_bio(struct bio *bio)
>   	return container_of(bio, struct btrfs_bio, bio);
>   }
>   
> +struct bio *btrfs_bio_alloc(unsigned int nr_vecs);
> +struct bio *btrfs_bio_clone_partial(struct bio *orig, u64 offset, u64 size);
> +
>   static inline void btrfs_bio_free_csum(struct btrfs_bio *bbio)
>   {
>   	if (bbio->csum != bbio->csum_inline) {


  reply	other threads:[~2022-08-10 14:43 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-08-06  8:03 btrfs I/O completion cleanup and single device I/O optimizations v3 Christoph Hellwig
2022-08-06  8:03 ` [PATCH 01/11] btrfs: don't call bioset_integrity_create for btrfs_bioset Christoph Hellwig
2022-08-08  5:06   ` Anand Jain
2022-08-08  6:47     ` Christoph Hellwig
2022-08-08 11:24   ` Anand Jain
2022-08-06  8:03 ` [PATCH 02/11] btrfs: move btrfs_bio allocation to volumes.c Christoph Hellwig
2022-08-10 14:42   ` Anand Jain [this message]
2022-08-06  8:03 ` [PATCH 03/11] btrfs: pass the operation to btrfs_bio_alloc Christoph Hellwig
2022-08-08 11:20   ` Anand Jain
2022-08-06  8:03 ` [PATCH 04/11] btrfs: don't take a bio_counter reference for cloned bios Christoph Hellwig
2022-08-18 11:30   ` Anand Jain
2022-08-06  8:03 ` [PATCH 05/11] btrfs: remove bioc->stripes_pending Christoph Hellwig
2022-08-18 11:33   ` Anand Jain
2022-08-18 23:36     ` Anand Jain
2022-08-18 23:37   ` Anand Jain
2022-08-06  8:03 ` [PATCH 06/11] btrfs: properly abstract the parity raid bio handling Christoph Hellwig
2022-08-06  8:03 ` [PATCH 07/11] btrfs: give struct btrfs_bio a real end_io handler Christoph Hellwig
2022-08-19  6:20   ` Anand Jain
2022-08-06  8:03 ` [PATCH 08/11] btrfs: split submit_stripe_bio Christoph Hellwig
2022-08-19 23:37   ` Anand Jain
2022-08-19 23:56     ` Anand Jain
2022-08-06  8:03 ` [PATCH 09/11] btrfs: simplify the submit_stripe_bio calling convention Christoph Hellwig
2022-08-19 23:53   ` Anand Jain
2022-08-06  8:03 ` [PATCH 10/11] btrfs: make the btrfs_io_context allocation in __btrfs_map_block optional Christoph Hellwig
2022-08-20 11:34   ` Anand Jain
2022-08-06  8:03 ` [PATCH 11/11] btrfs: stop allocation a btrfs_io_context for simple I/O Christoph Hellwig
2022-08-23  4:33 ` btrfs I/O completion cleanup and single device I/O optimizations v3 Anand Jain
  -- strict thread matches above, loose matches on Subject: below --
2022-07-13  6:13 btrfs I/O completion cleanup and single device I/O optimizations v2 Christoph Hellwig
2022-07-13  6:13 ` [PATCH 02/11] btrfs: move btrfs_bio allocation to volumes.c Christoph Hellwig

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=357c360d-5cb0-a6ad-d87a-2f88a73ba0eb@oracle.com \
    --to=anand.jain@oracle.com \
    --cc=clm@fb.com \
    --cc=dsterba@suse.com \
    --cc=hch@lst.de \
    --cc=johannes.thumshirn@wdc.com \
    --cc=josef@toxicpanda.com \
    --cc=linux-btrfs@vger.kernel.org \
    --cc=nborisov@suse.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).