1 int __raw_local_irq_save(); 2 int _spin_trylock(int x); 3 int raw_local_irq_restore(flags); 4 5 #define spin_trylock_irqsave(lock, flags) \ 6 ({ \ 7 (flags) = __raw_local_irq_save(); \ 8 _spin_trylock(lock) ? 1 : ({ raw_local_irq_restore(flags); 0; }); \ 9 }) 10 11 void _spin_unlock_irqrestore(int lock, int flags); 12 13 int zzz; 14 func(void)15void func (void) 16 { 17 int lock = 1; 18 int flags = 1; 19 20 if (!spin_trylock_irqsave(lock, flags)) 21 return; 22 _spin_unlock_irqrestore(lock, flags); 23 if (zzz) 24 return; 25 if (spin_trylock_irqsave(lock, flags)) 26 return; 27 return; 28 } 29 /* 30 * check-name: Smatch locking #6 31 * check-command: smatch -p=kernel sm_locking6.c 32 * 33 * check-output-start 34 sm_locking6.c:27 func() warn: inconsistent returns 'flags'. 35 Locked on : 26 36 Unlocked on: 21,24,27 37 sm_locking6.c:27 func() warn: inconsistent returns 'lock'. 38 Locked on : 26 39 Unlocked on: 21,24,27 40 * check-output-end 41 */ 42