mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-10 11:40:19 -04:00
Merge patch series "fs/buffer: misc optimizations"
Davidlohr Bueso <dave@stgolabs.net> says: Four small patches - the first could be sent to Linus for v6.15 considering it is a missing nonblocking lookup conversion in the getblk slowpath I had missed. The other two patches are small optimizations found while reading the code, and one rocket science cleanup patch. * patches from https://lore.kernel.org/20250515173925.147823-1-dave@stgolabs.net: fs/buffer: optimize discard_buffer() fs/buffer: remove superfluous statements fs/buffer: avoid redundant lookup in getblk slowpath fs/buffer: use sleeping lookup in __getblk_slowpath() Link: https://lore.kernel.org/20250515173925.147823-1-dave@stgolabs.net Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
20
fs/buffer.c
20
fs/buffer.c
@@ -297,7 +297,6 @@ static void end_buffer_async_read(struct buffer_head *bh, int uptodate)
|
||||
|
||||
still_busy:
|
||||
spin_unlock_irqrestore(&first->b_uptodate_lock, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
struct postprocess_bh_ctx {
|
||||
@@ -422,7 +421,6 @@ static void end_buffer_async_write(struct buffer_head *bh, int uptodate)
|
||||
|
||||
still_busy:
|
||||
spin_unlock_irqrestore(&first->b_uptodate_lock, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1122,6 +1120,8 @@ static struct buffer_head *
|
||||
__getblk_slow(struct block_device *bdev, sector_t block,
|
||||
unsigned size, gfp_t gfp)
|
||||
{
|
||||
bool blocking = gfpflags_allow_blocking(gfp);
|
||||
|
||||
/* Size must be multiple of hard sectorsize */
|
||||
if (unlikely(size & (bdev_logical_block_size(bdev)-1) ||
|
||||
(size < 512 || size > PAGE_SIZE))) {
|
||||
@@ -1137,12 +1137,15 @@ __getblk_slow(struct block_device *bdev, sector_t block,
|
||||
for (;;) {
|
||||
struct buffer_head *bh;
|
||||
|
||||
bh = __find_get_block(bdev, block, size);
|
||||
if (bh)
|
||||
return bh;
|
||||
|
||||
if (!grow_buffers(bdev, block, size, gfp))
|
||||
return NULL;
|
||||
|
||||
if (blocking)
|
||||
bh = __find_get_block_nonatomic(bdev, block, size);
|
||||
else
|
||||
bh = __find_get_block(bdev, block, size);
|
||||
if (bh)
|
||||
return bh;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1611,8 +1614,8 @@ static void discard_buffer(struct buffer_head * bh)
|
||||
bh->b_bdev = NULL;
|
||||
b_state = READ_ONCE(bh->b_state);
|
||||
do {
|
||||
} while (!try_cmpxchg(&bh->b_state, &b_state,
|
||||
b_state & ~BUFFER_FLAGS_DISCARD));
|
||||
} while (!try_cmpxchg_relaxed(&bh->b_state, &b_state,
|
||||
b_state & ~BUFFER_FLAGS_DISCARD));
|
||||
unlock_buffer(bh);
|
||||
}
|
||||
|
||||
@@ -1677,7 +1680,6 @@ void block_invalidate_folio(struct folio *folio, size_t offset, size_t length)
|
||||
filemap_release_folio(folio, 0);
|
||||
out:
|
||||
folio_clear_mappedtodisk(folio);
|
||||
return;
|
||||
}
|
||||
EXPORT_SYMBOL(block_invalidate_folio);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user