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