xref: /illumos-gate/usr/src/tools/smatch/src/validation/sm_locking7.c (revision 31ad075e90bf5afda8ab4b8cc4d3ca3e89946115)
11f5207b7SJohn Levon #include "check_debug.h"
21f5207b7SJohn Levon 
31f5207b7SJohn Levon unsigned long arch_local_irq_save();
41f5207b7SJohn Levon void arch_local_irq_restore(unsigned long flags);
51f5207b7SJohn Levon int spin_trylock();
61f5207b7SJohn Levon void frob();
71f5207b7SJohn Levon 
81f5207b7SJohn Levon void func(int *y)
91f5207b7SJohn Levon {
101f5207b7SJohn Levon 	int lock;
111f5207b7SJohn Levon 	unsigned long flags;
121f5207b7SJohn Levon 
131f5207b7SJohn Levon 	if (({
141f5207b7SJohn Levon 		int __ret;
151f5207b7SJohn Levon 		flags = arch_local_irq_save();
161f5207b7SJohn Levon 		__ret = spin_trylock(&lock);
171f5207b7SJohn Levon 		if (!__ret)
181f5207b7SJohn Levon 			arch_local_irq_restore(flags);
191f5207b7SJohn Levon 		__ret;
201f5207b7SJohn Levon 	    }))
211f5207b7SJohn Levon 		return;
221f5207b7SJohn Levon 	frob();
231f5207b7SJohn Levon }
241f5207b7SJohn Levon 
251f5207b7SJohn Levon /*
261f5207b7SJohn Levon  * check-name: smatch locking #7
271f5207b7SJohn Levon  * check-command: smatch -p=kernel -I.. sm_locking7.c
281f5207b7SJohn Levon  *
291f5207b7SJohn Levon  * check-output-start
30*31ad075eSJohn Levon sm_locking7.c:22 func() warn: inconsistent returns 'flags'.
31*31ad075eSJohn Levon   Locked on  : 21
32*31ad075eSJohn Levon   Unlocked on: 22
33*31ad075eSJohn Levon sm_locking7.c:22 func() warn: inconsistent returns 'lock'.
34*31ad075eSJohn Levon   Locked on  : 21
35*31ad075eSJohn Levon   Unlocked on: 22
361f5207b7SJohn Levon  * check-output-end
371f5207b7SJohn Levon  */
38