Thread (25 messages) 25 messages, 5 authors, 2025-08-21

Re: [PATCHv3 2/3] block: decrement block_rq_qos static key in rq_qos_del()

From: Yu Kuai <hidden>
Date: 2025-08-14 09:14:55

Hi,

在 2025/08/14 16:24, Nilay Shroff 写道:
rq_qos_add() increments the block_rq_qos static key when a QoS
policy is attached. When a QoS policy is removed via rq_qos_del(),
we must symmetrically decrement the static key. If this removal drops
the last QoS policy from the queue (q->rq_qos becomes NULL), the
static branch can be disabled and the jump label patched to a NOP,
avoiding overhead on the hot path.

This change ensures rq_qos_add()/rq_qos_del() keep the
block_rq_qos static key balanced and prevents leaving the branch
permanently enabled after the last policy is removed.
BTW, this problem is unlikely to happen in real users cases, because
rq_qos_del is only called from error path, where activate cgroup policy
failed with -ENOMEM.
quoted hunk ↗ jump to hunk
Fixes: 033b667a823e ("block: blk-rq-qos: guard rq-qos helpers by static key")
Signed-off-by: Nilay Shroff <redacted>
---
  block/blk-rq-qos.c | 1 +
  1 file changed, 1 insertion(+)
diff --git a/block/blk-rq-qos.c b/block/blk-rq-qos.c
index 848591fb3c57..b1e24bb85ad2 100644
--- a/block/blk-rq-qos.c
+++ b/block/blk-rq-qos.c
@@ -374,6 +374,7 @@ void rq_qos_del(struct rq_qos *rqos)
  	for (cur = &q->rq_qos; *cur; cur = &(*cur)->next) {
  		if (*cur == rqos) {
  			*cur = rqos->next;
+			static_branch_dec(&block_rq_qos);
  			break;
  		}
  	}
Reviewed-by: Yu Kuai <redacted>
Thanks
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help