1*4882a593Smuzhiyun// SPDX-License-Identifier: GPL-2.0-only 2*4882a593Smuzhiyun// Check if refcount_t type and API should be used 3*4882a593Smuzhiyun// instead of atomic_t type when dealing with refcounters 4*4882a593Smuzhiyun// 5*4882a593Smuzhiyun// Copyright (c) 2016-2017, Elena Reshetova, Intel Corporation 6*4882a593Smuzhiyun// 7*4882a593Smuzhiyun// Confidence: Moderate 8*4882a593Smuzhiyun// URL: http://coccinelle.lip6.fr/ 9*4882a593Smuzhiyun// Options: --include-headers --very-quiet 10*4882a593Smuzhiyun 11*4882a593Smuzhiyunvirtual report 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun@r1 exists@ 14*4882a593Smuzhiyunidentifier a, x; 15*4882a593Smuzhiyunposition p1, p2; 16*4882a593Smuzhiyunidentifier fname =~ ".*free.*"; 17*4882a593Smuzhiyunidentifier fname2 =~ ".*destroy.*"; 18*4882a593Smuzhiyunidentifier fname3 =~ ".*del.*"; 19*4882a593Smuzhiyunidentifier fname4 =~ ".*queue_work.*"; 20*4882a593Smuzhiyunidentifier fname5 =~ ".*schedule_work.*"; 21*4882a593Smuzhiyunidentifier fname6 =~ ".*call_rcu.*"; 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun@@ 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun( 26*4882a593Smuzhiyun atomic_dec_and_test@p1(&(a)->x) 27*4882a593Smuzhiyun| 28*4882a593Smuzhiyun atomic_dec_and_lock@p1(&(a)->x, ...) 29*4882a593Smuzhiyun| 30*4882a593Smuzhiyun atomic_long_dec_and_lock@p1(&(a)->x, ...) 31*4882a593Smuzhiyun| 32*4882a593Smuzhiyun atomic_long_dec_and_test@p1(&(a)->x) 33*4882a593Smuzhiyun| 34*4882a593Smuzhiyun atomic64_dec_and_test@p1(&(a)->x) 35*4882a593Smuzhiyun| 36*4882a593Smuzhiyun local_dec_and_test@p1(&(a)->x) 37*4882a593Smuzhiyun) 38*4882a593Smuzhiyun... 39*4882a593Smuzhiyun( 40*4882a593Smuzhiyun fname@p2(a, ...); 41*4882a593Smuzhiyun| 42*4882a593Smuzhiyun fname2@p2(...); 43*4882a593Smuzhiyun| 44*4882a593Smuzhiyun fname3@p2(...); 45*4882a593Smuzhiyun| 46*4882a593Smuzhiyun fname4@p2(...); 47*4882a593Smuzhiyun| 48*4882a593Smuzhiyun fname5@p2(...); 49*4882a593Smuzhiyun| 50*4882a593Smuzhiyun fname6@p2(...); 51*4882a593Smuzhiyun) 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun@script:python depends on report@ 55*4882a593Smuzhiyunp1 << r1.p1; 56*4882a593Smuzhiyunp2 << r1.p2; 57*4882a593Smuzhiyun@@ 58*4882a593Smuzhiyunmsg = "atomic_dec_and_test variation before object free at line %s." 59*4882a593Smuzhiyuncoccilib.report.print_report(p1[0], msg % (p2[0].line)) 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun@r4 exists@ 62*4882a593Smuzhiyunidentifier a, x, y; 63*4882a593Smuzhiyunposition p1, p2; 64*4882a593Smuzhiyunidentifier fname =~ ".*free.*"; 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun@@ 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun( 69*4882a593Smuzhiyun atomic_dec_and_test@p1(&(a)->x) 70*4882a593Smuzhiyun| 71*4882a593Smuzhiyun atomic_dec_and_lock@p1(&(a)->x, ...) 72*4882a593Smuzhiyun| 73*4882a593Smuzhiyun atomic_long_dec_and_lock@p1(&(a)->x, ...) 74*4882a593Smuzhiyun| 75*4882a593Smuzhiyun atomic_long_dec_and_test@p1(&(a)->x) 76*4882a593Smuzhiyun| 77*4882a593Smuzhiyun atomic64_dec_and_test@p1(&(a)->x) 78*4882a593Smuzhiyun| 79*4882a593Smuzhiyun local_dec_and_test@p1(&(a)->x) 80*4882a593Smuzhiyun) 81*4882a593Smuzhiyun... 82*4882a593Smuzhiyuny=a 83*4882a593Smuzhiyun... 84*4882a593Smuzhiyunfname@p2(y, ...); 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun@script:python depends on report@ 88*4882a593Smuzhiyunp1 << r4.p1; 89*4882a593Smuzhiyunp2 << r4.p2; 90*4882a593Smuzhiyun@@ 91*4882a593Smuzhiyunmsg = "atomic_dec_and_test variation before object free at line %s." 92*4882a593Smuzhiyuncoccilib.report.print_report(p1[0], msg % (p2[0].line)) 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun@r2 exists@ 95*4882a593Smuzhiyunidentifier a, x; 96*4882a593Smuzhiyunposition p1; 97*4882a593Smuzhiyun@@ 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun( 100*4882a593Smuzhiyunatomic_add_unless(&(a)->x,-1,1)@p1 101*4882a593Smuzhiyun| 102*4882a593Smuzhiyunatomic_long_add_unless(&(a)->x,-1,1)@p1 103*4882a593Smuzhiyun| 104*4882a593Smuzhiyunatomic64_add_unless(&(a)->x,-1,1)@p1 105*4882a593Smuzhiyun) 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun@script:python depends on report@ 108*4882a593Smuzhiyunp1 << r2.p1; 109*4882a593Smuzhiyun@@ 110*4882a593Smuzhiyunmsg = "atomic_add_unless" 111*4882a593Smuzhiyuncoccilib.report.print_report(p1[0], msg) 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun@r3 exists@ 114*4882a593Smuzhiyunidentifier x; 115*4882a593Smuzhiyunposition p1; 116*4882a593Smuzhiyun@@ 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun( 119*4882a593Smuzhiyunx = atomic_add_return@p1(-1, ...); 120*4882a593Smuzhiyun| 121*4882a593Smuzhiyunx = atomic_long_add_return@p1(-1, ...); 122*4882a593Smuzhiyun| 123*4882a593Smuzhiyunx = atomic64_add_return@p1(-1, ...); 124*4882a593Smuzhiyun) 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun@script:python depends on report@ 127*4882a593Smuzhiyunp1 << r3.p1; 128*4882a593Smuzhiyun@@ 129*4882a593Smuzhiyunmsg = "x = atomic_add_return(-1, ...)" 130*4882a593Smuzhiyuncoccilib.report.print_report(p1[0], msg) 131