From: Stefan Roesch <[email protected]>
To: <[email protected]>, <[email protected]>,
<[email protected]>, <[email protected]>
Cc: <[email protected]>
Subject: [PATCH v2 00/13] Support sync buffered writes for io-uring
Date: Fri, 18 Feb 2022 11:57:26 -0800 [thread overview]
Message-ID: <[email protected]> (raw)
This patch series adds support for async buffered writes. Currently
io-uring only supports buffered writes in the slow path, by processing
them in the io workers. With this patch series it is now possible to
support buffered writes in the fast path. To be able to use the fast
path the required pages must be in the page cache or they can be loaded
with noio. Otherwise they still get punted to the slow path.
If a buffered write request requires more than one page, it is possible
that only part of the request can use the fast path, the resst will be
completed by the io workers.
Support for async buffered writes:
Patch 1: fs: Add flags parameter to __block_write_begin_int
Add a flag parameter to the function __block_write_begin_int
to allow specifying a nowait parameter.
Patch 2: mm: Introduce do_generic_perform_write
Introduce a new do_generic_perform_write function. The function
is split off from the existing generic_perform_write() function.
It allows to specify an additional flag parameter. This parameter
is used to specify the nowait flag.
Patch 3: mm: Add support for async buffered writes
For async buffered writes allocate pages without blocking on the
allocation.
Patch 4: fs: split off __alloc_page_buffers function
Split off __alloc_page_buffers() function with new gfp_t parameter.
Patch 5: fs: split off __create_empty_buffers function
Split off __create_empty_buffers() function with new gfp_t parameter.
Patch 6: fs: Add gfp_t parameter to create_page_buffers()
Add gfp_t parameter to create_page_buffers() function. Use atomic
allocation for async buffered writes.
Patch 7: fs: add support for async buffered writes
Return -EAGAIN instead of -ENOMEM for async buffered writes. This
will cause the write request to be processed by an io worker.
Patch 8: io_uring: add support for async buffered writes
This enables the async buffered writes for block devices in io_uring.
Buffered writes are enabled for blocks that are already in the page
cache or can be acquired with noio.
Patch 9: io_uring: Add tracepoint for short writes
Support for write throttling of async buffered writes:
Patch 10: sched: add new fields to task_struct
Add two new fields to the task_struct. These fields store the
deadline after which writes are no longer throttled.
Patch 11: mm: support write throttling for async buffered writes
This changes the balance_dirty_pages function to take an additonal
parameter. When nowait is specified the write throttling code no
longer waits synchronously for the deadline to expire. Instead
it sets the fields in task_struct. Once the deadline expires the
fields are reset.
Patch 12: io_uring: support write throttling for async buffered writes
Adds support to io_uring for write throttling. When the writes
are throttled, the write requests are added to the pending io list.
Once the write throttling deadline expires, the writes are submitted.
Enable async buffered write support
Patch 13: fs: add flag to support async buffered writes
This sets the flags that enables async buffered writes for block
devices.
Testing:
This patch has been tested with xfstests and fio.
Peformance results:
For fio the following results have been obtained with a queue depth of
1 and 4k block size (runtime 600 secs):
sequential writes:
without patch with patch
throughput: 329 Mib/s 1032Mib/s
iops: 82k 264k
slat (nsec) 2332 3340
clat (nsec) 9017 60
CPU util%: 37% 78%
random writes:
without patch with patch
throughput: 307 Mib/s 909Mib/s
iops: 76k 227k
slat (nsec) 2419 3780
clat (nsec) 9934 59
CPU util%: 57% 88%
For an io depth of 1, the new patch improves throughput by close to 3
times and also the latency is considerably reduced. To achieve the same
or better performance with the exisiting code an io depth of 4 is required.
Especially for mixed workloads this is a considerable improvement.
Changes:
V2: - removed patch 3 from patch series 1
- replaced parameter aop_flags with with gfp_t in create_page_buffers()
- Moved gfp flags to callers of create_page_buffers()
- Removed changing of FGP_NOWAIT in __filemap_get_folio() and moved gfp
flags to caller of __filemap_get_folio()
- Renamed AOP_FLAGS_NOWAIT to AOP_FLAG_NOWAIT
Stefan Roesch (13):
fs: Add flags parameter to __block_write_begin_int
mm: Introduce do_generic_perform_write
mm: Add support for async buffered writes
fs: split off __alloc_page_buffers function
fs: split off __create_empty_buffers function
fs: Add gfp_t parameter to create_page_buffers()
fs: add support for async buffered writes
io_uring: add support for async buffered writes
io_uring: Add tracepoint for short writes
sched: add new fields to task_struct
mm: support write throttling for async buffered writes
io_uring: support write throttling for async buffered writes
block: enable async buffered writes for block devices.
block/fops.c | 5 +-
fs/buffer.c | 98 +++++++++++++++---------
fs/internal.h | 3 +-
fs/io_uring.c | 130 +++++++++++++++++++++++++++++---
fs/iomap/buffered-io.c | 4 +-
fs/read_write.c | 3 +-
include/linux/fs.h | 4 +
include/linux/sched.h | 3 +
include/linux/writeback.h | 1 +
include/trace/events/io_uring.h | 25 ++++++
kernel/fork.c | 1 +
mm/filemap.c | 23 ++++--
mm/folio-compat.c | 12 ++-
mm/page-writeback.c | 54 +++++++++----
14 files changed, 289 insertions(+), 77 deletions(-)
base-commit: 9195e5e0adbb8a9a5ee9ef0f9dedf6340d827405
--
2.30.2
next reply other threads:[~2022-02-18 19:58 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-02-18 19:57 Stefan Roesch [this message]
2022-02-18 19:57 ` [PATCH v2 01/13] fs: Add flags parameter to __block_write_begin_int Stefan Roesch
2022-02-18 19:59 ` Matthew Wilcox
2022-02-18 20:08 ` Stefan Roesch
2022-02-18 20:13 ` Matthew Wilcox
2022-02-18 20:14 ` Stefan Roesch
2022-02-18 20:22 ` Matthew Wilcox
2022-02-18 20:25 ` Stefan Roesch
2022-02-18 20:35 ` Matthew Wilcox
2022-02-18 20:39 ` Stefan Roesch
2022-02-18 19:57 ` [PATCH v2 02/13] mm: Introduce do_generic_perform_write Stefan Roesch
2022-02-18 19:57 ` [PATCH v2 03/13] mm: Add support for async buffered writes Stefan Roesch
2022-02-18 19:57 ` [PATCH v2 04/13] fs: split off __alloc_page_buffers function Stefan Roesch
2022-02-18 20:42 ` Matthew Wilcox
2022-02-18 20:50 ` Stefan Roesch
2022-02-19 7:35 ` Christoph Hellwig
2022-02-20 4:23 ` Matthew Wilcox
2022-02-20 4:38 ` Jens Axboe
2022-02-20 4:51 ` Jens Axboe
2022-02-22 8:18 ` Christoph Hellwig
2022-02-22 23:19 ` Jens Axboe
2022-02-18 19:57 ` [PATCH v2 05/13] fs: split off __create_empty_buffers function Stefan Roesch
2022-02-18 19:57 ` [PATCH v2 06/13] fs: Add gfp_t parameter to create_page_buffers() Stefan Roesch
2022-02-21 0:18 ` kernel test robot
2022-02-18 19:57 ` [PATCH v2 07/13] fs: add support for async buffered writes Stefan Roesch
2022-02-18 19:57 ` [PATCH v2 08/13] io_uring: " Stefan Roesch
2022-02-18 19:57 ` [PATCH v2 09/13] io_uring: Add tracepoint for short writes Stefan Roesch
2022-02-18 19:57 ` [PATCH v2 10/13] sched: add new fields to task_struct Stefan Roesch
2022-02-18 19:57 ` [PATCH v2 11/13] mm: support write throttling for async buffered writes Stefan Roesch
2022-02-18 19:57 ` [PATCH v2 12/13] io_uring: " Stefan Roesch
2022-02-18 19:57 ` [PATCH v2 13/13] block: enable async buffered writes for block devices Stefan Roesch
2022-02-20 22:38 ` [PATCH v2 00/13] Support sync buffered writes for io-uring Dave Chinner
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 \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
/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