149357869SSascha Wildner// 2da3a745fSSascha Wildner// Look for missing lock releases before returning from an error path. 3da3a745fSSascha Wildner// 4b348c75dSSascha Wildner// Target: DragonFly 5da3a745fSSascha Wildner// Copyright: 2012 - LIP6/INRIA 6da3a745fSSascha Wildner// License: Licensed under ISC. See LICENSE or http://www.isc.org/software/license 7da3a745fSSascha Wildner// Author: Julia Lawall <Julia.Lawall@lip6.fr> 8b348c75dSSascha Wildner// (original code, adapted for DragonFly by swildner) 9da3a745fSSascha Wildner// URL: http://coccinelle.lip6.fr/ 10da3a745fSSascha Wildner// URL: http://coccinellery.org/ 1149357869SSascha Wildner// 12cfa4e38fSSascha Wildner// Applies to kernel code. 13cfa4e38fSSascha Wildner// 1449357869SSascha Wildner// NOTES 1549357869SSascha Wildner// ----- 1649357869SSascha Wildner// * The results of running this patch have to be carefully reviewed. 1749357869SSascha Wildner// Some functions legally return with the lock held, even if the 1849357869SSascha Wildner// below pattern matches. Some other functions begin with the lock 19cfa4e38fSSascha Wildner// held, only to release and then reacquire it again. 2049357869SSascha Wildner// 2149357869SSascha Wildner// * Consider using -timeout because it might run a long time 2249357869SSascha Wildner// (indefinitely?) on some files. 2349357869SSascha Wildner// 2449357869SSascha Wildner 25*d5a7158eSSascha Wildner// ACPI_SERIAL_BEGIN(...) / ACPI_SERIAL_END(...) 26*d5a7158eSSascha Wildner// 27*d5a7158eSSascha Wildner@rcu_ACPI_SERIAL_BEGIN exists@ 28*d5a7158eSSascha Wildnerposition p1; 29*d5a7158eSSascha Wildnerexpression E; 30*d5a7158eSSascha Wildner@@ 31*d5a7158eSSascha Wildner 32*d5a7158eSSascha WildnerACPI_SERIAL_BEGIN@p1(E); 33*d5a7158eSSascha Wildner... 34*d5a7158eSSascha WildnerACPI_SERIAL_END(E); 35*d5a7158eSSascha Wildner 36*d5a7158eSSascha Wildner@exists@ 37*d5a7158eSSascha Wildnerposition rcu_ACPI_SERIAL_BEGIN.p1; 38*d5a7158eSSascha Wildnerexpression E; 39*d5a7158eSSascha Wildner@@ 40*d5a7158eSSascha Wildner 41*d5a7158eSSascha Wildner*ACPI_SERIAL_BEGIN@p1(E); 42*d5a7158eSSascha Wildner... when != ACPI_SERIAL_END(E); 43*d5a7158eSSascha Wildner?*return ...; 44*d5a7158eSSascha Wildner 4549357869SSascha Wildner// crit_enter() / crit_exit() 4649357869SSascha Wildner// 47da3a745fSSascha Wildner@rcu_crit_enter exists@ 48da3a745fSSascha Wildnerposition p1; 4949357869SSascha Wildner@@ 50da3a745fSSascha Wildner 51da3a745fSSascha Wildnercrit_enter@p1(); 52da3a745fSSascha Wildner... 5349357869SSascha Wildnercrit_exit(); 54da3a745fSSascha Wildner 55da3a745fSSascha Wildner@exists@ 56da3a745fSSascha Wildnerposition rcu_crit_enter.p1; 57da3a745fSSascha Wildner@@ 58da3a745fSSascha Wildner 59da3a745fSSascha Wildner*crit_enter@p1(); 60da3a745fSSascha Wildner... when != crit_exit(); 61da3a745fSSascha Wildner?*return ...; 6249357869SSascha Wildner 6349357869SSascha Wildner// get_mplock() / rel_mplock() 6449357869SSascha Wildner// 65da3a745fSSascha Wildner@rcu_get_mplock exists@ 66da3a745fSSascha Wildnerposition p1; 6749357869SSascha Wildner@@ 68da3a745fSSascha Wildner 69da3a745fSSascha Wildnerget_mplock@p1(); 70da3a745fSSascha Wildner... 7149357869SSascha Wildnerrel_mplock(); 72da3a745fSSascha Wildner 73da3a745fSSascha Wildner@exists@ 74da3a745fSSascha Wildnerposition rcu_get_mplock.p1; 75da3a745fSSascha Wildner@@ 76da3a745fSSascha Wildner 77da3a745fSSascha Wildner*get_mplock@p1(); 78da3a745fSSascha Wildner... when != rel_mplock(); 79da3a745fSSascha Wildner?*return ...; 8049357869SSascha Wildner 8149357869SSascha Wildner// lockmgr(..., {LK_EXCLUSIVE,LK_SHARED}) / lockmgr(..., LK_RELEASE) 8249357869SSascha Wildner// 83da3a745fSSascha Wildner@rcu_lockmgr exists@ 84da3a745fSSascha Wildnerposition p1; 85da3a745fSSascha Wildnerexpression E; 8649357869SSascha Wildner@@ 87da3a745fSSascha Wildner 88da3a745fSSascha Wildnerlockmgr@p1(E,\(LK_SHARED\|LK_EXCLUSIVE\)); 89da3a745fSSascha Wildner... 90da3a745fSSascha Wildnerlockmgr(E,LK_RELEASE); 91da3a745fSSascha Wildner 92da3a745fSSascha Wildner@exists@ 93da3a745fSSascha Wildnerposition rcu_lockmgr.p1; 94da3a745fSSascha Wildnerexpression E; 9549357869SSascha Wildner@@ 96da3a745fSSascha Wildner 97da3a745fSSascha Wildner*lockmgr@p1(E,\(LK_SHARED\|LK_EXCLUSIVE\)); 98da3a745fSSascha Wildner... when != lockmgr(E,LK_RELEASE); 99da3a745fSSascha Wildner?*return ...; 10049357869SSascha Wildner 10149357869SSascha Wildner// lwkt_gettoken(...) / lwkt_reltoken(...) 10249357869SSascha Wildner// 103da3a745fSSascha Wildner@rcu_lwkt_gettoken exists@ 104da3a745fSSascha Wildnerposition p1; 105da3a745fSSascha Wildnerexpression E; 10649357869SSascha Wildner@@ 107da3a745fSSascha Wildner 108da3a745fSSascha Wildnerlwkt_gettoken@p1(E); 109da3a745fSSascha Wildner... 110da3a745fSSascha Wildnerlwkt_reltoken(E); 111da3a745fSSascha Wildner 112da3a745fSSascha Wildner@exists@ 113da3a745fSSascha Wildnerposition rcu_lwkt_gettoken.p1; 114da3a745fSSascha Wildnerexpression E; 11549357869SSascha Wildner@@ 116da3a745fSSascha Wildner 117da3a745fSSascha Wildner*lwkt_gettoken@p1(E); 118da3a745fSSascha Wildner... when != lwkt_reltoken(E); 119da3a745fSSascha Wildner?*return ...; 12049357869SSascha Wildner 12149357869SSascha Wildner// lwkt_serialize_enter(...) / lwkt_serialize_exit(...) 12249357869SSascha Wildner// 123da3a745fSSascha Wildner@rcu_lwkt_serialize_enter exists@ 124da3a745fSSascha Wildnerposition p1; 125da3a745fSSascha Wildnerexpression E; 12649357869SSascha Wildner@@ 127da3a745fSSascha Wildner 128da3a745fSSascha Wildnerlwkt_serialize_enter@p1(E); 129da3a745fSSascha Wildner... 130da3a745fSSascha Wildnerlwkt_serialize_exit(E); 131da3a745fSSascha Wildner 132da3a745fSSascha Wildner@exists@ 133da3a745fSSascha Wildnerposition rcu_lwkt_serialize_enter.p1; 134da3a745fSSascha Wildnerexpression E; 13549357869SSascha Wildner@@ 136da3a745fSSascha Wildner 137da3a745fSSascha Wildner*lwkt_serialize_enter@p1(E); 138da3a745fSSascha Wildner... when != lwkt_serialize_exit(E); 139da3a745fSSascha Wildner?*return ...; 14049357869SSascha Wildner 14166632c1aSSascha Wildner// nlookup_init(...) / nlookup_done(...) 14266632c1aSSascha Wildner// 14366632c1aSSascha Wildner@rcu_nlookup_init exists@ 14466632c1aSSascha Wildnerposition p1; 14566632c1aSSascha Wildnerexpression E; 14666632c1aSSascha Wildner@@ 14766632c1aSSascha Wildner 14866632c1aSSascha Wildnernlookup_init@p1(E,...); 14966632c1aSSascha Wildner... 15066632c1aSSascha Wildnernlookup_done(E); 15166632c1aSSascha Wildner 15266632c1aSSascha Wildner@exists@ 15366632c1aSSascha Wildnerposition rcu_nlookup_init.p1; 15466632c1aSSascha Wildnerexpression E; 15566632c1aSSascha Wildner@@ 15666632c1aSSascha Wildner 15766632c1aSSascha Wildner*nlookup_init@p1(E,...); 15866632c1aSSascha Wildner... when != nlookup_done(E); 15966632c1aSSascha Wildner?*return ...; 16066632c1aSSascha Wildner 16149357869SSascha Wildner// spin_lock(...) / spin_unlock(...) 16249357869SSascha Wildner// 163da3a745fSSascha Wildner@rcu_spin_lock exists@ 164da3a745fSSascha Wildnerposition p1; 165da3a745fSSascha Wildnerexpression E; 16649357869SSascha Wildner@@ 167da3a745fSSascha Wildner 168da3a745fSSascha Wildnerspin_lock@p1(E); 169da3a745fSSascha Wildner... 170da3a745fSSascha Wildnerspin_unlock(E); 171da3a745fSSascha Wildner 172da3a745fSSascha Wildner@exists@ 173da3a745fSSascha Wildnerposition rcu_spin_lock.p1; 174da3a745fSSascha Wildnerexpression E; 17549357869SSascha Wildner@@ 176da3a745fSSascha Wildner 177da3a745fSSascha Wildner*spin_lock@p1(E); 178da3a745fSSascha Wildner... when != spin_unlock(E); 179da3a745fSSascha Wildner?*return ...; 180be55a667SSascha Wildner 181be55a667SSascha Wildner// vm_object_hold(...) / vm_object_drop(...) 182be55a667SSascha Wildner// 183da3a745fSSascha Wildner@rcu_vm_object_hold exists@ 184da3a745fSSascha Wildnerposition p1; 185da3a745fSSascha Wildnerexpression E; 186be55a667SSascha Wildner@@ 187da3a745fSSascha Wildner 188da3a745fSSascha Wildnervm_object_hold@p1(E); 189da3a745fSSascha Wildner... 190da3a745fSSascha Wildnervm_object_drop(E); 191da3a745fSSascha Wildner 192da3a745fSSascha Wildner@exists@ 193da3a745fSSascha Wildnerposition rcu_vm_object_hold.p1; 194da3a745fSSascha Wildnerexpression E; 195be55a667SSascha Wildner@@ 196da3a745fSSascha Wildner 197da3a745fSSascha Wildner*vm_object_hold@p1(E); 198da3a745fSSascha Wildner... when != vm_object_drop(E); 199da3a745fSSascha Wildner?*return ...; 200b348c75dSSascha Wildner 201b348c75dSSascha Wildner// vn_lock(...) / vn_unlock(...) 202b348c75dSSascha Wildner// 203b348c75dSSascha Wildner@rcu_vn_lock exists@ 204b348c75dSSascha Wildnerposition p1; 205b348c75dSSascha Wildnerexpression E; 206b348c75dSSascha Wildner@@ 207b348c75dSSascha Wildner 208b348c75dSSascha Wildner( 209b348c75dSSascha Wildnervn_lock@p1(E,...); 210b348c75dSSascha Wildner| 211b348c75dSSascha Wildnervget@p1(E); 212b348c75dSSascha Wildner) 213b348c75dSSascha Wildner... 214b348c75dSSascha Wildner( 215b348c75dSSascha Wildnervn_unlock(E); 216b348c75dSSascha Wildner| 217b348c75dSSascha Wildnervput(E); 218b348c75dSSascha Wildner) 219b348c75dSSascha Wildner 220b348c75dSSascha Wildner@exists@ 221b348c75dSSascha Wildnerposition rcu_vn_lock.p1; 222b348c75dSSascha Wildnerexpression E; 223b348c75dSSascha Wildner@@ 224b348c75dSSascha Wildner 225b348c75dSSascha Wildner( 226b348c75dSSascha Wildner*vn_lock@p1(E,...); 227b348c75dSSascha Wildner| 228b348c75dSSascha Wildner*vget@p1(E); 229b348c75dSSascha Wildner) 230b348c75dSSascha Wildner... when != \(vn_unlock\|vput\)(E); 231b348c75dSSascha Wildner?*return ...; 232b348c75dSSascha Wildner 23366632c1aSSascha Wildner// wlan_serialize_enter() / wlan_serialize_exit() 234b348c75dSSascha Wildner// 235b348c75dSSascha Wildner@rcu_wlan_serialize_enter exists@ 236b348c75dSSascha Wildnerposition p1; 237b348c75dSSascha Wildner@@ 238b348c75dSSascha Wildner 239b348c75dSSascha Wildnerwlan_serialize_enter@p1(); 240b348c75dSSascha Wildner... 241b348c75dSSascha Wildnerwlan_serialize_exit(); 242b348c75dSSascha Wildner 243b348c75dSSascha Wildner@exists@ 244b348c75dSSascha Wildnerposition rcu_wlan_serialize_enter.p1; 245b348c75dSSascha Wildner@@ 246b348c75dSSascha Wildner 247b348c75dSSascha Wildner*wlan_serialize_enter@p1(); 248b348c75dSSascha Wildner... when != wlan_serialize_exit(); 249b348c75dSSascha Wildner?*return ...; 250