Re: [RFC PATCH 1/1] block: charge passthrough requests to the submitter's cgroup

From: Tejun Heo

Date: Mon Sep 21 2026 - 12:55:01 EST


On Mon, Sep 21, 2026 at 03:06:47PM +0800, Tao Cui wrote:
> From: Tao Cui <cuitao@xxxxxxxxxx>
>
> Passthrough requests (SG_IO, bsg, nvme passthrough ioctls and uring
> commands) are dispatched via blk_execute_rq{,_nowait}() without ever
> passing through submit_bio(), so the bio mapped by blk_rq_map_user()
> carries no blkcg association: the transferred bytes never show up in
> cgroup io.stat, and every rq_qos policy on the queue (iocost,
> iolatency, wbt) is bypassed, as is blk-throttle, which hooks
> submit_bio_noacct() directly rather than going through rq_qos.
>
> A quick demonstration on a scsi_debug device with iocost enabled and
> vrate pinned to its 1% floor: a direct fio writer was throttled ~10x
> while the same cgroup issuing sg_dd writes ran at full device speed
> with zero io.stat accounting.
>
> Associate the mapped bio with the submitter's blkcg at dispatch time
> and run the regular bio accounting (blk_cgroup_bio_start()) and
> rq_qos throttle paths with it. DRV_IN/DRV_OUT commands are mapped to
> READ/WRITE so io.stat classifies their bytes normally; request
> completion already pairs with the throttle through bio_endio() ->
> rq_qos_done_bio().
>
> The charge is gated by opcode (READ/WRITE/DRV_IN/DRV_OUT) and to
> queues that already have a gendisk: commands issued during device
> probing (SCSI INQUIRY etc.) have no gendisk yet and stay exempt,
> following the same probe-exemption reasoning as the passthrough
> iostats support.

Do you have an actual use case where this matters?

Thanks.

--
tejun