On Thu, Jun 11, 2020 at 08:44:42AM +0200, Christoph Hellwig wrote: > /* > * Setup and invoke a run of 'trigger_softirq' on the given cpu. > */ > @@ -681,19 +689,8 @@ static void __blk_complete_request(struct request *req) > * avoids IPI sending from current CPU to the first CPU of a group. > */ > if (ccpu == cpu || shared) { > - struct list_head *list; > do_local: > - list = this_cpu_ptr(&blk_cpu_done); > - list_add_tail(&req->ipi_list, list); > - > - /* > - * if the list only contains our just added request, > - * signal a raise of the softirq. If there are already > - * entries there, someone already raised the irq but it > - * hasn't run yet. > - */ > - if (list->next == &req->ipi_list) > - raise_softirq_irqoff(BLOCK_SOFTIRQ); > + blk_mq_trigger_softirq(req); > } else if (raise_blk_irq(ccpu, req)) > goto do_local; Couldn't this be folded into the previous condition, e.g if (ccpu == cpu || shared || raised_blk_irq(ccpu, req)) ?