#include <linux/bug.h>
#include <linux/kernel.h>
#include <linux/export.h>
#include <linux/irq_work.h>
#include <linux/percpu.h>
#include <linux/hardirq.h>
#include <linux/irqflags.h>
#include <linux/sched.h>
#include <linux/tick.h>
#include <linux/cpu.h>
#include <linux/notifier.h>
#include <linux/smp.h>
#include <linux/smpboot.h>
#include <asm/processor.h>
#include <linux/kasan.h>
#include <trace/events/ipi.h>
static DEFINE_PER_CPU(struct llist_head, raised_list);
static DEFINE_PER_CPU(struct llist_head, lazy_list);
static DEFINE_PER_CPU(struct task_struct *, irq_workd);
static void wake_irq_workd(void)
{ … }
#ifdef CONFIG_SMP
static void irq_work_wake(struct irq_work *entry)
{ … }
static DEFINE_PER_CPU(struct irq_work, irq_work_wakeup) = …;
#endif
static int irq_workd_should_run(unsigned int cpu)
{ … }
static bool irq_work_claim(struct irq_work *work)
{ … }
void __weak arch_irq_work_raise(void)
{ … }
static __always_inline void irq_work_raise(struct irq_work *work)
{ … }
static void __irq_work_queue_local(struct irq_work *work)
{ … }
bool irq_work_queue(struct irq_work *work)
{ … }
EXPORT_SYMBOL_GPL(…);
bool irq_work_queue_on(struct irq_work *work, int cpu)
{ … }
bool irq_work_needs_cpu(void)
{ … }
void irq_work_single(void *arg)
{ … }
static void irq_work_run_list(struct llist_head *list)
{ … }
void irq_work_run(void)
{ … }
EXPORT_SYMBOL_GPL(…);
void irq_work_tick(void)
{ … }
void irq_work_sync(struct irq_work *work)
{ … }
EXPORT_SYMBOL_GPL(…);
static void run_irq_workd(unsigned int cpu)
{ … }
static void irq_workd_setup(unsigned int cpu)
{ … }
static struct smp_hotplug_thread irqwork_threads = …;
static __init int irq_work_init_threads(void)
{ … }
early_initcall(irq_work_init_threads);