162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci// Check if refcount_t type and API should be used 362306a36Sopenharmony_ci// instead of atomic_t type when dealing with refcounters 462306a36Sopenharmony_ci// 562306a36Sopenharmony_ci// Copyright (c) 2016-2017, Elena Reshetova, Intel Corporation 662306a36Sopenharmony_ci// 762306a36Sopenharmony_ci// Confidence: Moderate 862306a36Sopenharmony_ci// URL: https://coccinelle.gitlabpages.inria.fr/website 962306a36Sopenharmony_ci// Options: --include-headers --very-quiet 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_civirtual report 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci@r1 exists@ 1462306a36Sopenharmony_ciidentifier a, x; 1562306a36Sopenharmony_ciposition p1, p2; 1662306a36Sopenharmony_ciidentifier fname =~ ".*free.*"; 1762306a36Sopenharmony_ciidentifier fname2 =~ ".*destroy.*"; 1862306a36Sopenharmony_ciidentifier fname3 =~ ".*del.*"; 1962306a36Sopenharmony_ciidentifier fname4 =~ ".*queue_work.*"; 2062306a36Sopenharmony_ciidentifier fname5 =~ ".*schedule_work.*"; 2162306a36Sopenharmony_ciidentifier fname6 =~ ".*call_rcu.*"; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci@@ 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci( 2662306a36Sopenharmony_ci atomic_dec_and_test@p1(&(a)->x) 2762306a36Sopenharmony_ci| 2862306a36Sopenharmony_ci atomic_dec_and_lock@p1(&(a)->x, ...) 2962306a36Sopenharmony_ci| 3062306a36Sopenharmony_ci atomic_long_dec_and_lock@p1(&(a)->x, ...) 3162306a36Sopenharmony_ci| 3262306a36Sopenharmony_ci atomic_long_dec_and_test@p1(&(a)->x) 3362306a36Sopenharmony_ci| 3462306a36Sopenharmony_ci atomic64_dec_and_test@p1(&(a)->x) 3562306a36Sopenharmony_ci| 3662306a36Sopenharmony_ci local_dec_and_test@p1(&(a)->x) 3762306a36Sopenharmony_ci) 3862306a36Sopenharmony_ci... 3962306a36Sopenharmony_ci( 4062306a36Sopenharmony_ci fname@p2(a, ...); 4162306a36Sopenharmony_ci| 4262306a36Sopenharmony_ci fname2@p2(...); 4362306a36Sopenharmony_ci| 4462306a36Sopenharmony_ci fname3@p2(...); 4562306a36Sopenharmony_ci| 4662306a36Sopenharmony_ci fname4@p2(...); 4762306a36Sopenharmony_ci| 4862306a36Sopenharmony_ci fname5@p2(...); 4962306a36Sopenharmony_ci| 5062306a36Sopenharmony_ci fname6@p2(...); 5162306a36Sopenharmony_ci) 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci@script:python depends on report@ 5562306a36Sopenharmony_cip1 << r1.p1; 5662306a36Sopenharmony_cip2 << r1.p2; 5762306a36Sopenharmony_ci@@ 5862306a36Sopenharmony_cimsg = "WARNING: atomic_dec_and_test variation before object free at line %s." 5962306a36Sopenharmony_cicoccilib.report.print_report(p1[0], msg % (p2[0].line)) 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci@r4 exists@ 6262306a36Sopenharmony_ciidentifier a, x, y; 6362306a36Sopenharmony_ciposition p1, p2; 6462306a36Sopenharmony_ciidentifier fname =~ ".*free.*"; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci@@ 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci( 6962306a36Sopenharmony_ci atomic_dec_and_test@p1(&(a)->x) 7062306a36Sopenharmony_ci| 7162306a36Sopenharmony_ci atomic_dec_and_lock@p1(&(a)->x, ...) 7262306a36Sopenharmony_ci| 7362306a36Sopenharmony_ci atomic_long_dec_and_lock@p1(&(a)->x, ...) 7462306a36Sopenharmony_ci| 7562306a36Sopenharmony_ci atomic_long_dec_and_test@p1(&(a)->x) 7662306a36Sopenharmony_ci| 7762306a36Sopenharmony_ci atomic64_dec_and_test@p1(&(a)->x) 7862306a36Sopenharmony_ci| 7962306a36Sopenharmony_ci local_dec_and_test@p1(&(a)->x) 8062306a36Sopenharmony_ci) 8162306a36Sopenharmony_ci... 8262306a36Sopenharmony_ciy=a 8362306a36Sopenharmony_ci... 8462306a36Sopenharmony_cifname@p2(y, ...); 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci@script:python depends on report@ 8862306a36Sopenharmony_cip1 << r4.p1; 8962306a36Sopenharmony_cip2 << r4.p2; 9062306a36Sopenharmony_ci@@ 9162306a36Sopenharmony_cimsg = "WARNING: atomic_dec_and_test variation before object free at line %s." 9262306a36Sopenharmony_cicoccilib.report.print_report(p1[0], msg % (p2[0].line)) 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci@r2 exists@ 9562306a36Sopenharmony_ciidentifier a, x; 9662306a36Sopenharmony_ciposition p1; 9762306a36Sopenharmony_ci@@ 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci( 10062306a36Sopenharmony_ciatomic_add_unless(&(a)->x,-1,1)@p1 10162306a36Sopenharmony_ci| 10262306a36Sopenharmony_ciatomic_long_add_unless(&(a)->x,-1,1)@p1 10362306a36Sopenharmony_ci| 10462306a36Sopenharmony_ciatomic64_add_unless(&(a)->x,-1,1)@p1 10562306a36Sopenharmony_ci) 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci@script:python depends on report@ 10862306a36Sopenharmony_cip1 << r2.p1; 10962306a36Sopenharmony_ci@@ 11062306a36Sopenharmony_cimsg = "WARNING: atomic_add_unless" 11162306a36Sopenharmony_cicoccilib.report.print_report(p1[0], msg) 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci@r3 exists@ 11462306a36Sopenharmony_ciidentifier x; 11562306a36Sopenharmony_ciposition p1; 11662306a36Sopenharmony_ci@@ 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci( 11962306a36Sopenharmony_cix = atomic_add_return@p1(-1, ...); 12062306a36Sopenharmony_ci| 12162306a36Sopenharmony_cix = atomic_long_add_return@p1(-1, ...); 12262306a36Sopenharmony_ci| 12362306a36Sopenharmony_cix = atomic64_add_return@p1(-1, ...); 12462306a36Sopenharmony_ci) 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci@script:python depends on report@ 12762306a36Sopenharmony_cip1 << r3.p1; 12862306a36Sopenharmony_ci@@ 12962306a36Sopenharmony_cimsg = "WARNING: x = atomic_add_return(-1, ...)" 13062306a36Sopenharmony_cicoccilib.report.print_report(p1[0], msg) 131