From: Jens Axboe <axboe@kernel.dk>
To: linux-mm@kvack.org, linux-fsdevel@vger.kernel.org
Cc: hannes@cmpxchg.org, clm@meta.com, linux-kernel@vger.kernel.org,
willy@infradead.org, kirill@shutemov.name,
linux-btrfs@vger.kernel.org, linux-ext4@vger.kernel.org,
linux-xfs@vger.kernel.org, bfoster@redhat.com,
Jens Axboe <axboe@kernel.dk>
Subject: [PATCH 17/17] btrfs: add support for uncached writes
Date: Thu, 14 Nov 2024 08:25:21 -0700 [thread overview]
Message-ID: <20241114152743.2381672-19-axboe@kernel.dk> (raw)
In-Reply-To: <20241114152743.2381672-2-axboe@kernel.dk>
The read side is already covered as btrfs uses the generic filemap
helpers. For writes, just pass in FGP_UNCACHED if uncached IO is being
done, then the folios created should be marked appropriately.
For IO completion, ensure that writing back folios that are uncached
gets punted to one of the btrfs workers, as task context is needed for
that. Add an 'uncached_io' member to struct btrfs_bio to manage that.
With that, add FOP_UNCACHED to the btrfs file_operations fop_flags
structure, enabling use of RWF_UNCACHED.
Signed-off-by: Jens Axboe <axboe@kernel.dk>
---
fs/btrfs/bio.c | 4 ++--
fs/btrfs/bio.h | 2 ++
fs/btrfs/extent_io.c | 8 +++++++-
fs/btrfs/file.c | 9 ++++++---
4 files changed, 17 insertions(+), 6 deletions(-)
diff --git a/fs/btrfs/bio.c b/fs/btrfs/bio.c
index 7e0f9600b80c..253e1a656934 100644
--- a/fs/btrfs/bio.c
+++ b/fs/btrfs/bio.c
@@ -334,7 +334,7 @@ static void btrfs_end_bio_work(struct work_struct *work)
struct btrfs_bio *bbio = container_of(work, struct btrfs_bio, end_io_work);
/* Metadata reads are checked and repaired by the submitter. */
- if (is_data_bbio(bbio))
+ if (bio_op(&bbio->bio) == REQ_OP_READ && is_data_bbio(bbio))
btrfs_check_read_bio(bbio, bbio->bio.bi_private);
else
btrfs_bio_end_io(bbio, bbio->bio.bi_status);
@@ -351,7 +351,7 @@ static void btrfs_simple_end_io(struct bio *bio)
if (bio->bi_status)
btrfs_log_dev_io_error(bio, dev);
- if (bio_op(bio) == REQ_OP_READ) {
+ if (bio_op(bio) == REQ_OP_READ || bbio->uncached_io) {
INIT_WORK(&bbio->end_io_work, btrfs_end_bio_work);
queue_work(btrfs_end_io_wq(fs_info, bio), &bbio->end_io_work);
} else {
diff --git a/fs/btrfs/bio.h b/fs/btrfs/bio.h
index e2fe16074ad6..39b98326c98f 100644
--- a/fs/btrfs/bio.h
+++ b/fs/btrfs/bio.h
@@ -82,6 +82,8 @@ struct btrfs_bio {
/* Save the first error status of split bio. */
blk_status_t status;
+ bool uncached_io;
+
/*
* This member must come last, bio_alloc_bioset will allocate enough
* bytes for entire btrfs_bio but relies on bio being last.
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 872cca54cc6c..b97b21178ed7 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -760,8 +760,11 @@ static void submit_extent_folio(struct btrfs_bio_ctrl *bio_ctrl,
ASSERT(bio_ctrl->end_io_func);
if (bio_ctrl->bbio &&
- !btrfs_bio_is_contig(bio_ctrl, folio, disk_bytenr, pg_offset))
+ !btrfs_bio_is_contig(bio_ctrl, folio, disk_bytenr, pg_offset)) {
+ if (folio_test_uncached(folio))
+ bio_ctrl->bbio->uncached_io = true;
submit_one_bio(bio_ctrl);
+ }
do {
u32 len = size;
@@ -779,6 +782,9 @@ static void submit_extent_folio(struct btrfs_bio_ctrl *bio_ctrl,
len = bio_ctrl->len_to_oe_boundary;
}
+ if (folio_test_uncached(folio))
+ bio_ctrl->bbio->uncached_io = true;
+
if (!bio_add_folio(&bio_ctrl->bbio->bio, folio, len, pg_offset)) {
/* bio full: move on to a new one */
submit_one_bio(bio_ctrl);
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index 4fb521d91b06..cfee783f4c4d 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -919,7 +919,7 @@ static gfp_t get_prepare_gfp_flags(struct inode *inode, bool nowait)
static noinline int prepare_pages(struct inode *inode, struct page **pages,
size_t num_pages, loff_t pos,
size_t write_bytes, bool force_uptodate,
- bool nowait)
+ bool nowait, bool uncached)
{
int i;
unsigned long index = pos >> PAGE_SHIFT;
@@ -928,6 +928,8 @@ static noinline int prepare_pages(struct inode *inode, struct page **pages,
int ret = 0;
int faili;
+ if (uncached)
+ fgp_flags |= FGP_UNCACHED;
for (i = 0; i < num_pages; i++) {
again:
pages[i] = pagecache_get_page(inode->i_mapping, index + i,
@@ -1323,7 +1325,8 @@ ssize_t btrfs_buffered_write(struct kiocb *iocb, struct iov_iter *i)
* contents of pages from loop to loop
*/
ret = prepare_pages(inode, pages, num_pages,
- pos, write_bytes, force_page_uptodate, false);
+ pos, write_bytes, force_page_uptodate,
+ false, iocb->ki_flags & IOCB_UNCACHED);
if (ret) {
btrfs_delalloc_release_extents(BTRFS_I(inode),
reserve_bytes);
@@ -3802,7 +3805,7 @@ const struct file_operations btrfs_file_operations = {
.compat_ioctl = btrfs_compat_ioctl,
#endif
.remap_file_range = btrfs_remap_file_range,
- .fop_flags = FOP_BUFFER_RASYNC | FOP_BUFFER_WASYNC,
+ .fop_flags = FOP_BUFFER_RASYNC | FOP_BUFFER_WASYNC | FOP_UNCACHED,
};
int btrfs_fdatawrite_range(struct btrfs_inode *inode, loff_t start, loff_t end)
--
2.45.2
next prev parent reply other threads:[~2024-11-14 15:29 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-11-14 15:25 [PATCHSET v5 0/17] Uncached buffered IO Jens Axboe
2024-11-14 15:25 ` [PATCH 01/17] mm/filemap: change filemap_create_folio() to take a struct kiocb Jens Axboe
2024-11-14 15:25 ` [PATCH 02/17] mm/readahead: add folio allocation helper Jens Axboe
2024-11-14 15:25 ` [PATCH 03/17] mm: add PG_uncached page flag Jens Axboe
2024-11-14 15:25 ` [PATCH 04/17] mm/readahead: add readahead_control->uncached member Jens Axboe
2024-11-14 15:25 ` [PATCH 05/17] mm/filemap: use page_cache_sync_ra() to kick off read-ahead Jens Axboe
2024-11-14 15:25 ` [PATCH 06/17] mm/truncate: add folio_unmap_invalidate() helper Jens Axboe
2024-11-14 15:25 ` [PATCH 07/17] fs: add RWF_UNCACHED iocb and FOP_UNCACHED file_operations flag Jens Axboe
2024-11-14 15:25 ` [PATCH 08/17] mm/filemap: add read support for RWF_UNCACHED Jens Axboe
2024-11-15 8:49 ` Kirill A. Shutemov
2024-11-15 15:01 ` Jens Axboe
2024-11-14 15:25 ` [PATCH 09/17] mm/filemap: drop uncached pages when writeback completes Jens Axboe
2024-11-14 15:25 ` [PATCH 10/17] mm/filemap: make buffered writes work with RWF_UNCACHED Jens Axboe
2024-11-18 8:42 ` Baokun Li
2024-11-18 14:49 ` Jens Axboe
2024-11-14 15:25 ` [PATCH 11/17] mm/filemap: add filemap_fdatawrite_range_kick() helper Jens Axboe
2024-11-14 15:25 ` [PATCH 12/17] mm: add FGP_UNCACHED folio creation flag Jens Axboe
2024-11-14 15:25 ` [PATCH 13/17] ext4: add RWF_UNCACHED write support Jens Axboe
2024-11-14 15:25 ` [PATCH 14/17] iomap: make buffered writes work with RWF_UNCACHED Jens Axboe
2024-12-12 5:50 ` Christoph Hellwig
2024-12-12 6:26 ` Darrick J. Wong
2024-12-12 6:31 ` Christoph Hellwig
2024-11-14 15:25 ` [PATCH 15/17] xfs: punt uncached write completions to the completion wq Jens Axboe
2024-11-14 15:25 ` [PATCH 16/17] xfs: flag as supporting FOP_UNCACHED Jens Axboe
2024-11-14 15:25 ` Jens Axboe [this message]
2024-11-15 4:01 ` [PATCHSET v5 0/17] Uncached buffered IO Julian Sun
2024-11-15 15:06 ` Jens Axboe
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=20241114152743.2381672-19-axboe@kernel.dk \
--to=axboe@kernel.dk \
--cc=bfoster@redhat.com \
--cc=clm@meta.com \
--cc=hannes@cmpxchg.org \
--cc=kirill@shutemov.name \
--cc=linux-btrfs@vger.kernel.org \
--cc=linux-ext4@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-xfs@vger.kernel.org \
--cc=willy@infradead.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox