Commit e105007c1271243568d58c8a4285b19c8eea48d1

Authored by Nicolas Palix
Committed by Michal Marek
1 parent 7703692ef8

Coccinelle: Add locks/call_kern.cocci

Find functions that refer to GFP_KERNEL but are called with locks held.
The proposed change of converting the GFP_KERNEL is not necessarily the
correct one.  It may be desired to unlock the lock, or to not call the
function under the lock in the first place.

Signed-off-by: Nicolas Palix <npalix@diku.dk>
Signed-off-by: Julia Lawall <julia@diku.dk>
Signed-off-by: Michal Marek <mmarek@suse.cz>

Showing 1 changed file with 74 additions and 0 deletions Side-by-side Diff

scripts/coccinelle/locks/call_kern.cocci
  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 +
  14 +virtual patch
  15 +
  16 +@gfp exists@
  17 +identifier fn;
  18 +position p;
  19 +@@
  20 +
  21 +fn(...) {
  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@
  36 +identifier gfp.fn;
  37 +@@
  38 +
  39 +(
  40 +read_lock_irq
  41 +|
  42 +write_lock_irq
  43 +|
  44 +read_lock_irqsave
  45 +|
  46 +write_lock_irqsave
  47 +|
  48 +spin_lock
  49 +|
  50 +spin_trylock
  51 +|
  52 +spin_lock_irq
  53 +|
  54 +spin_lock_irqsave
  55 +|
  56 +local_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(...)
  67 +fn(...)
  68 +
  69 +@depends on locked@
  70 +position gfp.p;
  71 +@@
  72 +
  73 +- GFP_KERNEL@p
  74 ++ GFP_ATOMIC