bc6679aef6
On irq work initialization, let the user choose to define it as "lazy" or not. "Lazy" means that we don't want to send an IPI (provided the arch can anyway) when we enqueue this work but we rather prefer to wait for the next timer tick to execute our work if possible. This is going to be a benefit for non-urgent enqueuers (like printk in the future) that may prefer not to raise an IPI storm in case of frequent enqueuing on short periods of time. Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> Acked-by: Steven Rostedt <rostedt@goodmis.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Ingo Molnar <mingo@kernel.org> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
43 lines
1 KiB
C
43 lines
1 KiB
C
#ifndef _LINUX_IRQ_WORK_H
|
|
#define _LINUX_IRQ_WORK_H
|
|
|
|
#include <linux/llist.h>
|
|
|
|
/*
|
|
* An entry can be in one of four states:
|
|
*
|
|
* free NULL, 0 -> {claimed} : free to be used
|
|
* claimed NULL, 3 -> {pending} : claimed to be enqueued
|
|
* pending next, 3 -> {busy} : queued, pending callback
|
|
* busy NULL, 2 -> {free, claimed} : callback in progress, can be claimed
|
|
*/
|
|
|
|
#define IRQ_WORK_PENDING 1UL
|
|
#define IRQ_WORK_BUSY 2UL
|
|
#define IRQ_WORK_FLAGS 3UL
|
|
#define IRQ_WORK_LAZY 4UL /* Doesn't want IPI, wait for tick */
|
|
|
|
struct irq_work {
|
|
unsigned long flags;
|
|
struct llist_node llnode;
|
|
void (*func)(struct irq_work *);
|
|
};
|
|
|
|
static inline
|
|
void init_irq_work(struct irq_work *work, void (*func)(struct irq_work *))
|
|
{
|
|
work->flags = 0;
|
|
work->func = func;
|
|
}
|
|
|
|
bool irq_work_queue(struct irq_work *work);
|
|
void irq_work_run(void);
|
|
void irq_work_sync(struct irq_work *work);
|
|
|
|
#ifdef CONFIG_IRQ_WORK
|
|
bool irq_work_needs_cpu(void);
|
|
#else
|
|
static bool irq_work_needs_cpu(void) { return false; }
|
|
#endif
|
|
|
|
#endif /* _LINUX_IRQ_WORK_H */
|