softirq.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:1k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef __ASM_SOFTIRQ_H
  2. #define __ASM_SOFTIRQ_H
  3. #include <asm/atomic.h>
  4. #include <asm/hardirq.h>
  5. #define __cpu_bh_enable(cpu) 
  6. do { barrier(); local_bh_count(cpu)--; } while (0)
  7. #define cpu_bh_disable(cpu) 
  8. do { local_bh_count(cpu)++; barrier(); } while (0)
  9. #define local_bh_disable() cpu_bh_disable(smp_processor_id())
  10. #define __local_bh_enable() __cpu_bh_enable(smp_processor_id())
  11. #define in_softirq() (local_bh_count(smp_processor_id()) != 0)
  12. /*
  13.  * NOTE: this assembly code assumes:
  14.  *
  15.  *    (char *)&local_bh_count - 8 == (char *)&softirq_pending
  16.  *
  17.  * If you change the offsets in irq_stat then you have to
  18.  * update this code as well.
  19.  */
  20. #define local_bh_enable()
  21. do {
  22. unsigned int *ptr = &local_bh_count(smp_processor_id());
  23. barrier();
  24. if (!--*ptr)
  25. __asm__ __volatile__ (
  26. "cmpl $0, -8(%0);"
  27. "jnz 2f;"
  28. "1:;"
  29. LOCK_SECTION_START("")
  30. "2: pushl %%eax; pushl %%ecx; pushl %%edx;"
  31. "call %c1;"
  32. "popl %%edx; popl %%ecx; popl %%eax;"
  33. "jmp 1b;"
  34. LOCK_SECTION_END
  35. : /* no output */
  36. : "r" (ptr), "i" (do_softirq)
  37. /* no registers clobbered */ );
  38. } while (0)
  39. #endif /* __ASM_SOFTIRQ_H */