irq_work, smp: Allow irq_work on call_single_queue
Currently irq_work_queue_on() will issue an unconditional arch_send_call_function_single_ipi() and has the handler do irq_work_run(). This is unfortunate in that it makes the IPI handler look at a second cacheline and it misses the opportunity to avoid the IPI. Instead note that struct irq_work and struct __call_single_data are very similar in layout, so use a few bits in the flags word to encode a type and stick the irq_work on the call_single_queue list. Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Ingo Molnar <mingo@kernel.org> Link: https://lore.kernel.org/r/20200526161908.011635912@infradead.org
This commit is contained in:

committed by
Ingo Molnar

parent
b2a02fc43a
commit
4b44a21dd6
@@ -13,6 +13,8 @@
|
||||
* busy NULL, 2 -> {free, claimed} : callback in progress, can be claimed
|
||||
*/
|
||||
|
||||
/* flags share CSD_FLAG_ space */
|
||||
|
||||
#define IRQ_WORK_PENDING BIT(0)
|
||||
#define IRQ_WORK_BUSY BIT(1)
|
||||
|
||||
@@ -23,9 +25,12 @@
|
||||
|
||||
#define IRQ_WORK_CLAIMED (IRQ_WORK_PENDING | IRQ_WORK_BUSY)
|
||||
|
||||
/*
|
||||
* structure shares layout with single_call_data_t.
|
||||
*/
|
||||
struct irq_work {
|
||||
atomic_t flags;
|
||||
struct llist_node llnode;
|
||||
atomic_t flags;
|
||||
void (*func)(struct irq_work *);
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user