Messages in this thread Patch in this message | | | From | Yury Norov <> | Subject | [PATCH 01/22] introduce bitmap.cocci | Date | Tue, 10 May 2022 08:47:29 -0700 |
| |
Using bitmap_weight() to compare weight of bitmap against a number or expression is common but wrong pattern. The more efficient way is to use bitmap_weight_{empty,full,gt,lt,ge,le,eq} as appropriate.
This patch adds cocci script to test sources for this.
Because for short bitmaps there's no performance adwantage of conditional bitmap_weight over regular one, and because readability of latter may be considered better, bitmap_weight_{gt,lt,ge,le,eq} cases are marked with WARNING.
CC: Andy Shevchenko <andriy.shevchenko@linux.intel.com> CC: Rasmus Villemoes <linux@rasmusvillemoes.dk> CC: Julia Lawall <Julia.Lawall@inria.fr> CC: Nicolas Palix <nicolas.palix@imag.fr> CC: linux-kernel@vger.kernel.org CC: cocci@inria.fr CC: Yury Norov <yury.norov@gmail.com> Signed-off-by: Yury Norov <yury.norov@gmail.com> --- MAINTAINERS | 1 + scripts/coccinelle/api/bitmap.cocci | 104 ++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 scripts/coccinelle/api/bitmap.cocci
diff --git a/MAINTAINERS b/MAINTAINERS index f57e6d38a542..17fd10824636 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -3523,6 +3523,7 @@ F: lib/find_bit.c F: lib/find_bit_benchmark.c F: lib/nodemask.c F: lib/test_bitmap.c +F: scripts/coccinelle/api/bitmap.cocci F: tools/include/linux/bitmap.h F: tools/include/linux/find.h F: tools/lib/bitmap.c diff --git a/scripts/coccinelle/api/bitmap.cocci b/scripts/coccinelle/api/bitmap.cocci new file mode 100644 index 000000000000..24ff1809ba1f --- /dev/null +++ b/scripts/coccinelle/api/bitmap.cocci @@ -0,0 +1,104 @@ +// SPDX-License-Identifier: GPL-2.0-only +/// Use bitmap_empty rather than bitmap_weight() == 0 etc +/// +// Confidence: High +// Copyright: (C) 2022 Yury Norov +// URL: http://coccinelle.lip6.fr/ +// Comments: +// Options: --no-includes --include-headers + +virtual org +virtual report +virtual context +virtual patch + +@rfull depends on !patch@ +position p; +expression E1, E2; +binary operator cmp = {==, !=, <}; +@@ + + bitmap_weight(E1,E2) cmp@p E2 + +@script:python depends on report@ +p << rfull.p; +@@ + +coccilib.report.print_report(p[0], "ERROR: use bitmap_full()") + +@script:python depends on org@ +p << rfull.p; +@@ + +@rempty1 depends on !patch@ +position p; +statement S; +@@ + + if (bitmap_weight@p(...)) S + +@script:python depends on report@ +p << rempty1.p; +@@ + +for p0 in p: + coccilib.report.print_report(p0, "ERROR: use !bitmap_empty()") + +@script:python depends on org@ +p << rempty1.p; +@@ + +@rempty depends on !patch@ +position p; +@@ + + bitmap_weight@p(...) == 0 + +@script:python depends on report@ +p << rempty.p; +@@ + +for p0 in p: + coccilib.report.print_report(p0, "ERROR: use bitmap_empty()") + +@script:python depends on org@ +p << rempty.p; +@@ + +@not_rempty depends on !patch@ +position p; +@@ + + bitmap_weight(...) @p> 0 + +@script:python depends on report@ +p << not_rempty.p; +@@ + +for p0 in p: + coccilib.report.print_report(p0, "ERROR: use \"!bitmap_empty()\"") + +@script:python depends on org@ +p << not_rempty.p; +@@ + + +@rcmp depends on !patch@ +expression exp; +binary operator cmp = {>, <, >=, <=, ==, !=}; +position p; +@@ + + bitmap_weight(...) cmp@p exp + +@script:python depends on report@ +p << rcmp.p; +@@ + +for p0 in p: + coccilib.report.print_report(p0, + "WARNING: use bitmap_weight_{gt,lt,ge,le,eq} as appropriate") + +@script:python depends on org@ +p << rcmp.p; +@@ -- 2.32.0
| |