hardirq.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  include/asm-s390/hardirq.h
  3.  *
  4.  *  S390 version
  5.  *    Copyright (C) 1999,2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
  6.  *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
  7.  *               Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
  8.  *
  9.  *  Derived from "include/asm-i386/hardirq.h"
  10.  */
  11. #ifndef __ASM_HARDIRQ_H
  12. #define __ASM_HARDIRQ_H
  13. #include <linux/config.h>
  14. #include <linux/threads.h>
  15. #include <asm/lowcore.h>
  16. #include <linux/sched.h>
  17. /* entry.S is sensitive to the offsets of these fields */
  18. typedef struct {
  19. unsigned int __softirq_pending;
  20. unsigned int __local_irq_count;
  21. unsigned int __local_bh_count;
  22. unsigned int __syscall_count;
  23. struct task_struct * __ksoftirqd_task; /* waitqueue is too large */
  24. } ____cacheline_aligned irq_cpustat_t;
  25. #include <linux/irq_cpustat.h> /* Standard mappings for irq_cpustat_t above */
  26. /*
  27.  * Are we in an interrupt context? Either doing bottom half
  28.  * or hardware interrupt processing?
  29.  */
  30. #define in_interrupt() ({ int __cpu = smp_processor_id(); 
  31. (local_irq_count(__cpu) + local_bh_count(__cpu) != 0); })
  32. #define in_irq() (local_irq_count(smp_processor_id()) != 0)
  33.   
  34. #ifndef CONFIG_SMP
  35. #define hardirq_trylock(cpu) (local_irq_count(cpu) == 0)
  36. #define hardirq_endlock(cpu) do { } while (0)
  37.   
  38. #define hardirq_enter(cpu) (local_irq_count(cpu)++)
  39. #define hardirq_exit(cpu) (local_irq_count(cpu)--)
  40. #define synchronize_irq() do { } while (0)
  41. #else /* CONFIG_SMP */
  42. #include <asm/atomic.h>
  43. #include <asm/smp.h>
  44. extern atomic_t global_irq_holder;
  45. extern atomic_t global_irq_lock;
  46. extern atomic_t global_irq_count;
  47. static inline void release_irqlock(int cpu)
  48. {
  49. /* if we didn't own the irq lock, just ignore.. */
  50. if (atomic_read(&global_irq_holder) ==  cpu) {
  51. atomic_set(&global_irq_holder,NO_PROC_ID);
  52. atomic_set(&global_irq_lock,0);
  53. }
  54. }
  55. static inline void hardirq_enter(int cpu)
  56. {
  57.         ++local_irq_count(cpu);
  58. atomic_inc(&global_irq_count);
  59. }
  60. static inline void hardirq_exit(int cpu)
  61. {
  62. atomic_dec(&global_irq_count);
  63.         --local_irq_count(cpu);
  64. }
  65. static inline int hardirq_trylock(int cpu)
  66. {
  67. return !atomic_read(&global_irq_count) &&
  68.        !atomic_read(&global_irq_lock);
  69. }
  70. #define hardirq_endlock(cpu) do { } while (0)
  71. extern void synchronize_irq(void);
  72. #endif /* CONFIG_SMP */
  73. #endif /* __ASM_HARDIRQ_H */