11f5207b7SJohn Levon int __raw_local_irq_save(); 21f5207b7SJohn Levon int _spin_trylock(int x); 31f5207b7SJohn Levon int raw_local_irq_restore(flags); 41f5207b7SJohn Levon 51f5207b7SJohn Levon #define spin_trylock_irqsave(lock, flags) \ 61f5207b7SJohn Levon ({ \ 71f5207b7SJohn Levon (flags) = __raw_local_irq_save(); \ 81f5207b7SJohn Levon _spin_trylock(lock) ? 1 : ({ raw_local_irq_restore(flags); 0; }); \ 91f5207b7SJohn Levon }) 101f5207b7SJohn Levon 111f5207b7SJohn Levon void _spin_unlock_irqrestore(int lock, int flags); 121f5207b7SJohn Levon 131f5207b7SJohn Levon int zzz; 141f5207b7SJohn Levon func(void)151f5207b7SJohn Levonvoid func (void) 161f5207b7SJohn Levon { 171f5207b7SJohn Levon int lock = 1; 181f5207b7SJohn Levon int flags = 1; 191f5207b7SJohn Levon 201f5207b7SJohn Levon if (!spin_trylock_irqsave(lock, flags)) 211f5207b7SJohn Levon return; 221f5207b7SJohn Levon _spin_unlock_irqrestore(lock, flags); 231f5207b7SJohn Levon if (zzz) 241f5207b7SJohn Levon return; 251f5207b7SJohn Levon if (spin_trylock_irqsave(lock, flags)) 261f5207b7SJohn Levon return; 271f5207b7SJohn Levon return; 281f5207b7SJohn Levon } 291f5207b7SJohn Levon /* 301f5207b7SJohn Levon * check-name: Smatch locking #6 311f5207b7SJohn Levon * check-command: smatch -p=kernel sm_locking6.c 321f5207b7SJohn Levon * 331f5207b7SJohn Levon * check-output-start 34*31ad075eSJohn Levon sm_locking6.c:27 func() warn: inconsistent returns 'flags'. 35*31ad075eSJohn Levon Locked on : 26 36*31ad075eSJohn Levon Unlocked on: 21,24,27 37*31ad075eSJohn Levon sm_locking6.c:27 func() warn: inconsistent returns 'lock'. 38*31ad075eSJohn Levon Locked on : 26 39*31ad075eSJohn Levon Unlocked on: 21,24,27 401f5207b7SJohn Levon * check-output-end 411f5207b7SJohn Levon */ 42