hardirq.h 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #ifndef LINUX_HARDIRQ_H
  2. #define LINUX_HARDIRQ_H
  3. #include <linux/preempt_mask.h>
  4. #include <linux/lockdep.h>
  5. #include <linux/ftrace_irq.h>
  6. #include <linux/vtime.h>
  7. extern void synchronize_irq(unsigned int irq);
  8. #if defined(CONFIG_TINY_RCU)
  9. static inline void rcu_nmi_enter(void)
  10. {
  11. }
  12. static inline void rcu_nmi_exit(void)
  13. {
  14. }
  15. #else
  16. extern void rcu_nmi_enter(void);
  17. extern void rcu_nmi_exit(void);
  18. #endif
  19. /*
  20. * It is safe to do non-atomic ops on ->hardirq_context,
  21. * because NMI handlers may not preempt and the ops are
  22. * always balanced, so the interrupted value of ->hardirq_context
  23. * will always be restored.
  24. */
  25. #define __irq_enter() \
  26. do { \
  27. account_irq_enter_time(current); \
  28. preempt_count_add(HARDIRQ_OFFSET); \
  29. trace_hardirq_enter(); \
  30. } while (0)
  31. /*
  32. * Enter irq context (on NO_HZ, update jiffies):
  33. */
  34. extern void irq_enter(void);
  35. /*
  36. * Exit irq context without processing softirqs:
  37. */
  38. #define __irq_exit() \
  39. do { \
  40. trace_hardirq_exit(); \
  41. account_irq_exit_time(current); \
  42. preempt_count_sub(HARDIRQ_OFFSET); \
  43. } while (0)
  44. /*
  45. * Exit irq context and process softirqs if needed:
  46. */
  47. extern void irq_exit(void);
  48. #define nmi_enter() \
  49. do { \
  50. lockdep_off(); \
  51. ftrace_nmi_enter(); \
  52. BUG_ON(in_nmi()); \
  53. preempt_count_add(NMI_OFFSET + HARDIRQ_OFFSET); \
  54. rcu_nmi_enter(); \
  55. trace_hardirq_enter(); \
  56. } while (0)
  57. #define nmi_exit() \
  58. do { \
  59. trace_hardirq_exit(); \
  60. rcu_nmi_exit(); \
  61. BUG_ON(!in_nmi()); \
  62. preempt_count_sub(NMI_OFFSET + HARDIRQ_OFFSET); \
  63. ftrace_nmi_exit(); \
  64. lockdep_on(); \
  65. } while (0)
  66. #endif /* LINUX_HARDIRQ_H */