All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jens Axboe <axboe@kernel.dk>
To: Nilay Shroff <nilay@linux.ibm.com>, Ming Lei <ming.lei@redhat.com>
Cc: linux-block@vger.kernel.org, kch@nvidia.com,
	shinichiro.kawasaki@wdc.com, hch@lst.de, gjoyce@ibm.com
Subject: Re: [PATCH 0/2] block: blk-rq-qos: replace static key with atomic bitop
Date: Tue, 5 Aug 2025 19:28:30 -0600	[thread overview]
Message-ID: <d4d21177-e49e-4959-b68c-707a15dccf73@kernel.dk> (raw)
In-Reply-To: <682f0f43-733a-4c04-91ed-5665815128bc@linux.ibm.com>

On 8/4/25 10:58 PM, Nilay Shroff wrote:
> 
> 
> On 8/4/25 7:12 PM, Ming Lei wrote:
>> On Mon, Aug 04, 2025 at 05:51:09PM +0530, Nilay Shroff wrote:
>>> This patchset replaces the use of a static key in the I/O path (rq_qos_
>>> xxx()) with an atomic queue flag (QUEUE_FLAG_QOS_ENABLED). This change
>>> is made to eliminate a potential deadlock introduced by the use of static
>>> keys in the blk-rq-qos infrastructure, as reported by lockdep during 
>>> blktests block/005[1].
>>>
>>> The original static key approach was introduced to avoid unnecessary
>>> dereferencing of q->rq_qos when no blk-rq-qos module (e.g., blk-wbt or
>>> blk-iolatency) is configured. While efficient, enabling a static key at
>>> runtime requires taking cpu_hotplug_lock and jump_label_mutex, which 
>>> becomes problematic if the queue is already frozen — causing a reverse
>>> dependency on ->freeze_lock. This results in a lockdep splat indicating
>>> a potential deadlock.
>>>
>>> To resolve this, we now gate q->rq_qos access with a q->queue_flags
>>> bitop (QUEUE_FLAG_QOS_ENABLED), avoiding the static key and the associated
>>> locking altogether.
>>>
>>> I compared both static key and atomic bitop implementations using ftrace
>>> function graph tracer over ~50 invocations of rq_qos_issue() while ensuring
>>> blk-wbt/blk-iolatency were disabled (i.e., no QoS functionality). For
>>> easy comparision, I made rq_qos_issue() noinline. The comparision was
>>> made on PowerPC machine.
>>>
>>> Static Key (disabled : QoS is not configured):
>>> 5d0: 00 00 00 60     nop    # patched in by static key framework (not taken)
>>> 5d4: 20 00 80 4e     blr    # return (branch to link register)
>>>
>>> Only a nop and blr (branch to link register) are executed — very lightweight.
>>>
>>> atomic bitop (QoS is not configured):
>>> 5d0: 20 00 23 e9     ld      r9,32(r3)     # load q->queue_flags
>>> 5d4: 00 80 29 71     andi.   r9,r9,32768   # check QUEUE_FLAG_QOS_ENABLED (bit 15)
>>> 5d8: 20 00 82 4d     beqlr                 # return if bit not set
>>>
>>> This performs an ld and and andi. before returning. Slightly more work, 
>>> but q->queue_flags is typically hot in cache during I/O submission.
>>>
>>> With Static Key (disabled):
>>> Duration (us): min=0.668 max=0.816 avg≈0.750
>>>
>>> With atomic bitop QUEUE_FLAG_QOS_ENABLED (bit not set):
>>> Duration (us): min=0.684 max=0.834 avg≈0.759
>>>
>>> As expected, both versions are almost similar in cost. The added latency
>>> from an extra ld and andi. is in the range of ~9ns.
>>>
>>> There're two patches in the series. The first patch replaces static key
>>> with QUEUE_FLAG_QOS_ENABLED. The second patch ensures that we disable
>>> the QUEUE_FLAG_QOS_ENABLED when the queue no longer has any associated
>>> rq_qos policies.
>>>
>>> As usual, feedback and review comments are welcome!
>>>
>>> [1] https://lore.kernel.org/linux-block/4fdm37so3o4xricdgfosgmohn63aa7wj3ua4e5vpihoamwg3ui@fq42f5q5t5ic/
>>
>>
>> Another approach is to call memalloc_noio_save() in cpu hotplug code...
>>
> Yes that would help fix this. However per the general usage of GFP_NOIO scope in 
> kernel, it is used when we're performing memory allocations in a context where I/O
> must not be initiated, because doing so could cause deadlocks or recursion. 
> 
> So we typically, use GFP_NOIO in a code path that is already doing I/O, such as:
> - In block layer context: during request submission 
> - Filesystem writeback, or swap-out.
> - Memory reclaim or writeback triggered by memory pressure.
> 
> The cpu hotplug code may not be running in any of the above context. So
> IMO, adding memalloc_noio_save() in the cpu hotplug code would not be 
> a good idea, isn't it?

Please heed Ming's advice, moving this from a static key to an atomic
queue flags ops is pointless, may as well kill it at that point.

I see v2 is out now with the exact same approach.

-- 
Jens Axboe


  parent reply	other threads:[~2025-08-06  1:28 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-08-04 12:21 [PATCH 0/2] block: blk-rq-qos: replace static key with atomic bitop Nilay Shroff
2025-08-04 12:21 ` [PATCH 1/2] block: avoid cpu_hotplug_lock depedency on freeze_lock Nilay Shroff
2025-08-04 12:21 ` [PATCH 2/2] block: clear QUEUE_FLAG_QOS_ENABLED in rq_qos_del() Nilay Shroff
2025-08-04 13:42 ` [PATCH 0/2] block: blk-rq-qos: replace static key with atomic bitop Ming Lei
2025-08-05  4:58   ` Nilay Shroff
2025-08-05 12:44     ` Ming Lei
2025-08-05 17:05       ` Nilay Shroff
2025-08-06  7:21         ` Ming Lei
2025-08-06  1:28     ` Jens Axboe [this message]
2025-08-06  1:44       ` Yu Kuai
2025-08-13 11:20         ` Nilay Shroff
2025-08-13 12:16           ` Jens Axboe
2025-08-13 15:01             ` Nilay Shroff
2025-08-06  5:13       ` Nilay Shroff
2025-08-05  9:28 ` Yu Kuai
2025-08-05 12:14   ` Nilay Shroff

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=d4d21177-e49e-4959-b68c-707a15dccf73@kernel.dk \
    --to=axboe@kernel.dk \
    --cc=gjoyce@ibm.com \
    --cc=hch@lst.de \
    --cc=kch@nvidia.com \
    --cc=linux-block@vger.kernel.org \
    --cc=ming.lei@redhat.com \
    --cc=nilay@linux.ibm.com \
    --cc=shinichiro.kawasaki@wdc.com \
    /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.