diff options
author | Frederic Weisbecker <fweisbec@gmail.com> | 2013-02-05 00:48:46 +0100 |
---|---|---|
committer | Frederic Weisbecker <fweisbec@gmail.com> | 2013-02-05 00:48:46 +0100 |
commit | 077931446b85e7858bf9dc0927cd116669b965d2 (patch) | |
tree | 02fbdf4a42b30b841a61aca399bd0ac6a5c308e6 /include/linux/irq_work.h | |
parent | f7c819c020db9796ae3a662b82a310617f92b15b (diff) | |
parent | 74876a98a87a115254b3a66a14b27320b7f0acaa (diff) | |
download | linux-stable-077931446b85e7858bf9dc0927cd116669b965d2.tar.gz linux-stable-077931446b85e7858bf9dc0927cd116669b965d2.tar.bz2 linux-stable-077931446b85e7858bf9dc0927cd116669b965d2.zip |
Merge branch 'nohz/printk-v8' into irq/core
Conflicts:
kernel/irq_work.c
Add support for printk in full dynticks CPU.
* Don't stop tick with irq works pending. This
fix is generally useful and concerns archs that
can't raise self IPIs.
* Flush irq works before CPU offlining.
* Introduce "lazy" irq works that can wait for the
next tick to be executed, unless it's stopped.
* Implement klogd wake up using irq work. This
removes the ad-hoc printk_tick()/printk_needs_cpu()
hooks and make it working even in dynticks mode.
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Diffstat (limited to 'include/linux/irq_work.h')
-rw-r--r-- | include/linux/irq_work.h | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/include/linux/irq_work.h b/include/linux/irq_work.h index ce60c084635b..f5dbce50466e 100644 --- a/include/linux/irq_work.h +++ b/include/linux/irq_work.h @@ -3,6 +3,20 @@ #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; @@ -20,4 +34,10 @@ void 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 */ |