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