1/// Find functions that refer to GFP_KERNEL but are called with locks held. 2/// The proposed change of converting the GFP_KERNEL is not necessarily the 3/// correct one. It may be desired to unlock the lock, or to not call the 4/// function under the lock in the first place. 5/// 6// Confidence: Moderate 7// Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2. 8// Copyright: (C) 2010 Julia Lawall, DIKU. GPLv2. 9// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. GPLv2. 10// URL: http://coccinelle.lip6.fr/ 11// Comments: 12// Options: -no_includes -include_headers 13 14virtual patch 15 16@gfp exists@ 17identifier fn; 18position p; 19@@ 20 21fn(...) { 22 ... when != read_unlock_irq(...) 23 when != write_unlock_irq(...) 24 when != read_unlock_irqrestore(...) 25 when != write_unlock_irqrestore(...) 26 when != spin_unlock(...) 27 when != spin_unlock_irq(...) 28 when != spin_unlock_irqrestore(...) 29 when != local_irq_enable(...) 30 when any 31 GFP_KERNEL@p 32 ... when any 33} 34 35@locked@ 36identifier gfp.fn; 37@@ 38 39( 40read_lock_irq 41| 42write_lock_irq 43| 44read_lock_irqsave 45| 46write_lock_irqsave 47| 48spin_lock 49| 50spin_trylock 51| 52spin_lock_irq 53| 54spin_lock_irqsave 55| 56local_irq_disable 57) 58 (...) 59... when != read_unlock_irq(...) 60 when != write_unlock_irq(...) 61 when != read_unlock_irqrestore(...) 62 when != write_unlock_irqrestore(...) 63 when != spin_unlock(...) 64 when != spin_unlock_irq(...) 65 when != spin_unlock_irqrestore(...) 66 when != local_irq_enable(...) 67fn(...) 68 69@depends on locked@ 70position gfp.p; 71@@ 72 73- GFP_KERNEL@p 74+ GFP_ATOMIC 75