spinlock_types.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #ifndef __LINUX_SPINLOCK_TYPES_H
  2. #define __LINUX_SPINLOCK_TYPES_H
  3. /*
  4. * include/linux/spinlock_types.h - generic spinlock type definitions
  5. * and initializers
  6. *
  7. * portions Copyright 2005, Red Hat, Inc., Ingo Molnar
  8. * Released under the General Public License (GPL).
  9. */
  10. #if defined(CONFIG_SMP)
  11. # include <asm/spinlock_types.h>
  12. #else
  13. # include <linux/spinlock_types_up.h>
  14. #endif
  15. #include <linux/lockdep_types.h>
  16. typedef struct raw_spinlock {
  17. arch_spinlock_t raw_lock;
  18. #ifdef CONFIG_DEBUG_SPINLOCK
  19. unsigned int magic, owner_cpu;
  20. void *owner;
  21. #endif
  22. #ifdef CONFIG_DEBUG_LOCK_ALLOC
  23. struct lockdep_map dep_map;
  24. #endif
  25. } raw_spinlock_t;
  26. #define SPINLOCK_MAGIC 0xdead4ead
  27. #define SPINLOCK_OWNER_INIT ((void *)-1L)
  28. #ifdef CONFIG_DEBUG_LOCK_ALLOC
  29. # define RAW_SPIN_DEP_MAP_INIT(lockname) \
  30. .dep_map = { \
  31. .name = #lockname, \
  32. .wait_type_inner = LD_WAIT_SPIN, \
  33. }
  34. # define SPIN_DEP_MAP_INIT(lockname) \
  35. .dep_map = { \
  36. .name = #lockname, \
  37. .wait_type_inner = LD_WAIT_CONFIG, \
  38. }
  39. #else
  40. # define RAW_SPIN_DEP_MAP_INIT(lockname)
  41. # define SPIN_DEP_MAP_INIT(lockname)
  42. #endif
  43. #ifdef CONFIG_DEBUG_SPINLOCK
  44. # define SPIN_DEBUG_INIT(lockname) \
  45. .magic = SPINLOCK_MAGIC, \
  46. .owner_cpu = -1, \
  47. .owner = SPINLOCK_OWNER_INIT,
  48. #else
  49. # define SPIN_DEBUG_INIT(lockname)
  50. #endif
  51. #define __RAW_SPIN_LOCK_INITIALIZER(lockname) \
  52. { \
  53. .raw_lock = __ARCH_SPIN_LOCK_UNLOCKED, \
  54. SPIN_DEBUG_INIT(lockname) \
  55. RAW_SPIN_DEP_MAP_INIT(lockname) }
  56. #define __RAW_SPIN_LOCK_UNLOCKED(lockname) \
  57. (raw_spinlock_t) __RAW_SPIN_LOCK_INITIALIZER(lockname)
  58. #define DEFINE_RAW_SPINLOCK(x) raw_spinlock_t x = __RAW_SPIN_LOCK_UNLOCKED(x)
  59. typedef struct spinlock {
  60. union {
  61. struct raw_spinlock rlock;
  62. #ifdef CONFIG_DEBUG_LOCK_ALLOC
  63. # define LOCK_PADSIZE (offsetof(struct raw_spinlock, dep_map))
  64. struct {
  65. u8 __padding[LOCK_PADSIZE];
  66. struct lockdep_map dep_map;
  67. };
  68. #endif
  69. };
  70. } spinlock_t;
  71. #define ___SPIN_LOCK_INITIALIZER(lockname) \
  72. { \
  73. .raw_lock = __ARCH_SPIN_LOCK_UNLOCKED, \
  74. SPIN_DEBUG_INIT(lockname) \
  75. SPIN_DEP_MAP_INIT(lockname) }
  76. #define __SPIN_LOCK_INITIALIZER(lockname) \
  77. { { .rlock = ___SPIN_LOCK_INITIALIZER(lockname) } }
  78. #define __SPIN_LOCK_UNLOCKED(lockname) \
  79. (spinlock_t) __SPIN_LOCK_INITIALIZER(lockname)
  80. #define DEFINE_SPINLOCK(x) spinlock_t x = __SPIN_LOCK_UNLOCKED(x)
  81. #include <linux/rwlock_types.h>
  82. #endif /* __LINUX_SPINLOCK_TYPES_H */