Skip to content

[6.18] bcache IO hinting updates - #41

Draft
kakra wants to merge 5 commits into
base-6.18from
rebase-6.18/bcache-updates
Draft

kakra wants to merge 5 commits into
base-6.18from
rebase-6.18/bcache-updates

Conversation

@kakra

@kakra kakra commented Dec 14, 2025

Copy link
Copy Markdown
Owner

Export patch series: https://github.com/kakra/linux/pull/41.patch

  • based on an idea by Eric Wheeler
  • low priority IO requests bypass the cache to reduce SSD wear from backups and maintenance jobs

kakra and others added 3 commits December 13, 2025 21:43
…ack hints

Add sysfs entries to support to hint for bypass/writeback by the ioprio
assigned to the bio.  If the bio is unassigned, use current's io-context
ioprio for cache writeback or bypass (configured per-process with
`ionice`).

Having idle IOs bypass the cache can increase performance elsewhere
since you probably don't care about their performance.  In addition,
this prevents idle IOs from promoting into (polluting) your cache and
evicting blocks that are more important elsewhere.

If you really nead the performance at the expense of SSD wearout,
then configure ioprio_writeback and set your `ionice` appropriately.

For example:
	echo 2,7 > /sys/block/bcache0/bcache/ioprio_bypass
	echo 2,0 > /sys/block/bcache0/bcache/ioprio_writeback

See the documentation commit for details.

v2: Removed calls to get_task_io_context()
v3: bio_prio() macro has been deleted

Co-authored-by: Eric Wheeler <bcache@linux.ewheeler.net>
Signed-off-by: Eric Wheeler <bcache@linux.ewheeler.net>
Acked-by: Kent Overstreet <kent.overstreet@gmail.com>
Tested-by: Kai Krakow <kai@kaishome.de>
Cc: nix@esperi.org.uk
Signed-off-by: Kai Krakow <kai@kaishome.de>
v2: get_task_io_context() no longer exists in the kernel

Signed-off-by: Eric Wheeler <bcache@linux.ewheeler.net>
Signed-off-by: Kai Krakow <kai@kaishome.de>
Even if ioprio_bypass hints bypassing the request, we still allow it
for REQ_META|REQ_PRIO bio.

Cc: Eric Wheeler <bcache@linux.ewheeler.net>
Signed-off-by: Kai Krakow <kai@kaishome.de>
@kakra kakra changed the title Rebase 6.18/bcache updates [6.18] bcache IO hinting updates Dec 14, 2025
It seems to queue a lot of work, and I've seen messages like this,
suggesting to switch to WQ_UNBOUND:

> kernel: workqueue: cache_lookup hogged CPU for >10000us 11 times, consider switching to WQ_UNBOUND

Short observation shows, that this might also improve perceived
desktop responsiveness. But this needs more testing.

Signed-off-by: Kai Krakow <kai@kaishome.de>
@kakra

kakra commented Jan 5, 2026

Copy link
Copy Markdown
Owner Author

Added a commit to prevent the following message:

kernel: workqueue: cache_lookup hogged CPU for >10000us 11 times, consider switching to WQ_UNBOUND

Early perceived result is improved desktop responsiveness.

bcache: check ioprio_bypass, not ioprio_writeback, for the bypass hint

check_should_bypass() only honoured the ioprio_bypass hint if
ioprio_writeback was valid. ioprio_writeback defaults to (0,0), i.e.
IOPRIO_CLASS_NONE, so with the default writeback hint the bypass hint
never triggered, no matter what ioprio_bypass was set to. Low-priority
IO (e.g. ionice -c3 dedup crawlers like bees) was promoted into the
cache and evicted the working set, which is exactly what the hint is
meant to prevent.

The condition was copied from should_writeback() when the hints were
introduced in commit a8b349f ("bcache: introduce bcache sysfs
entries for ioprio-based bypass/writeback hints"). Check the validity of
ioprio_bypass instead, so both hints can be enabled independently.

Observed with ioprio_bypass=2,7, ioprio_writeback=0,0 and bees running
with ionice idle: the bcache_read tracepoint showed zero bypassed reads
on writearound devices while bees read cold extents.

Signed-off-by: Kai Krakow <kai@kaishome.de>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant