1e105007cSNicolas Palix/// Find functions that refer to GFP_KERNEL but are called with locks held. 2*29a36d4dSJulia Lawall//# The proposed change of converting the GFP_KERNEL is not necessarily the 3*29a36d4dSJulia Lawall//# correct one. It may be desired to unlock the lock, or to not call the 4*29a36d4dSJulia Lawall//# function under the lock in the first place. 5e105007cSNicolas Palix/// 6e105007cSNicolas Palix// Confidence: Moderate 7*29a36d4dSJulia Lawall// Copyright: (C) 2012 Nicolas Palix. GPLv2. 8*29a36d4dSJulia Lawall// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. GPLv2. 9*29a36d4dSJulia Lawall// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. GPLv2. 10e105007cSNicolas Palix// URL: http://coccinelle.lip6.fr/ 11e105007cSNicolas Palix// Comments: 12e105007cSNicolas Palix// Options: -no_includes -include_headers 13e105007cSNicolas Palix 14e105007cSNicolas Palixvirtual patch 15*29a36d4dSJulia Lawallvirtual context 16*29a36d4dSJulia Lawallvirtual org 17*29a36d4dSJulia Lawallvirtual report 18e105007cSNicolas Palix 19e105007cSNicolas Palix@gfp exists@ 20e105007cSNicolas Palixidentifier fn; 21e105007cSNicolas Palixposition p; 22e105007cSNicolas Palix@@ 23e105007cSNicolas Palix 24e105007cSNicolas Palixfn(...) { 25e105007cSNicolas Palix ... when != read_unlock_irq(...) 26e105007cSNicolas Palix when != write_unlock_irq(...) 27e105007cSNicolas Palix when != read_unlock_irqrestore(...) 28e105007cSNicolas Palix when != write_unlock_irqrestore(...) 29e105007cSNicolas Palix when != spin_unlock(...) 30e105007cSNicolas Palix when != spin_unlock_irq(...) 31e105007cSNicolas Palix when != spin_unlock_irqrestore(...) 32e105007cSNicolas Palix when != local_irq_enable(...) 33e105007cSNicolas Palix when any 34e105007cSNicolas Palix GFP_KERNEL@p 35e105007cSNicolas Palix ... when any 36e105007cSNicolas Palix} 37e105007cSNicolas Palix 38*29a36d4dSJulia Lawall@locked exists@ 39e105007cSNicolas Palixidentifier gfp.fn; 40*29a36d4dSJulia Lawallposition p1,p2; 41e105007cSNicolas Palix@@ 42e105007cSNicolas Palix 43e105007cSNicolas Palix( 44*29a36d4dSJulia Lawallread_lock_irq@p1 45e105007cSNicolas Palix| 46*29a36d4dSJulia Lawallwrite_lock_irq@p1 47e105007cSNicolas Palix| 48*29a36d4dSJulia Lawallread_lock_irqsave@p1 49e105007cSNicolas Palix| 50*29a36d4dSJulia Lawallwrite_lock_irqsave@p1 51e105007cSNicolas Palix| 52*29a36d4dSJulia Lawallspin_lock@p1 53e105007cSNicolas Palix| 54*29a36d4dSJulia Lawallspin_trylock@p1 55e105007cSNicolas Palix| 56*29a36d4dSJulia Lawallspin_lock_irq@p1 57e105007cSNicolas Palix| 58*29a36d4dSJulia Lawallspin_lock_irqsave@p1 59e105007cSNicolas Palix| 60*29a36d4dSJulia Lawalllocal_irq_disable@p1 61e105007cSNicolas Palix) 62e105007cSNicolas Palix (...) 63e105007cSNicolas Palix... when != read_unlock_irq(...) 64e105007cSNicolas Palix when != write_unlock_irq(...) 65e105007cSNicolas Palix when != read_unlock_irqrestore(...) 66e105007cSNicolas Palix when != write_unlock_irqrestore(...) 67e105007cSNicolas Palix when != spin_unlock(...) 68e105007cSNicolas Palix when != spin_unlock_irq(...) 69e105007cSNicolas Palix when != spin_unlock_irqrestore(...) 70e105007cSNicolas Palix when != local_irq_enable(...) 71*29a36d4dSJulia Lawallfn@p2(...) 72e105007cSNicolas Palix 73*29a36d4dSJulia Lawall@depends on locked && patch@ 74e105007cSNicolas Palixposition gfp.p; 75e105007cSNicolas Palix@@ 76e105007cSNicolas Palix 77e105007cSNicolas Palix- GFP_KERNEL@p 78e105007cSNicolas Palix+ GFP_ATOMIC 79*29a36d4dSJulia Lawall 80*29a36d4dSJulia Lawall@depends on locked && !patch@ 81*29a36d4dSJulia Lawallposition gfp.p; 82*29a36d4dSJulia Lawall@@ 83*29a36d4dSJulia Lawall 84*29a36d4dSJulia Lawall* GFP_KERNEL@p 85*29a36d4dSJulia Lawall 86*29a36d4dSJulia Lawall@script:python depends on !patch && org@ 87*29a36d4dSJulia Lawallp << gfp.p; 88*29a36d4dSJulia Lawallfn << gfp.fn; 89*29a36d4dSJulia Lawallp1 << locked.p1; 90*29a36d4dSJulia Lawallp2 << locked.p2; 91*29a36d4dSJulia Lawall@@ 92*29a36d4dSJulia Lawall 93*29a36d4dSJulia Lawallcocci.print_main("lock",p1) 94*29a36d4dSJulia Lawallcocci.print_secs("call",p2) 95*29a36d4dSJulia Lawallcocci.print_secs("GFP_KERNEL",p) 96*29a36d4dSJulia Lawall 97*29a36d4dSJulia Lawall@script:python depends on !patch && report@ 98*29a36d4dSJulia Lawallp << gfp.p; 99*29a36d4dSJulia Lawallfn << gfp.fn; 100*29a36d4dSJulia Lawallp1 << locked.p1; 101*29a36d4dSJulia Lawallp2 << locked.p2; 102*29a36d4dSJulia Lawall@@ 103*29a36d4dSJulia Lawall 104*29a36d4dSJulia Lawallmsg = "ERROR: function %s called on line %s inside lock on line %s but uses GFP_KERNEL" % (fn,p2[0].line,p1[0].line) 105*29a36d4dSJulia Lawallcoccilib.report.print_report(p[0], msg) 106