linux/include/linux/irqflags.h
<<
>>
Prefs
   1/*
   2 * include/linux/irqflags.h
   3 *
   4 * IRQ flags tracing: follow the state of the hardirq and softirq flags and
   5 * provide callbacks for transitions between ON and OFF states.
   6 *
   7 * This file gets included from lowlevel asm headers too, to provide
   8 * wrapped versions of the local_irq_*() APIs, based on the
   9 * raw_local_irq_*() macros from the lowlevel headers.
  10 */
  11#ifndef _LINUX_TRACE_IRQFLAGS_H
  12#define _LINUX_TRACE_IRQFLAGS_H
  13
  14#ifdef CONFIG_TRACE_IRQFLAGS
  15  extern void trace_hardirqs_on(void);
  16  extern void trace_hardirqs_off(void);
  17  extern void trace_softirqs_on(unsigned long ip);
  18  extern void trace_softirqs_off(unsigned long ip);
  19# define trace_hardirq_context(p)       ((p)->hardirq_context)
  20# define trace_softirq_context(p)       ((p)->softirq_context)
  21# define trace_hardirqs_enabled(p)      ((p)->hardirqs_enabled)
  22# define trace_softirqs_enabled(p)      ((p)->softirqs_enabled)
  23# define trace_hardirq_enter()  do { current->hardirq_context++; } while (0)
  24# define trace_hardirq_exit()   do { current->hardirq_context--; } while (0)
  25# define trace_softirq_enter()  do { current->softirq_context++; } while (0)
  26# define trace_softirq_exit()   do { current->softirq_context--; } while (0)
  27# define INIT_TRACE_IRQFLAGS    .softirqs_enabled = 1,
  28#else
  29# define trace_hardirqs_on()            do { } while (0)
  30# define trace_hardirqs_off()           do { } while (0)
  31# define trace_softirqs_on(ip)          do { } while (0)
  32# define trace_softirqs_off(ip)         do { } while (0)
  33# define trace_hardirq_context(p)       0
  34# define trace_softirq_context(p)       0
  35# define trace_hardirqs_enabled(p)      0
  36# define trace_softirqs_enabled(p)      0
  37# define trace_hardirq_enter()          do { } while (0)
  38# define trace_hardirq_exit()           do { } while (0)
  39# define trace_softirq_enter()          do { } while (0)
  40# define trace_softirq_exit()           do { } while (0)
  41# define INIT_TRACE_IRQFLAGS
  42#endif
  43
  44#ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT
  45
  46#include <asm/irqflags.h>
  47
  48#define local_irq_enable() \
  49        do { trace_hardirqs_on(); raw_local_irq_enable(); } while (0)
  50#define local_irq_disable() \
  51        do { raw_local_irq_disable(); trace_hardirqs_off(); } while (0)
  52#define local_irq_save(flags) \
  53        do { raw_local_irq_save(flags); trace_hardirqs_off(); } while (0)
  54
  55#define local_irq_restore(flags)                                \
  56        do {                                                    \
  57                if (raw_irqs_disabled_flags(flags)) {           \
  58                        raw_local_irq_restore(flags);           \
  59                        trace_hardirqs_off();                   \
  60                } else {                                        \
  61                        trace_hardirqs_on();                    \
  62                        raw_local_irq_restore(flags);           \
  63                }                                               \
  64        } while (0)
  65#else /* !CONFIG_TRACE_IRQFLAGS_SUPPORT */
  66/*
  67 * The local_irq_*() APIs are equal to the raw_local_irq*()
  68 * if !TRACE_IRQFLAGS.
  69 */
  70# define raw_local_irq_disable()        local_irq_disable()
  71# define raw_local_irq_enable()         local_irq_enable()
  72# define raw_local_irq_save(flags)      local_irq_save(flags)
  73# define raw_local_irq_restore(flags)   local_irq_restore(flags)
  74#endif /* CONFIG_TRACE_IRQFLAGS_SUPPORT */
  75
  76#ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT
  77#define safe_halt()                                             \
  78        do {                                                    \
  79                trace_hardirqs_on();                            \
  80                raw_safe_halt();                                \
  81        } while (0)
  82
  83#define local_save_flags(flags)         raw_local_save_flags(flags)
  84
  85#define irqs_disabled()                                         \
  86({                                                              \
  87        unsigned long flags;                                    \
  88                                                                \
  89        raw_local_save_flags(flags);                            \
  90        raw_irqs_disabled_flags(flags);                         \
  91})
  92
  93#define irqs_disabled_flags(flags)      raw_irqs_disabled_flags(flags)
  94#endif          /* CONFIG_X86 */
  95
  96#endif
  97
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.