Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6
[pandora-kernel.git] / scripts / coccinelle / locks / flags.cocci
1 /// Find nested lock+irqsave functions that use the same flags variables
2 ///
3 // Confidence: High
4 // Copyright: (C) 2010 Nicolas Palix, DIKU.  GPLv2.
5 // Copyright: (C) 2010 Julia Lawall, DIKU.  GPLv2.
6 // Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.  GPLv2.
7 // URL: http://coccinelle.lip6.fr/
8 // Comments:
9 // Options: -no_includes -include_headers
10
11 virtual context
12 virtual org
13 virtual report
14
15 @r@
16 expression lock1,lock2,flags;
17 position p1,p2;
18 @@
19
20 (
21 spin_lock_irqsave@p1(lock1,flags)
22 |
23 read_lock_irqsave@p1(lock1,flags)
24 |
25 write_lock_irqsave@p1(lock1,flags)
26 )
27 ... when != flags
28 (
29 spin_lock_irqsave(lock1,flags)
30 |
31 read_lock_irqsave(lock1,flags)
32 |
33 write_lock_irqsave(lock1,flags)
34 |
35 spin_lock_irqsave@p2(lock2,flags)
36 |
37 read_lock_irqsave@p2(lock2,flags)
38 |
39 write_lock_irqsave@p2(lock2,flags)
40 )
41
42 @d@
43 expression f <= r.flags;
44 expression lock1,lock2,flags;
45 position r.p1, r.p2;
46 @@
47
48 (
49 *spin_lock_irqsave@p1(lock1,flags)
50 |
51 *read_lock_irqsave@p1(lock1,flags)
52 |
53 *write_lock_irqsave@p1(lock1,flags)
54 )
55 ... when != f
56 (
57 *spin_lock_irqsave@p2(lock2,flags)
58 |
59 *read_lock_irqsave@p2(lock2,flags)
60 |
61 *write_lock_irqsave@p2(lock2,flags)
62 )
63
64 // ----------------------------------------------------------------------
65
66 @script:python depends on d && org@
67 p1 << r.p1;
68 p2 << r.p2;
69 @@
70
71 cocci.print_main("original lock",p1)
72 cocci.print_secs("nested lock+irqsave that reuses flags",p2)
73
74 @script:python depends on d && report@
75 p1 << r.p1;
76 p2 << r.p2;
77 @@
78
79 msg="ERROR: nested lock+irqsave that reuses flags from %s." % (p1[0].line)
80 coccilib.report.print_report(p2[0], msg)