at v5.12 2.4 kB view raw
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 */