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