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