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