Re: [PATCH] blk-iocost: account flush sequence latency only once

From: Tao Cui

Date: Thu Oct 29 2026 - 21:49:48 EST


Hi, Zhe

在 2026/10/29 17:24, Zhe Liu 写道:
> A flush sequence with a DATA phase can complete its original request
> twice. Both completions invoke ioc_rqos_done(), causing the request to
> contribute two latency samples and adding the same queue wait time
> twice. This gives such requests disproportionate weight compared to
> ordinary writes, distorting the device-wide latency and queue wait
> feedback used to adjust iocost's virtual time rate.
>
> Skip requests marked RQF_FLUSH_SEQ in ioc_rqos_done(). The flag is set
> when the request enters the flush machinery and is still set when the
> data phase completes; blk_flush_restore_request() clears it before the
> final completion, so accounting happens only once, after the whole
> sequence finishes. The remaining sample covers the request's lifetime
> through any postflush, and its queue wait time is accumulated only
> once.
>
> Fixes: 7caa47151ab2e ("blkcg: implement blk-iocost")
> Cc: stable@xxxxxxxxxxxxxxx
> Signed-off-by: Zhe Liu <liuzhe1@xxxxxxxxxx>
> ---
> block/blk-iocost.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/block/blk-iocost.c b/block/blk-iocost.c
> index 2ae40138e041..601029221e6f 100644
> --- a/block/blk-iocost.c
> +++ b/block/blk-iocost.c
> @@ -2868,6 +2868,9 @@ static void ioc_rqos_done(struct rq_qos *rqos, struct request *rq)
> if (!ioc->enabled || !rq->alloc_time_ns || !rq->start_time_ns)
> return;
>
> + if (rq->rq_flags & RQF_FLUSH_SEQ)
> + return;
> +
> switch (req_op(rq)) {
> case REQ_OP_READ:
> pidx = QOS_RLAT;

Reviewed-by: Tao Cui <cuitao@xxxxxxxxxx>