Re: [PATCH 0/2] blk-mq: switch from preempt_disable/enable to get/put_cpu

From: Jens Axboe
Date: Tue Nov 11 2014 - 13:05:58 EST


On 2014-11-09 20:16, Jens Axboe wrote:
On 2014-11-07 15:03, Paolo Bonzini wrote:
blk-mq is using preempt_disable/enable in order to ensure that the
queue runners are placed on the right CPU. This does not work with
the RT patches, because __blk_mq_run_hw_queue takes a non-raw
spinlock with the preemption-disabled region. If there is contention
on the lock, this violates the rules for preemption-disabled regions.

While this could be fixed easily within the RT patches just by doing
migrate_disable/enable (note: this was not tested :)), we can do
better. The first patch concentrates the preempt_disable/enable in
a single place in blk_mq_run_hw_queue, and also avoids useless calls
when the caller wants to start __blk_mq_run_hw_queue asynchronously.
(There is already a call to __blk_mq_run_hw_queue that does not disable
preemption in blk-flush.c; not coincidentially, it passes async=true).

Once this is done, it is trivial to use get/put_cpu instead of
preempt_disable/smp_processor_id/preempt_enable, which is what the
second patch does. The RT patches then can change this to use
get_cpu_light.

With these changes (and the additional switch to get_cpu_light),
virtio-blk can be used again with RT kernels.

These both look good. I'll double check and run through some testing,
then apply for 3.19 if it all passes.

Looks fine to me, I've applied it now. Thanks!

--
Jens Axboe

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/