1e105007cSNicolas Palix/// Find functions that refer to GFP_KERNEL but are called with locks held. 229a36d4dSJulia Lawall//# The proposed change of converting the GFP_KERNEL is not necessarily the 329a36d4dSJulia Lawall//# correct one. It may be desired to unlock the lock, or to not call the 429a36d4dSJulia Lawall//# function under the lock in the first place. 5e105007cSNicolas Palix/// 6e105007cSNicolas Palix// Confidence: Moderate 729a36d4dSJulia Lawall// Copyright: (C) 2012 Nicolas Palix. GPLv2. 829a36d4dSJulia Lawall// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. GPLv2. 929a36d4dSJulia Lawall// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. GPLv2. 10e105007cSNicolas Palix// URL: http://coccinelle.lip6.fr/ 11e105007cSNicolas Palix// Comments: 12*93f14468SNicolas Palix// Options: --no-includes --include-headers 13e105007cSNicolas Palix 14e105007cSNicolas Palixvirtual patch 1529a36d4dSJulia Lawallvirtual context 1629a36d4dSJulia Lawallvirtual org 1729a36d4dSJulia 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 3829a36d4dSJulia Lawall@locked exists@ 39e105007cSNicolas Palixidentifier gfp.fn; 4029a36d4dSJulia Lawallposition p1,p2; 41e105007cSNicolas Palix@@ 42e105007cSNicolas Palix 43e105007cSNicolas Palix( 4429a36d4dSJulia Lawallread_lock_irq@p1 45e105007cSNicolas Palix| 4629a36d4dSJulia Lawallwrite_lock_irq@p1 47e105007cSNicolas Palix| 4829a36d4dSJulia Lawallread_lock_irqsave@p1 49e105007cSNicolas Palix| 5029a36d4dSJulia Lawallwrite_lock_irqsave@p1 51e105007cSNicolas Palix| 5229a36d4dSJulia Lawallspin_lock@p1 53e105007cSNicolas Palix| 5429a36d4dSJulia Lawallspin_trylock@p1 55e105007cSNicolas Palix| 5629a36d4dSJulia Lawallspin_lock_irq@p1 57e105007cSNicolas Palix| 5829a36d4dSJulia Lawallspin_lock_irqsave@p1 59e105007cSNicolas Palix| 6029a36d4dSJulia 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(...) 7129a36d4dSJulia Lawallfn@p2(...) 72e105007cSNicolas Palix 7329a36d4dSJulia Lawall@depends on locked && patch@ 74e105007cSNicolas Palixposition gfp.p; 75e105007cSNicolas Palix@@ 76e105007cSNicolas Palix 77e105007cSNicolas Palix- GFP_KERNEL@p 78e105007cSNicolas Palix+ GFP_ATOMIC 7929a36d4dSJulia Lawall 8029a36d4dSJulia Lawall@depends on locked && !patch@ 8129a36d4dSJulia Lawallposition gfp.p; 8229a36d4dSJulia Lawall@@ 8329a36d4dSJulia Lawall 8429a36d4dSJulia Lawall* GFP_KERNEL@p 8529a36d4dSJulia Lawall 8629a36d4dSJulia Lawall@script:python depends on !patch && org@ 8729a36d4dSJulia Lawallp << gfp.p; 8829a36d4dSJulia Lawallfn << gfp.fn; 8929a36d4dSJulia Lawallp1 << locked.p1; 9029a36d4dSJulia Lawallp2 << locked.p2; 9129a36d4dSJulia Lawall@@ 9229a36d4dSJulia Lawall 9329a36d4dSJulia Lawallcocci.print_main("lock",p1) 9429a36d4dSJulia Lawallcocci.print_secs("call",p2) 9529a36d4dSJulia Lawallcocci.print_secs("GFP_KERNEL",p) 9629a36d4dSJulia Lawall 9729a36d4dSJulia Lawall@script:python depends on !patch && report@ 9829a36d4dSJulia Lawallp << gfp.p; 9929a36d4dSJulia Lawallfn << gfp.fn; 10029a36d4dSJulia Lawallp1 << locked.p1; 10129a36d4dSJulia Lawallp2 << locked.p2; 10229a36d4dSJulia Lawall@@ 10329a36d4dSJulia Lawall 10429a36d4dSJulia Lawallmsg = "ERROR: function %s called on line %s inside lock on line %s but uses GFP_KERNEL" % (fn,p2[0].line,p1[0].line) 10529a36d4dSJulia Lawallcoccilib.report.print_report(p[0], msg) 106