On Tue, Oct 27, 2020 at 06:05:15PM +0100, Thomas Gleixner wrote: > > Is there a way to raise a softirq and preferably place it on a given > > CPU without our IPI dance? That should be a win-win situation for > > everyone. > > Not really. Softirq pending bits are strictly per cpu and we don't have > locking or atomics to set them remotely. Even if we had that, then you'd > still need a mechanism to make sure that the remote CPU actually > processes them. So you'd still need an IPI of some sorts. Ok. I was hoping we could hide this in core code somehow, especially a peterz didn't like the use of smp_call_function_single_async in the blk-mq completion code very much. Sebastian, would this solve your preempt-rt and lockdep issues? diff --git a/block/blk-mq.c b/block/blk-mq.c index cdced4aca2e812..5c125fb11b5691 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -626,19 +626,7 @@ static void __blk_mq_complete_request_remote(void *data) { struct request *rq = data; - /* - * For most of single queue controllers, there is only one irq vector - * for handling I/O completion, and the only irq's affinity is set - * to all possible CPUs. On most of ARCHs, this affinity means the irq - * is handled on one specific CPU. - * - * So complete I/O requests in softirq context in case of single queue - * devices to avoid degrading I/O performance due to irqsoff latency. - */ - if (rq->q->nr_hw_queues == 1) - blk_mq_trigger_softirq(rq); - else - rq->q->mq_ops->complete(rq); + blk_mq_trigger_softirq(rq); } static inline bool blk_mq_complete_need_ipi(struct request *rq)