home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / linux / hardirq.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  2.9 KB  |  109 lines

  1. #ifndef LINUX_HARDIRQ_H
  2. #define LINUX_HARDIRQ_H
  3.  
  4. #include <linux/preempt.h>
  5. #include <linux/smp_lock.h>
  6. #include <asm/hardirq.h>
  7. #include <asm/system.h>
  8.  
  9. /*
  10.  * We put the hardirq and softirq counter into the preemption
  11.  * counter. The bitmask has the following meaning:
  12.  *
  13.  * - bits 0-7 are the preemption count (max preemption depth: 256)
  14.  * - bits 8-15 are the softirq count (max # of softirqs: 256)
  15.  *
  16.  * The hardirq count can be overridden per architecture, the default is:
  17.  *
  18.  * - bits 16-27 are the hardirq count (max # of hardirqs: 4096)
  19.  * - ( bit 28 is the PREEMPT_ACTIVE flag. )
  20.  *
  21.  * PREEMPT_MASK: 0x000000ff
  22.  * SOFTIRQ_MASK: 0x0000ff00
  23.  * HARDIRQ_MASK: 0x0fff0000
  24.  */
  25. #define PREEMPT_BITS    8
  26. #define SOFTIRQ_BITS    8
  27.  
  28. #ifndef HARDIRQ_BITS
  29. #define HARDIRQ_BITS    12
  30. /*
  31.  * The hardirq mask has to be large enough to have space for potentially
  32.  * all IRQ sources in the system nesting on a single CPU.
  33.  */
  34. #if (1 << HARDIRQ_BITS) < NR_IRQS
  35. # error HARDIRQ_BITS is too low!
  36. #endif
  37. #endif
  38.  
  39. #define PREEMPT_SHIFT    0
  40. #define SOFTIRQ_SHIFT    (PREEMPT_SHIFT + PREEMPT_BITS)
  41. #define HARDIRQ_SHIFT    (SOFTIRQ_SHIFT + SOFTIRQ_BITS)
  42.  
  43. #define __IRQ_MASK(x)    ((1UL << (x))-1)
  44.  
  45. #define PREEMPT_MASK    (__IRQ_MASK(PREEMPT_BITS) << PREEMPT_SHIFT)
  46. #define SOFTIRQ_MASK    (__IRQ_MASK(SOFTIRQ_BITS) << SOFTIRQ_SHIFT)
  47. #define HARDIRQ_MASK    (__IRQ_MASK(HARDIRQ_BITS) << HARDIRQ_SHIFT)
  48.  
  49. #define PREEMPT_OFFSET    (1UL << PREEMPT_SHIFT)
  50. #define SOFTIRQ_OFFSET    (1UL << SOFTIRQ_SHIFT)
  51. #define HARDIRQ_OFFSET    (1UL << HARDIRQ_SHIFT)
  52.  
  53. #if PREEMPT_ACTIVE < (1 << (HARDIRQ_SHIFT + HARDIRQ_BITS))
  54. #error PREEMPT_ACTIVE is too low!
  55. #endif
  56.  
  57. #define hardirq_count()    (preempt_count() & HARDIRQ_MASK)
  58. #define softirq_count()    (preempt_count() & SOFTIRQ_MASK)
  59. #define irq_count()    (preempt_count() & (HARDIRQ_MASK | SOFTIRQ_MASK))
  60.  
  61. /*
  62.  * Are we doing bottom half or hardware interrupt processing?
  63.  * Are we in a softirq context? Interrupt context?
  64.  */
  65. #define in_irq()        (hardirq_count())
  66. #define in_softirq()        (softirq_count())
  67. #define in_interrupt()        (irq_count())
  68.  
  69. #if defined(CONFIG_PREEMPT) && !defined(CONFIG_PREEMPT_BKL)
  70. # define in_atomic()    ((preempt_count() & ~PREEMPT_ACTIVE) != kernel_locked())
  71. #else
  72. # define in_atomic()    ((preempt_count() & ~PREEMPT_ACTIVE) != 0)
  73. #endif
  74.  
  75. #ifdef CONFIG_PREEMPT
  76. # define preemptible()    (preempt_count() == 0 && !irqs_disabled())
  77. # define IRQ_EXIT_OFFSET (HARDIRQ_OFFSET-1)
  78. #else
  79. # define preemptible()    0
  80. # define IRQ_EXIT_OFFSET HARDIRQ_OFFSET
  81. #endif
  82.  
  83. #ifdef CONFIG_SMP
  84. extern void synchronize_irq(unsigned int irq);
  85. #else
  86. # define synchronize_irq(irq)    barrier()
  87. #endif
  88.  
  89. #define nmi_enter()        irq_enter()
  90. #define nmi_exit()        sub_preempt_count(HARDIRQ_OFFSET)
  91.  
  92. struct task_struct;
  93.  
  94. #ifndef CONFIG_VIRT_CPU_ACCOUNTING
  95. static inline void account_system_vtime(struct task_struct *tsk)
  96. {
  97. }
  98. #endif
  99.  
  100. #define irq_enter()                    \
  101.     do {                        \
  102.         account_system_vtime(current);        \
  103.         add_preempt_count(HARDIRQ_OFFSET);    \
  104.     } while (0)
  105.  
  106. extern void irq_exit(void);
  107.  
  108. #endif /* LINUX_HARDIRQ_H */
  109.