Skip to content

block: avoid redundant flushes for O_DSYNC direct writes - #110

Open
blktests-ci-block-trial[bot] wants to merge 2 commits into
master_basefrom
series/630=>master
Open

block: avoid redundant flushes for O_DSYNC direct writes#110
blktests-ci-block-trial[bot] wants to merge 2 commits into
master_basefrom
series/630=>master

Conversation

@blktests-ci-block-trial

Copy link
Copy Markdown

Pull request for series with
subject: block: avoid redundant flushes for O_DSYNC direct writes
version: 2
url: http://redsun45:8000/project/linux-block/list/?series=630

@blktests-ci-block-trial

Copy link
Copy Markdown
Author

Upstream branch: 8d3ae59
series: http://redsun45:8000/project/linux-block/list/?series=630
version: 2

@blktests-ci-block-trial

Copy link
Copy Markdown
Author

Upstream branch: ff68e5f
series: http://redsun45:8000/project/linux-block/list/?series=630
version: 2

@blktests-ci-block-trial

Copy link
Copy Markdown
Author

Upstream branch: 0f23d56
series: http://redsun45:8000/project/linux-block/list/?series=630
version: 2

@blktests-ci-block-trial

Copy link
Copy Markdown
Author

Upstream branch: 1200d84
series: http://redsun45:8000/project/linux-block/list/?series=630
version: 2

@blktests-ci-block-trial

Copy link
Copy Markdown
Author

Upstream branch: 3a0dd7b
series: http://redsun45:8000/project/linux-block/list/?series=630
version: 2

@blktests-ci-block-trial

Copy link
Copy Markdown
Author

Upstream branch: b126f6f
series: http://redsun45:8000/project/linux-block/list/?series=630
version: 2

@blktests-ci-block-trial

Copy link
Copy Markdown
Author

Upstream branch: bd5f485
series: http://redsun45:8000/project/linux-block/list/?series=630
version: 2

@blktests-ci-block-trial

Copy link
Copy Markdown
Author

Upstream branch: 59e6295
series: http://redsun45:8000/project/linux-block/list/?series=630
version: 2

@blktests-ci-block-trial

Copy link
Copy Markdown
Author

Upstream branch: 98f21c5
series: http://redsun45:8000/project/linux-block/list/?series=630
version: 2

@blktests-ci-block-trial

Copy link
Copy Markdown
Author

Upstream branch: cb8a75e
series: http://redsun45:8000/project/linux-block/list/?series=630
version: 2

@blktests-ci-block-trial

Copy link
Copy Markdown
Author

Upstream branch: a4ff2be
series: http://redsun45:8000/project/linux-block/list/?series=630
version: 2

@blktests-ci-block-trial

Copy link
Copy Markdown
Author

Upstream branch: 9d2ed02
series: http://redsun45:8000/project/linux-block/list/?series=630
version: 2

@blktests-ci-block-trial

Copy link
Copy Markdown
Author

Upstream branch: c84d3e3
series: http://redsun45:8000/project/linux-block/list/?series=630
version: 2

@blktests-ci-block-trial

Copy link
Copy Markdown
Author

Upstream branch: 77ae27f
series: http://redsun45:8000/project/linux-block/list/?series=630
version: 2

@blktests-ci-block-trial

Copy link
Copy Markdown
Author

Upstream branch: 7f063b2
series: http://redsun45:8000/project/linux-block/list/?series=630
version: 2

Zhenxian Ma added 2 commits August 21, 2026 15:12
For an O_DIRECT | O_DSYNC write, dio_bio_write_op() adds REQ_FUA to the
bio, so the data is durable once the direct I/O returns.  The
unconditional generic_write_sync() in blkdev_write_iter() then issues a
REQ_PREFLUSH that is redundant.

Skip it when the direct path already provided durability via FUA.  A
need_sync flag, clear by default, is set only for buffered writes and
for the buffered fallback after a partial direct write.

Measured on a Seagate ST20000NM007D (20 TB, 7200 rpm, fua=1,
write_cache=write back), Linux v7.2.0-rc7, single-threaded pwrite()
loop opening the raw block device with O_WRONLY | O_DIRECT | O_DSYNC,
4 KiB writes for 60 s:

  Sequential 4 KiB writes:
                            baseline    patched
    IOPS                       119.7     7497.0
    avg latency (us)            8357        133
    p50 latency (us)            8346        127
    p99 latency (us)            8368        395
    p99.9 latency (us)          8728        569

  Random 4 KiB writes (100 GiB span):
                            baseline    patched
    IOPS                       156.1      666.4
    avg latency (us)            6405       1500
    p50 latency (us)            6186       1450
    p99 latency (us)           16133       2285
    p99.9 latency (us)         17250       9916

Signed-off-by: Zhenxian Ma <mzx199711@gmail.com>
Signed-off-by: Zhenxian Ma <mazhenxian@xiaohongshu.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
When a block device does not support FUA natively, the block layer
emulates it by adding a cache flush to every write bio.  An O_DSYNC
direct write that spans N bios then costs N flushes, rather than the
single generic_write_sync() issued after the write completes.

Introduce blkdev_dio_fua() to decide when REQ_FUA is set.  A synchronous
write can rely on generic_write_sync() when the device lacks FUA, so it
sets REQ_FUA only when bdev_fua() is true.  An asynchronous write
completes in blkdev_bio_end_io() and cannot call the blocking
generic_write_sync(), so it keeps REQ_FUA (emulated when needed) to stay
durable.

Suggested-by: Christoph Hellwig <hch@infradead.org>
Signed-off-by: Zhenxian Ma <mzx199711@gmail.com>
Signed-off-by: Zhenxian Ma <mazhenxian@xiaohongshu.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
@blktests-ci-block-trial

Copy link
Copy Markdown
Author

Upstream branch: 818bebe
series: http://redsun45:8000/project/linux-block/list/?series=630
version: 2

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants