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