linux/arch/x86/kernel/irq_work.c
<<
>>
Prefs
   1/*
   2 * x86 specific code for irq_work
   3 *
   4 * Copyright (C) 2010 Red Hat, Inc., Peter Zijlstra <pzijlstr@redhat.com>
   5 */
   6
   7#include <linux/kernel.h>
   8#include <linux/irq_work.h>
   9#include <linux/hardirq.h>
  10#include <asm/apic.h>
  11#include <asm/trace/irq_vectors.h>
  12
  13static inline void __smp_irq_work_interrupt(void)
  14{
  15        inc_irq_stat(apic_irq_work_irqs);
  16        irq_work_run();
  17}
  18
  19__visible void smp_irq_work_interrupt(struct pt_regs *regs)
  20{
  21        ipi_entering_ack_irq();
  22        __smp_irq_work_interrupt();
  23        exiting_irq();
  24}
  25
  26__visible void smp_trace_irq_work_interrupt(struct pt_regs *regs)
  27{
  28        ipi_entering_ack_irq();
  29        trace_irq_work_entry(IRQ_WORK_VECTOR);
  30        __smp_irq_work_interrupt();
  31        trace_irq_work_exit(IRQ_WORK_VECTOR);
  32        exiting_irq();
  33}
  34
  35void arch_irq_work_raise(void)
  36{
  37#ifdef CONFIG_X86_LOCAL_APIC
  38        if (!arch_irq_work_has_interrupt())
  39                return;
  40
  41        apic->send_IPI_self(IRQ_WORK_VECTOR);
  42        apic_wait_icr_idle();
  43#endif
  44}
  45