| 1 | // SPDX-License-Identifier: GPL-2.0 | 
|---|---|
| 2 | /* | 
| 3 | * x86 specific code for irq_work | 
| 4 | * | 
| 5 | * Copyright (C) 2010 Red Hat, Inc., Peter Zijlstra | 
| 6 | */ | 
| 7 | |
| 8 | #include <linux/kernel.h> | 
| 9 | #include <linux/irq_work.h> | 
| 10 | #include <linux/hardirq.h> | 
| 11 | #include <asm/apic.h> | 
| 12 | #include <asm/idtentry.h> | 
| 13 | #include <asm/trace/irq_vectors.h> | 
| 14 | #include <linux/interrupt.h> | 
| 15 | |
| 16 | #ifdef CONFIG_X86_LOCAL_APIC | 
| 17 | DEFINE_IDTENTRY_SYSVEC(sysvec_irq_work) | 
| 18 | { | 
| 19 | apic_eoi(); | 
| 20 | trace_irq_work_entry(IRQ_WORK_VECTOR); | 
| 21 | inc_irq_stat(apic_irq_work_irqs); | 
| 22 | irq_work_run(); | 
| 23 | trace_irq_work_exit(IRQ_WORK_VECTOR); | 
| 24 | } | 
| 25 | |
| 26 | void arch_irq_work_raise(void) | 
| 27 | { | 
| 28 | if (!arch_irq_work_has_interrupt()) | 
| 29 | return; | 
| 30 | |
| 31 | __apic_send_IPI_self(IRQ_WORK_VECTOR); | 
| 32 | apic_wait_icr_idle(); | 
| 33 | } | 
| 34 | #endif | 
| 35 | 
