xref: /OK3568_Linux_fs/kernel/scripts/coccinelle/locks/flags.cocci (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun// SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun/// Find nested lock+irqsave functions that use the same flags variables
3*4882a593Smuzhiyun///
4*4882a593Smuzhiyun// Confidence: High
5*4882a593Smuzhiyun// Copyright: (C) 2010-2012 Nicolas Palix.
6*4882a593Smuzhiyun// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
7*4882a593Smuzhiyun// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
8*4882a593Smuzhiyun// URL: http://coccinelle.lip6.fr/
9*4882a593Smuzhiyun// Comments:
10*4882a593Smuzhiyun// Options: --no-includes --include-headers
11*4882a593Smuzhiyun
12*4882a593Smuzhiyunvirtual context
13*4882a593Smuzhiyunvirtual org
14*4882a593Smuzhiyunvirtual report
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun@r exists@
17*4882a593Smuzhiyunexpression lock1,lock2,flags;
18*4882a593Smuzhiyunposition p1,p2;
19*4882a593Smuzhiyun@@
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun(
22*4882a593Smuzhiyunspin_lock_irqsave@p1(lock1,flags)
23*4882a593Smuzhiyun|
24*4882a593Smuzhiyunread_lock_irqsave@p1(lock1,flags)
25*4882a593Smuzhiyun|
26*4882a593Smuzhiyunwrite_lock_irqsave@p1(lock1,flags)
27*4882a593Smuzhiyun)
28*4882a593Smuzhiyun... when != flags
29*4882a593Smuzhiyun(
30*4882a593Smuzhiyunspin_lock_irqsave(lock1,flags)
31*4882a593Smuzhiyun|
32*4882a593Smuzhiyunread_lock_irqsave(lock1,flags)
33*4882a593Smuzhiyun|
34*4882a593Smuzhiyunwrite_lock_irqsave(lock1,flags)
35*4882a593Smuzhiyun|
36*4882a593Smuzhiyunspin_lock_irqsave@p2(lock2,flags)
37*4882a593Smuzhiyun|
38*4882a593Smuzhiyunread_lock_irqsave@p2(lock2,flags)
39*4882a593Smuzhiyun|
40*4882a593Smuzhiyunwrite_lock_irqsave@p2(lock2,flags)
41*4882a593Smuzhiyun)
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun@d exists@
44*4882a593Smuzhiyunexpression f <= r.flags;
45*4882a593Smuzhiyunexpression lock1,lock2,flags;
46*4882a593Smuzhiyunposition r.p1, r.p2;
47*4882a593Smuzhiyun@@
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun(
50*4882a593Smuzhiyun*spin_lock_irqsave@p1(lock1,flags)
51*4882a593Smuzhiyun|
52*4882a593Smuzhiyun*read_lock_irqsave@p1(lock1,flags)
53*4882a593Smuzhiyun|
54*4882a593Smuzhiyun*write_lock_irqsave@p1(lock1,flags)
55*4882a593Smuzhiyun)
56*4882a593Smuzhiyun... when != f
57*4882a593Smuzhiyun(
58*4882a593Smuzhiyun*spin_lock_irqsave@p2(lock2,flags)
59*4882a593Smuzhiyun|
60*4882a593Smuzhiyun*read_lock_irqsave@p2(lock2,flags)
61*4882a593Smuzhiyun|
62*4882a593Smuzhiyun*write_lock_irqsave@p2(lock2,flags)
63*4882a593Smuzhiyun)
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun// ----------------------------------------------------------------------
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun@script:python depends on d && org@
68*4882a593Smuzhiyunp1 << r.p1;
69*4882a593Smuzhiyunp2 << r.p2;
70*4882a593Smuzhiyun@@
71*4882a593Smuzhiyun
72*4882a593Smuzhiyuncocci.print_main("original lock",p1)
73*4882a593Smuzhiyuncocci.print_secs("nested lock+irqsave that reuses flags",p2)
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun@script:python depends on d && report@
76*4882a593Smuzhiyunp1 << r.p1;
77*4882a593Smuzhiyunp2 << r.p2;
78*4882a593Smuzhiyun@@
79*4882a593Smuzhiyun
80*4882a593Smuzhiyunmsg="ERROR: nested lock+irqsave that reuses flags from line %s." % (p1[0].line)
81*4882a593Smuzhiyuncoccilib.report.print_report(p2[0], msg)
82