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