调用spin_lock_irqsave(&chip->lock,flags); 的下层实现是什么?
#define spin_lock_irqsave(lock, flags) \
do { \
typecheck(unsigned long, flags); \
flags = _spin_lock_irqsave(lock); \
} while (0)
1: /*
2:
3: * Check at compile time that something is of a particular type.
4:
5: * Always evaluates to 1 so you may use it easily in comparisons.
6:
7: */
8:
9: #define typecheck(type,x) \
10:
11: ({ type __dummy; \
12:
13: typeof(x) __dummy2; \
14:
15: (void)(&__dummy == &__dummy2); \
16:
17: 1; \
18:
19: })
20:
#define _spin_lock_irqsave(lock) __spin_lock_irqsave(lock)
static inline unsigned long __spin_lock_irqsave(spinlock_t *lock)
{
unsigned long flags;
local_irq_save(flags);
preempt_disable();
spin_acquire(&lock->dep_map, 0, 0, _RET_IP_);
/*
* On lockdep we dont want the hand-coded irq-enable of
* _raw_spin_lock_flags() code, because lockdep assumes
* that interrupts are not re-enabled during lock-acquire:
*/
#ifdef CONFIG_LOCKDEP
LOCK_CONTENDED(lock, _raw_spin_trylock, _raw_spin_lock);
#else
_raw_spin_lock_flags(lock, &flags);
#endif
return flags;
}
为了避免卷入过多的宏定义当中,展开级别暂时停留于此,后面我们将进行最终的展开,展开定义如下所示:
1: do { ( { unsigned long __dummy ; 2:
3: typeof ( flags ) __dummy2 ; 4:
5: ( void ) ( & __dummy == & __dummy2 ) ; 1 ; } ) ; 6:
7: flags = __spin_lock_irqsave ( & chip -> lock ) ; 8:
9: } while ( 0 ) |