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