Green shading in the line number column means the source is part of the translation unit, red means it is conditionally excluded. Highlighted line numbers link to the translation unit page. Highlighted macros link to the macro page.
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: #include <linux/typecheck.h> 15: #include <asm/irqflags.h> 16: 17: #ifdef CONFIG_TRACE_IRQFLAGS 18: extern void trace_softirqs_on(unsigned long ip); 19: extern void trace_softirqs_off(unsigned long ip); 20: extern void trace_hardirqs_on(void); 21: extern void trace_hardirqs_off(void); 22: # define trace_hardirq_context(p) ((p)->hardirq_context) 23: # define trace_softirq_context(p) ((p)->softirq_context) 24: # define trace_hardirqs_enabled(p) ((p)->hardirqs_enabled) 25: # define trace_softirqs_enabled(p) ((p)->softirqs_enabled) 26: # define trace_hardirq_enter() do { current->hardirq_context++; } while (0) 27: # define trace_hardirq_exit() do { current->hardirq_context--; } while (0) 28: # define lockdep_softirq_enter() do { current->softirq_context++; } while (0) 29: # define lockdep_softirq_exit() do { current->softirq_context--; } while (0) 30: # define INIT_TRACE_IRQFLAGS .softirqs_enabled = 1, 31: #else 32: # define trace_hardirqs_on() do { } while (0) 33: # define trace_hardirqs_off() do { } while (0) 34: # define trace_softirqs_on(ip) do { } while (0) 35: # define trace_softirqs_off(ip) do { } while (0) 36: # define trace_hardirq_context(p) 0 37: # define trace_softirq_context(p) 0 38: # define trace_hardirqs_enabled(p) 0 39: # define trace_softirqs_enabled(p) 0 40: # define trace_hardirq_enter() do { } while (0) 41: # define trace_hardirq_exit() do { } while (0) 42: # define lockdep_softirq_enter() do { } while (0) 43: # define lockdep_softirq_exit() do { } while (0) 44: # define INIT_TRACE_IRQFLAGS 45: #endif 46: 47: #if defined(CONFIG_IRQSOFF_TRACER) || \ 48: defined(CONFIG_PREEMPT_TRACER) 49: extern void stop_critical_timings(void); 50: extern void start_critical_timings(void); 51: #else 52: # define stop_critical_timings() do { } while (0) 53: # define start_critical_timings() do { } while (0) 54: #endif 55: 56: /* 57: * Wrap the arch provided IRQ routines to provide appropriate checks. 58: */ 59: #define raw_local_irq_disable() arch_local_irq_disable() 60: #define raw_local_irq_enable() arch_local_irq_enable() 61: #define raw_local_irq_save(flags) \ 62: do { \ 63: typecheck(unsigned long, flags); \ 64: flags = arch_local_irq_save(); \ 65: } while (0) 66: #define raw_local_irq_restore(flags) \ 67: do { \ 68: typecheck(unsigned long, flags); \ 69: arch_local_irq_restore(flags); \ 70: } while (0) 71: #define raw_local_save_flags(flags) \ 72: do { \ 73: typecheck(unsigned long, flags); \ 74: flags = arch_local_save_flags(); \ 75: } while (0) 76: #define raw_irqs_disabled_flags(flags) \ 77: ({ \ 78: typecheck(unsigned long, flags); \ 79: arch_irqs_disabled_flags(flags); \ 80: }) 81: #define raw_irqs_disabled() (arch_irqs_disabled()) 82: #define raw_safe_halt() arch_safe_halt() 83: 84: /* 85: * The local_irq_*() APIs are equal to the raw_local_irq*() 86: * if !TRACE_IRQFLAGS. 87: */ 88: #ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT 89: #define local_irq_enable() \ 90: do { trace_hardirqs_on(); raw_local_irq_enable(); } while (0) 91: #define local_irq_disable() \ 92: do { raw_local_irq_disable(); trace_hardirqs_off(); } while (0) 93: #define local_irq_save(flags) \ 94: do { \ 95: raw_local_irq_save(flags); \ 96: trace_hardirqs_off(); \ 97: } while (0) 98: 99: 100: #define local_irq_restore(flags) \ 101: do { \ 102: if (raw_irqs_disabled_flags(flags)) { \ 103: raw_local_irq_restore(flags); \ 104: trace_hardirqs_off(); \ 105: } else { \ 106: trace_hardirqs_on(); \ 107: raw_local_irq_restore(flags); \ 108: } \ 109: } while (0) 110: #define local_save_flags(flags) \ 111: do { \ 112: raw_local_save_flags(flags); \ 113: } while (0) 114: 115: #define irqs_disabled_flags(flags) \ 116: ({ \ 117: raw_irqs_disabled_flags(flags); \ 118: }) 119: 120: #define irqs_disabled() \ 121: ({ \ 122: unsigned long _flags; \ 123: raw_local_save_flags(_flags); \ 124: raw_irqs_disabled_flags(_flags); \ 125: }) 126: 127: #define safe_halt() \ 128: do { \ 129: trace_hardirqs_on(); \ 130: raw_safe_halt(); \ 131: } while (0) 132: 133: 134: #else /* !CONFIG_TRACE_IRQFLAGS_SUPPORT */ 135: 136: #define local_irq_enable() do { raw_local_irq_enable(); } while (0) 137: #define local_irq_disable() do { raw_local_irq_disable(); } while (0) 138: #define local_irq_save(flags) \ 139: do { \ 140: raw_local_irq_save(flags); \ 141: } while (0) 142: #define local_irq_restore(flags) do { raw_local_irq_restore(flags); } while (0) 143: #define local_save_flags(flags) do { raw_local_save_flags(flags); } while (0) 144: #define irqs_disabled() (raw_irqs_disabled()) 145: #define irqs_disabled_flags(flags) (raw_irqs_disabled_flags(flags)) 146: #define safe_halt() do { raw_safe_halt(); } while (0) 147: 148: #endif /* CONFIG_TRACE_IRQFLAGS_SUPPORT */ 149: 150: #endif 151: