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 Levon void 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