1 // SPDX-License-Identifier: GPL-2.0-only << 2 /// Find functions that refer to GFP_KERNEL bu 1 /// Find functions that refer to GFP_KERNEL but are called with locks held. 3 //# The proposed change of converting the GFP_ 2 //# The proposed change of converting the GFP_KERNEL is not necessarily the 4 //# correct one. It may be desired to unlock 3 //# correct one. It may be desired to unlock the lock, or to not call the 5 //# function under the lock in the first place 4 //# function under the lock in the first place. 6 /// 5 /// 7 // Confidence: Moderate 6 // Confidence: Moderate 8 // Copyright: (C) 2012 Nicolas Palix. !! 7 // Copyright: (C) 2012 Nicolas Palix. GPLv2. 9 // Copyright: (C) 2012 Julia Lawall, INRIA/LIP !! 8 // Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. GPLv2. 10 // Copyright: (C) 2012 Gilles Muller, INRIA/Li !! 9 // Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. GPLv2. 11 // URL: https://coccinelle.gitlabpages.inria.f !! 10 // URL: http://coccinelle.lip6.fr/ 12 // Comments: 11 // Comments: 13 // Options: --no-includes --include-headers 12 // Options: --no-includes --include-headers 14 13 15 virtual patch 14 virtual patch 16 virtual context 15 virtual context 17 virtual org 16 virtual org 18 virtual report 17 virtual report 19 18 20 @gfp exists@ 19 @gfp exists@ 21 identifier fn; 20 identifier fn; 22 position p; 21 position p; 23 @@ 22 @@ 24 23 25 fn(...) { 24 fn(...) { 26 ... when != read_unlock_irq(...) 25 ... when != read_unlock_irq(...) 27 when != write_unlock_irq(...) 26 when != write_unlock_irq(...) 28 when != read_unlock_irqrestore(...) 27 when != read_unlock_irqrestore(...) 29 when != write_unlock_irqrestore(...) 28 when != write_unlock_irqrestore(...) 30 when != spin_unlock(...) 29 when != spin_unlock(...) 31 when != spin_unlock_irq(...) 30 when != spin_unlock_irq(...) 32 when != spin_unlock_irqrestore(...) 31 when != spin_unlock_irqrestore(...) 33 when != local_irq_enable(...) 32 when != local_irq_enable(...) 34 when any 33 when any 35 GFP_KERNEL@p 34 GFP_KERNEL@p 36 ... when any 35 ... when any 37 } 36 } 38 37 39 @locked exists@ 38 @locked exists@ 40 identifier gfp.fn; 39 identifier gfp.fn; 41 position p1,p2; 40 position p1,p2; 42 @@ 41 @@ 43 42 44 ( 43 ( 45 read_lock_irq@p1 44 read_lock_irq@p1 46 | 45 | 47 write_lock_irq@p1 46 write_lock_irq@p1 48 | 47 | 49 read_lock_irqsave@p1 48 read_lock_irqsave@p1 50 | 49 | 51 write_lock_irqsave@p1 50 write_lock_irqsave@p1 52 | 51 | 53 spin_lock@p1 52 spin_lock@p1 54 | 53 | 55 spin_trylock@p1 54 spin_trylock@p1 56 | 55 | 57 spin_lock_irq@p1 56 spin_lock_irq@p1 58 | 57 | 59 spin_lock_irqsave@p1 58 spin_lock_irqsave@p1 60 | 59 | 61 local_irq_disable@p1 60 local_irq_disable@p1 62 ) 61 ) 63 (...) 62 (...) 64 ... when != read_unlock_irq(...) 63 ... when != read_unlock_irq(...) 65 when != write_unlock_irq(...) 64 when != write_unlock_irq(...) 66 when != read_unlock_irqrestore(...) 65 when != read_unlock_irqrestore(...) 67 when != write_unlock_irqrestore(...) 66 when != write_unlock_irqrestore(...) 68 when != spin_unlock(...) 67 when != spin_unlock(...) 69 when != spin_unlock_irq(...) 68 when != spin_unlock_irq(...) 70 when != spin_unlock_irqrestore(...) 69 when != spin_unlock_irqrestore(...) 71 when != local_irq_enable(...) 70 when != local_irq_enable(...) 72 fn@p2(...) 71 fn@p2(...) 73 72 74 @depends on locked && patch@ 73 @depends on locked && patch@ 75 position gfp.p; 74 position gfp.p; 76 @@ 75 @@ 77 76 78 - GFP_KERNEL@p 77 - GFP_KERNEL@p 79 + GFP_ATOMIC 78 + GFP_ATOMIC 80 79 81 @depends on locked && !patch@ 80 @depends on locked && !patch@ 82 position gfp.p; 81 position gfp.p; 83 @@ 82 @@ 84 83 85 * GFP_KERNEL@p 84 * GFP_KERNEL@p 86 85 87 @script:python depends on !patch && org@ 86 @script:python depends on !patch && org@ 88 p << gfp.p; 87 p << gfp.p; 89 fn << gfp.fn; 88 fn << gfp.fn; 90 p1 << locked.p1; 89 p1 << locked.p1; 91 p2 << locked.p2; 90 p2 << locked.p2; 92 @@ 91 @@ 93 92 94 cocci.print_main("lock",p1) 93 cocci.print_main("lock",p1) 95 cocci.print_secs("call",p2) 94 cocci.print_secs("call",p2) 96 cocci.print_secs("GFP_KERNEL",p) 95 cocci.print_secs("GFP_KERNEL",p) 97 96 98 @script:python depends on !patch && report@ 97 @script:python depends on !patch && report@ 99 p << gfp.p; 98 p << gfp.p; 100 fn << gfp.fn; 99 fn << gfp.fn; 101 p1 << locked.p1; 100 p1 << locked.p1; 102 p2 << locked.p2; 101 p2 << locked.p2; 103 @@ 102 @@ 104 103 105 msg = "ERROR: function %s called on line %s in 104 msg = "ERROR: function %s called on line %s inside lock on line %s but uses GFP_KERNEL" % (fn,p2[0].line,p1[0].line) 106 coccilib.report.print_report(p[0], msg) 105 coccilib.report.print_report(p[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.