]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
e360adbe PZ |
2 | #ifndef _LINUX_IRQ_WORK_H |
3 | #define _LINUX_IRQ_WORK_H | |
4 | ||
38aaf809 HY |
5 | #include <linux/llist.h> |
6 | ||
bc6679ae FW |
7 | /* |
8 | * An entry can be in one of four states: | |
9 | * | |
10 | * free NULL, 0 -> {claimed} : free to be used | |
11 | * claimed NULL, 3 -> {pending} : claimed to be enqueued | |
12 | * pending next, 3 -> {busy} : queued, pending callback | |
13 | * busy NULL, 2 -> {free, claimed} : callback in progress, can be claimed | |
14 | */ | |
15 | ||
6baf9e67 BG |
16 | #define IRQ_WORK_PENDING BIT(0) |
17 | #define IRQ_WORK_BUSY BIT(1) | |
18 | ||
19 | /* Doesn't want IPI, wait for tick: */ | |
20 | #define IRQ_WORK_LAZY BIT(2) | |
49915ac3 SAS |
21 | /* Run hard IRQ context, even on RT */ |
22 | #define IRQ_WORK_HARD_IRQ BIT(3) | |
6baf9e67 BG |
23 | |
24 | #define IRQ_WORK_CLAIMED (IRQ_WORK_PENDING | IRQ_WORK_BUSY) | |
bc6679ae | 25 | |
e360adbe | 26 | struct irq_work { |
153bedba | 27 | atomic_t flags; |
38aaf809 | 28 | struct llist_node llnode; |
e360adbe PZ |
29 | void (*func)(struct irq_work *); |
30 | }; | |
31 | ||
32 | static inline | |
38aaf809 | 33 | void init_irq_work(struct irq_work *work, void (*func)(struct irq_work *)) |
e360adbe | 34 | { |
153bedba | 35 | atomic_set(&work->flags, 0); |
38aaf809 | 36 | work->func = func; |
e360adbe PZ |
37 | } |
38 | ||
153bedba FW |
39 | #define DEFINE_IRQ_WORK(name, _f) struct irq_work name = { \ |
40 | .flags = ATOMIC_INIT(0), \ | |
41 | .func = (_f) \ | |
42 | } | |
43 | ||
6a02ad66 | 44 | |
cd578abb | 45 | bool irq_work_queue(struct irq_work *work); |
47885016 | 46 | bool irq_work_queue_on(struct irq_work *work, int cpu); |
47885016 | 47 | |
76a33061 | 48 | void irq_work_tick(void); |
38aaf809 | 49 | void irq_work_sync(struct irq_work *work); |
e360adbe | 50 | |
00b42959 | 51 | #ifdef CONFIG_IRQ_WORK |
c5c38ef3 PZ |
52 | #include <asm/irq_work.h> |
53 | ||
71ad00d6 | 54 | void irq_work_run(void); |
00b42959 FW |
55 | bool irq_work_needs_cpu(void); |
56 | #else | |
fe8d5261 | 57 | static inline bool irq_work_needs_cpu(void) { return false; } |
71ad00d6 | 58 | static inline void irq_work_run(void) { } |
00b42959 FW |
59 | #endif |
60 | ||
e360adbe | 61 | #endif /* _LINUX_IRQ_WORK_H */ |