From: Tao Cui <cui.tao@linux.dev>
To: tj@kernel.org, josef@toxicopanda.com, axboe@kernel.dk
Cc: cgroups@vger.kernel.org, linux-block@vger.kernel.org,
linux-kernel@vger.kernel.org, cui.tao@linux.dev,
Tao Cui <cuitao@kylinos.cn>
Subject: [PATCH 1/4] blk-iocost: charge flushes as pageless random writes
Date: Tue, 8 Sep 2026 10:21:32 +0800 [thread overview]
Message-ID: <20260908022135.1429281-2-cui.tao@linux.dev> (raw)
In-Reply-To: <20260908022135.1429281-1-cui.tao@linux.dev>
From: Tao Cui <cuitao@kylinos.cn>
Standalone flushes issued by blkdev_issue_flush() are represented as
dataless REQ_OP_WRITE | REQ_PREFLUSH bios, which
calc_vtime_cost_builtin() prices at zero. The flush component of
flush-heavy workloads such as database commits, journal flushes, and
metadata sync is thus neither charged nor throttled: a cgroup at 1% weight
can issue ~510k flushes per 12s, monopolizing the device while iocost
reports zero usage.
Price them as pageless random writes (LCOEF_WRANDIO), which provides
an approximation of the device time consumed by a flush. For
profiles where WRANDIO clamps to zero (ssd_dfl / ssd_fast), use a
one-page floor (LCOEF_WPAGE). After this patch, the same 1%-weight
cgroup is limited to 24 flushes per 12s; on ext4, write+fsync
workloads are correctly accounted through the journal layer (~2.2us
per flush on the ssd_fast profile).
Fixes: 7caa47151ab2 ("blkcg: implement blk-iocost")
Signed-off-by: Tao Cui <cuitao@kylinos.cn>
---
block/blk-iocost.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/block/blk-iocost.c b/block/blk-iocost.c
index 2745bffcd5ee..abc512532ed9 100644
--- a/block/blk-iocost.c
+++ b/block/blk-iocost.c
@@ -2533,8 +2533,8 @@ static void calc_vtime_cost_builtin(struct bio *bio, struct ioc_gq *iocg,
u64 seek_pages = 0;
u64 cost = 0;
- /* Can't calculate cost for empty bio */
- if (!bio->bi_iter.bi_size)
+ /* Dataless WRITE|REQ_PREFLUSH (standalone flush) is priced below */
+ if (!bio->bi_iter.bi_size && !(bio->bi_opf & REQ_PREFLUSH))
goto out;
switch (bio_op(bio)) {
@@ -2544,6 +2544,15 @@ static void calc_vtime_cost_builtin(struct bio *bio, struct ioc_gq *iocg,
coef_page = ioc->params.lcoefs[LCOEF_RPAGE];
break;
case REQ_OP_WRITE:
+ if (!bio->bi_iter.bi_size) {
+ /*
+ * dataless WRITE|REQ_PREFLUSH: standalone flush;
+ * at least one page so fast profiles still charge
+ */
+ cost = max(ioc->params.lcoefs[LCOEF_WRANDIO],
+ ioc->params.lcoefs[LCOEF_WPAGE]);
+ goto out;
+ }
coef_seqio = ioc->params.lcoefs[LCOEF_WSEQIO];
coef_randio = ioc->params.lcoefs[LCOEF_WRANDIO];
coef_page = ioc->params.lcoefs[LCOEF_WPAGE];
--
2.43.0
next prev parent reply other threads:[~2026-09-08 2:22 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-08 2:21 [PATCH 0/4] blk-iocost: charge flushes and zone appends Tao Cui
2026-09-08 2:21 ` Tao Cui [this message]
2026-09-10 5:41 ` [PATCH 1/4] blk-iocost: charge flushes as pageless random writes Christoph Hellwig
2026-09-08 2:21 ` [PATCH 2/4] blk-iocost: charge zone appends as page-counted sequential writes Tao Cui
2026-09-08 2:21 ` [PATCH 3/4] blk-iocost: account zone append completions in latency stats Tao Cui
2026-09-10 5:39 ` Christoph Hellwig
2026-09-08 2:21 ` [PATCH 4/4] blk-iocost: fix stale comment in ioc_rqos_throttle() Tao Cui
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 \
--in-reply-to=20260908022135.1429281-2-cui.tao@linux.dev \
--to=cui.tao@linux.dev \
--cc=axboe@kernel.dk \
--cc=cgroups@vger.kernel.org \
--cc=cuitao@kylinos.cn \
--cc=josef@toxicopanda.com \
--cc=linux-block@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=tj@kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.