All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christoph Hellwig <hch@lst.de>
To: Chris Mason <clm@fb.com>, Josef Bacik <josef@toxicpanda.com>,
	David Sterba <dsterba@suse.com>
Cc: linux-btrfs@vger.kernel.org
Subject: [PATCH 15/20] btrfs: remove the io_pages field in struct extent_buffer
Date: Thu,  9 Mar 2023 10:05:21 +0100	[thread overview]
Message-ID: <20230309090526.332550-16-hch@lst.de> (raw)
In-Reply-To: <20230309090526.332550-1-hch@lst.de>

No need to track the number of pages under I/O now that each
extent_buffer is read and written using a single bio.  For the
read side we need to grab an extra reference for the duration of
the I/O to prevent eviction, though.

Signed-off-by: Christoph Hellwig <hch@lst.de>
---
 fs/btrfs/extent_io.c | 17 +++++------------
 fs/btrfs/extent_io.h |  1 -
 2 files changed, 5 insertions(+), 13 deletions(-)

diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 16522bcf5d4a10..24df1247d81d88 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -1770,8 +1770,6 @@ static void extent_buffer_write_end_io(struct btrfs_bio *bbio)
 	bio_for_each_segment_all(bvec, &bbio->bio, iter_all) {
 		struct page *page = bvec->bv_page;
 
-		atomic_dec(&eb->io_pages);
-
 		if (!uptodate) {
 			ClearPageUptodate(page);
 			btrfs_page_set_error(fs_info, page, eb->start, eb->len);
@@ -1796,7 +1794,6 @@ static void prepare_eb_write(struct extent_buffer *eb)
 	unsigned long end;
 
 	clear_bit(EXTENT_BUFFER_WRITE_ERR, &eb->bflags);
-	atomic_set(&eb->io_pages, num_extent_pages(eb));
 
 	/* Set btree blocks beyond nritems with 0 to avoid stale content */
 	nritems = btrfs_header_nritems(eb);
@@ -3236,8 +3233,7 @@ static void __free_extent_buffer(struct extent_buffer *eb)
 
 static int extent_buffer_under_io(const struct extent_buffer *eb)
 {
-	return (atomic_read(&eb->io_pages) ||
-		test_bit(EXTENT_BUFFER_WRITEBACK, &eb->bflags) ||
+	return (test_bit(EXTENT_BUFFER_WRITEBACK, &eb->bflags) ||
 		test_bit(EXTENT_BUFFER_DIRTY, &eb->bflags));
 }
 
@@ -3374,7 +3370,6 @@ __alloc_extent_buffer(struct btrfs_fs_info *fs_info, u64 start,
 
 	spin_lock_init(&eb->refs_lock);
 	atomic_set(&eb->refs, 1);
-	atomic_set(&eb->io_pages, 0);
 
 	ASSERT(len <= BTRFS_MAX_METADATA_BLOCKSIZE);
 
@@ -3491,9 +3486,9 @@ static void check_buffer_tree_ref(struct extent_buffer *eb)
 	 * adequately protected by the refcount, but the TREE_REF bit and
 	 * its corresponding reference are not. To protect against this
 	 * class of races, we call check_buffer_tree_ref from the codepaths
-	 * which trigger io after they set eb->io_pages. Note that once io is
-	 * initiated, TREE_REF can no longer be cleared, so that is the
-	 * moment at which any such race is best fixed.
+	 * which trigger io. Note that once io is initiated, TREE_REF can no
+	 * longer be cleared, so that is the moment at which any such race is
+	 * best fixed.
 	 */
 	refs = atomic_read(&eb->refs);
 	if (refs >= 2 && test_bit(EXTENT_BUFFER_TREE_REF, &eb->bflags))
@@ -4063,7 +4058,6 @@ static void extent_buffer_read_end_io(struct btrfs_bio *bbio)
 	struct bio_vec *bvec;
 	u32 bio_offset = 0;
 
-	atomic_inc(&eb->refs);
 	eb->read_mirror = bbio->mirror_num;
 
 	if (uptodate &&
@@ -4078,7 +4072,6 @@ static void extent_buffer_read_end_io(struct btrfs_bio *bbio)
 	}
 
 	bio_for_each_segment_all(bvec, &bbio->bio, iter_all) {
-		atomic_dec(&eb->io_pages);
 		end_page_read(bvec->bv_page, uptodate, eb->start + bio_offset,
 			      bvec->bv_len);
 		bio_offset += bvec->bv_len;
@@ -4101,8 +4094,8 @@ static void __read_extent_buffer_pages(struct extent_buffer *eb, int mirror_num,
 
 	clear_bit(EXTENT_BUFFER_READ_ERR, &eb->bflags);
 	eb->read_mirror = 0;
-	atomic_set(&eb->io_pages, num_pages);
 	check_buffer_tree_ref(eb);
+	atomic_inc(&eb->refs);
 
 	bbio = btrfs_bio_alloc(INLINE_EXTENT_BUFFER_PAGES,
 			       REQ_OP_READ | REQ_META,
diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h
index 342412d37a7b4b..12854a2b48f060 100644
--- a/fs/btrfs/extent_io.h
+++ b/fs/btrfs/extent_io.h
@@ -79,7 +79,6 @@ struct extent_buffer {
 	struct btrfs_fs_info *fs_info;
 	spinlock_t refs_lock;
 	atomic_t refs;
-	atomic_t io_pages;
 	int read_mirror;
 	struct rcu_head rcu_head;
 	pid_t lock_owner;
-- 
2.39.2


  parent reply	other threads:[~2023-03-09  9:07 UTC|newest]

Thread overview: 74+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-09  9:05 simplify extent_buffer reading and writing Christoph Hellwig
2023-03-09  9:05 ` [PATCH 01/20] btrfs: mark extent_buffer_under_io static Christoph Hellwig
2023-03-09 11:06   ` Johannes Thumshirn
2023-03-10  7:26   ` Qu Wenruo
2023-03-09  9:05 ` [PATCH 02/20] btrfs: move setting the buffer uptodate out of validate_extent_buffer Christoph Hellwig
2023-03-09 11:10   ` Johannes Thumshirn
2023-03-10  7:27   ` Qu Wenruo
2023-03-09  9:05 ` [PATCH 03/20] btrfs: merge verify_parent_transid and btrfs_buffer_uptodate Christoph Hellwig
2023-03-09 11:17   ` Johannes Thumshirn
2023-03-09 15:21     ` Christoph Hellwig
2023-03-10  7:28   ` Qu Wenruo
2023-03-09  9:05 ` [PATCH 04/20] btrfs: always read the entire extent_buffer Christoph Hellwig
2023-03-09 11:29   ` Johannes Thumshirn
2023-03-09 15:21     ` Christoph Hellwig
2023-03-14  6:09     ` Christoph Hellwig
2023-03-17 23:16     ` David Sterba
2023-03-20  5:46       ` Christoph Hellwig
2023-03-10  7:35   ` Qu Wenruo
2023-03-09  9:05 ` [PATCH 05/20] btrfs: simplify extent buffer reading Christoph Hellwig
2023-03-09 11:59   ` Johannes Thumshirn
2023-03-10  7:42   ` Qu Wenruo
2023-03-10  7:47     ` Christoph Hellwig
2023-03-10  8:02       ` Qu Wenruo
2023-03-10  8:03         ` Christoph Hellwig
2023-03-10  8:07           ` Qu Wenruo
2023-03-10  8:15             ` Christoph Hellwig
2023-03-10  9:14               ` Qu Wenruo
2023-03-10 10:54       ` Filipe Manana
2023-03-10 11:12         ` Qu Wenruo
2023-03-09  9:05 ` [PATCH 06/20] btrfs: remove the mirror_num argument to btrfs_submit_compressed_read Christoph Hellwig
2023-03-09 12:58   ` Johannes Thumshirn
2023-03-09  9:05 ` [PATCH 07/20] btrfs: simplify the read_extent_buffer end_io handler Christoph Hellwig
2023-03-09 13:08   ` Johannes Thumshirn
2023-03-10  8:14   ` Qu Wenruo
2023-03-10  8:17     ` Christoph Hellwig
2023-03-10  8:30       ` Qu Wenruo
2023-03-10  9:30   ` Qu Wenruo
2023-03-09  9:05 ` [PATCH 08/20] btrfs: do not try to unlock the extent for non-subpage metadata reads Christoph Hellwig
2023-03-09 13:13   ` Johannes Thumshirn
2023-03-09  9:05 ` [PATCH 09/20] btrfs: return bool from lock_extent_buffer_for_io Christoph Hellwig
2023-03-09 13:17   ` Johannes Thumshirn
2023-03-09  9:05 ` [PATCH 10/20] btrfs: submit a writeback bio per extent_buffer Christoph Hellwig
2023-03-09 13:35   ` Johannes Thumshirn
2023-03-09  9:05 ` [PATCH 11/20] btrfs: move page locking from lock_extent_buffer_for_io to write_one_eb Christoph Hellwig
2023-03-09 13:46   ` Johannes Thumshirn
2023-03-09  9:05 ` [PATCH 12/20] btrfs: simplify extent buffer writing Christoph Hellwig
2023-03-09 14:00   ` Johannes Thumshirn
2023-03-09 15:22     ` Christoph Hellwig
2023-03-10  8:34   ` Qu Wenruo
2023-03-10  8:41     ` Christoph Hellwig
2023-03-09  9:05 ` [PATCH 13/20] btrfs: simplify the extent_buffer write end_io handler Christoph Hellwig
2023-03-09 14:10   ` Johannes Thumshirn
2023-03-09 15:22     ` Christoph Hellwig
2023-03-10  8:44   ` Qu Wenruo
2023-03-10 11:47     ` Christoph Hellwig
2023-03-09  9:05 ` [PATCH 14/20] btrfs: simplify btree block checksumming Christoph Hellwig
2023-03-09 15:51   ` Johannes Thumshirn
2023-03-10  8:57   ` Qu Wenruo
2023-03-09  9:05 ` Christoph Hellwig [this message]
2023-03-09 16:01   ` [PATCH 15/20] btrfs: remove the io_pages field in struct extent_buffer Johannes Thumshirn
2023-03-10  8:53   ` Qu Wenruo
2023-03-10 11:50     ` Christoph Hellwig
2023-03-09  9:05 ` [PATCH 16/20] btrfs: stop using PageError for extent_buffers Christoph Hellwig
2023-03-09 16:05   ` Johannes Thumshirn
2023-03-09  9:05 ` [PATCH 17/20] btrfs: don't check for uptodate pages in read_extent_buffer_pages Christoph Hellwig
2023-03-09 16:10   ` Johannes Thumshirn
2023-03-10  9:08   ` Qu Wenruo
2023-03-10 11:54     ` Christoph Hellwig
2023-03-14  6:12     ` Christoph Hellwig
2023-03-09  9:05 ` [PATCH 18/20] btrfs: stop using lock_extent in btrfs_buffer_uptodate Christoph Hellwig
2023-03-09  9:05 ` [PATCH 19/20] btrfs: use per-buffer locking for extent_buffer reading Christoph Hellwig
2023-03-09 17:12   ` Johannes Thumshirn
2023-03-09  9:05 ` [PATCH 20/20] btrfs: merge write_one_subpage_eb into write_one_eb Christoph Hellwig
2023-03-09 17:28   ` Johannes Thumshirn

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=20230309090526.332550-16-hch@lst.de \
    --to=hch@lst.de \
    --cc=clm@fb.com \
    --cc=dsterba@suse.com \
    --cc=josef@toxicpanda.com \
    --cc=linux-btrfs@vger.kernel.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.