Michael S. Tsirkin
2016-Jan-10 11:56 UTC
[PATCH v2 0/3] checkpatch: handling of memory barriers
As part of memory barrier cleanup, this patchset extends checkpatch to make it easier to stop incorrect memory barrier usage. This applies on top of my series arch: barrier cleanup + barriers for virt and will be included in the next version of the series. Changes from v2: catch optional\s* before () in barriers rewrite using qr{} instead of map Michael S. Tsirkin (3): checkpatch.pl: add missing memory barriers checkpatch: check for __smp outside barrier.h checkpatch: add virt barriers scripts/checkpatch.pl | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) -- MST
Michael S. Tsirkin
2016-Jan-10 11:56 UTC
[PATCH v2 1/3] checkpatch.pl: add missing memory barriers
SMP-only barriers were missing in checkpatch.pl Refactor code slightly to make adding more variants easier. Signed-off-by: Michael S. Tsirkin <mst at redhat.com> --- scripts/checkpatch.pl | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index 2b3c228..97b8b62 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl @@ -5116,7 +5116,25 @@ sub process { } } # check for memory barriers without a comment. - if ($line =~ /\b(mb|rmb|wmb|read_barrier_depends|smp_mb|smp_rmb|smp_wmb|smp_read_barrier_depends)\(/) { + + my $barriers = qr{ + mb| + rmb| + wmb| + read_barrier_depends + }x; + my $smp_barriers = qr{ + store_release| + load_acquire| + store_mb| + ($barriers) + }x; + my $all_barriers = qr{ + $barriers| + smp_($smp_barriers) + }x; + + if ($line =~ /\b($all_barriers)\s*\(/) { if (!ctx_has_comment($first_line, $linenr)) { WARN("MEMORY_BARRIER", "memory barrier without comment\n" . $herecurr); -- MST
Michael S. Tsirkin
2016-Jan-10 11:57 UTC
[PATCH v2 2/3] checkpatch: check for __smp outside barrier.h
Introduction of __smp barriers cleans up a bunch of duplicate code, but it gives people an additional handle onto a "new" set of barriers - just because they're prefixed with __* unfortunately doesn't stop anyone from using it (as happened with other arch stuff before.) Add a checkpatch test so it will trigger a warning. Reported-by: Russell King <linux at arm.linux.org.uk> Signed-off-by: Michael S. Tsirkin <mst at redhat.com> --- scripts/checkpatch.pl | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index 97b8b62..a96adcb 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl @@ -5141,6 +5141,16 @@ sub process { } } + my $underscore_smp_barriers = qr{__smp_($smp_barriers)}x; + + if ($realfile !~ m@^include/asm-generic/@ && + $realfile !~ m@/barrier\.h$@ && + $line =~ m/\b($underscore_smp_barriers)\s*\(/ && + $line !~ m/^.\s*\#\s*define\s+($underscore_smp_barriers)\s*\(/) { + WARN("MEMORY_BARRIER", + "__smp memory barriers shouldn't be used outside barrier.h and asm-generic\n" . $herecurr); + } + # check for waitqueue_active without a comment. if ($line =~ /\bwaitqueue_active\s*\(/) { if (!ctx_has_comment($first_line, $linenr)) { -- MST
Add virt_ barriers to list of barriers to check for presence of a comment. Signed-off-by: Michael S. Tsirkin <mst at redhat.com> --- scripts/checkpatch.pl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index a96adcb..5ca272b 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl @@ -5131,7 +5131,8 @@ sub process { }x; my $all_barriers = qr{ $barriers| - smp_($smp_barriers) + smp_($smp_barriers)| + virt_($smp_barriers) }x; if ($line =~ /\b($all_barriers)\s*\(/) { -- MST
Joe Perches
2016-Jan-10 15:07 UTC
[PATCH v2 1/3] checkpatch.pl: add missing memory barriers
On Sun, 2016-01-10 at 13:56 +0200, Michael S. Tsirkin wrote:> SMP-only barriers were missing in checkpatch.pl > > Refactor code slightly to make adding more variants easier.[]> diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl[]> @@ -5116,7 +5116,25 @@ sub process { > ? } > ? } > ?# check for memory barriers without a comment. > - if ($line =~ /\b(mb|rmb|wmb|read_barrier_depends|smp_mb|smp_rmb|smp_wmb|smp_read_barrier_depends)\(/) { > + > + my $barriers = qr{ > + mb| > + rmb| > + wmb| > + read_barrier_depends > + }x; > + my $smp_barriers = qr{ > + store_release| > + load_acquire| > + store_mb| > + ($barriers) > + }x;If I use a variable called $smp_barriers, I'd expect it to actually be the smp_barriers, not to have to prefix it with smp_ before using it. my $smp_barriers = qr{ smp_store_release| smp_load_acquire| smp_store_mb| smp_read_barrier_depends }x; or my $smp_barriers = qr{ smp_(?:store_release|load_acquire|store_mb|read_barrier_depends) }x; ?> + my $all_barriers = qr{ > + $barriers| > + smp_($smp_barriers) > + }x;And this shouldn't have a capture group. my $all_barriers = qr{ $barriers| $smp_barriers }x;> + > + if ($line =~ /\b($all_barriers)\s*\(/) {This doesn't need the capture group either (?:all_barriers)> ? if (!ctx_has_comment($first_line, $linenr)) > { > ? WARN("MEMORY_BARRIER", > ? ?????"memory barrier without > comment\n" . $herecurr);
Joe Perches
2016-Jan-10 15:08 UTC
[PATCH v2 2/3] checkpatch: check for __smp outside barrier.h
On Sun, 2016-01-10 at 13:57 +0200, Michael S. Tsirkin wrote:> Introduction of __smp barriers cleans up a bunch of duplicate code, but > it gives people an additional handle onto a "new" set of barriers - just > because they're prefixed with __* unfortunately doesn't stop anyone from > using it (as happened with other arch stuff before.) > > Add a checkpatch test so it will trigger a warning.[]> diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl[]> @@ -5141,6 +5141,16 @@ sub process { > ? } > ? } > ? > + my $underscore_smp_barriers = qr{__smp_($smp_barriers)}x;another unnecessary capture group> + > + if ($realfile !~ m@^include/asm-generic/@ && > + ????$realfile !~ m@/barrier\.h$@ && > + ????$line =~ m/\b($underscore_smp_barriers)\s*\(/ && > + ????$line !~ m/^.\s*\#\s*define\s+($underscore_smp_barriers)\s*\(/) { > + WARN("MEMORY_BARRIER", > + ?????"__smp memory barriers shouldn't be used outside barrier.h and asm-generic\n" . $herecurr); > + } > + > ?# check for waitqueue_active without a comment. > ? if ($line =~ /\bwaitqueue_active\s*\(/) { > ? if (!ctx_has_comment($first_line, $linenr)) {
Possibly Parallel Threads
- [PATCH v2 1/3] checkpatch.pl: add missing memory barriers
- [PATCH v2 0/3] checkpatch: handling of memory barriers
- [PATCH v2 0/3] checkpatch: handling of memory barriers
- [PATCH 1/3] checkpatch.pl: add missing memory barriers
- [PATCH 1/3] checkpatch.pl: add missing memory barriers