diff mbox series

[3/7] fs/buffer: use sleeping version of __find_get_block()

Message ID 20250415231635.83960-4-dave@stgolabs.net (mailing list archive)
State New
Headers show
Series fs/buffer: split pagecache lookups into atomic or blocking | expand

Commit Message

Davidlohr Bueso April 15, 2025, 11:16 p.m. UTC
Convert to the new nonatomic flavor to benefit from potential performance
benefits and adapt in the future vs migration such that semantics
are kept.

Convert write_boundary_block() which already takes the buffer
lock as well as bdev_getblk() depending on the respective gpf flags.
There are no changes in semantics.

Suggested-by: Jan Kara <jack@suse.cz>
Signed-off-by: Davidlohr Bueso <dave@stgolabs.net>
---
 fs/buffer.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

2.39.5

Comments

Jan Kara April 16, 2025, 9:33 a.m. UTC | #1
On Tue 15-04-25 16:16:31, Davidlohr Bueso wrote:
> Convert to the new nonatomic flavor to benefit from potential performance
> benefits and adapt in the future vs migration such that semantics
> are kept.
> 
> Convert write_boundary_block() which already takes the buffer
> lock as well as bdev_getblk() depending on the respective gpf flags.
> There are no changes in semantics.
> 
> Suggested-by: Jan Kara <jack@suse.cz>
> Signed-off-by: Davidlohr Bueso <dave@stgolabs.net>

Looks good. Feel free to add:

Reviewed-by: Jan Kara <jack@suse.cz>

								Honza

> ---
>  fs/buffer.c | 11 +++++++++--
>  1 file changed, 9 insertions(+), 2 deletions(-)
> 
> diff --git a/fs/buffer.c b/fs/buffer.c
> index 64034638ee2c..f8e63885604b 100644
> --- a/fs/buffer.c
> +++ b/fs/buffer.c
> @@ -658,7 +658,9 @@ EXPORT_SYMBOL(generic_buffers_fsync);
>  void write_boundary_block(struct block_device *bdev,
>  			sector_t bblock, unsigned blocksize)
>  {
> -	struct buffer_head *bh = __find_get_block(bdev, bblock + 1, blocksize);
> +	struct buffer_head *bh;
> +
> +	bh = __find_get_block_nonatomic(bdev, bblock + 1, blocksize);
>  	if (bh) {
>  		if (buffer_dirty(bh))
>  			write_dirty_buffer(bh, 0);
> @@ -1440,8 +1442,12 @@ EXPORT_SYMBOL(__find_get_block_nonatomic);
>  struct buffer_head *bdev_getblk(struct block_device *bdev, sector_t block,
>  		unsigned size, gfp_t gfp)
>  {
> -	struct buffer_head *bh = __find_get_block(bdev, block, size);
> +	struct buffer_head *bh;
> +
> +	if (gfpflags_allow_blocking(gfp))
> +		bh = __find_get_block_nonatomic(bdev, block, size);
> +	else
> +		bh = __find_get_block(bdev, block, size);
>  
>  	might_alloc(gfp);
>  	if (bh)
> --
> 2.39.5
>
diff mbox series

Patch

diff --git a/fs/buffer.c b/fs/buffer.c
index 64034638ee2c..f8e63885604b 100644
--- a/fs/buffer.c
+++ b/fs/buffer.c
@@ -658,7 +658,9 @@  EXPORT_SYMBOL(generic_buffers_fsync);
 void write_boundary_block(struct block_device *bdev,
 			sector_t bblock, unsigned blocksize)
 {
-	struct buffer_head *bh = __find_get_block(bdev, bblock + 1, blocksize);
+	struct buffer_head *bh;
+
+	bh = __find_get_block_nonatomic(bdev, bblock + 1, blocksize);
 	if (bh) {
 		if (buffer_dirty(bh))
 			write_dirty_buffer(bh, 0);
@@ -1440,8 +1442,12 @@  EXPORT_SYMBOL(__find_get_block_nonatomic);
 struct buffer_head *bdev_getblk(struct block_device *bdev, sector_t block,
 		unsigned size, gfp_t gfp)
 {
-	struct buffer_head *bh = __find_get_block(bdev, block, size);
+	struct buffer_head *bh;
+
+	if (gfpflags_allow_blocking(gfp))
+		bh = __find_get_block_nonatomic(bdev, block, size);
+	else
+		bh = __find_get_block(bdev, block, size);
 
 	might_alloc(gfp);
 	if (bh)
--