+static void blk_mq_quiesce_blocking_queue_async_wait(struct request_queue *q)
+{
+ struct blk_mq_hw_ctx *hctx;
+ unsigned int i;
+
+ queue_for_each_hw_ctx(q, hctx, i) {
+ WARN_ON_ONCE(!(hctx->flags & BLK_MQ_F_BLOCKING));
+ if (!hctx->rcu_sync) {
+ synchronize_srcu(hctx->srcu);
+ continue;
+ }
+ wait_for_completion(&hctx->rcu_sync->completion);
+ destroy_rcu_head(&hctx->rcu_sync->head);
Leaking rcu_sync, and not clearing it across quiesce contexts. Needs:
kfree(hctx->rcu_sync);
hctx->rcu_sync = NULL;
Good catch, will wait for some more review and submit a v6.