checkpatch: handling of memory barriers

Started by Michael S. Tsirkin on Jan 11, 2016 · 7 messages from 3 authors · Last reply Jan 11, 2016

Series

3 patches, 1 file

+33 −2

Subsystems (2)

Maintainers (3)

STALE3959d

Revision v4 (4 revisions archived).

Revisions (4)
  1. v1 re-posted go to this post re-posted go to this post
  2. v2 [diff against previous] re-posted go to this post re-posted go to this post
  3. v3 [diff against previous] re-posted go to this post
  4. v4 current [diff against previous] re-posted go to this post re-posted go to this post

open the first message on its own page

  1. [PATCH v4 1/3] checkpatch.pl: add missing memory barriers
    Revisions and related patches
    Revisions (4)
    1. v1 re-posted go to this post
    2. v2 [diff against previous] re-posted go to this post re-posted go to this post
    3. v3 [diff against previous] re-posted go to this post
    4. v4 current [diff against previous] re-posted go to this post re-posted go to this post
  2. [PATCH v4 2/3] checkpatch: check for __smp outside barrier.h
    Revisions and related patches
    Revisions (4)
    1. v1 re-posted go to this post
    2. v2 [diff against previous] re-posted go to this post
    3. v3 [diff against previous] re-posted go to this post re-posted go to this post
    4. v4 current [diff against previous] re-posted go to this post
  3. [PATCH v4 3/3] checkpatch: add virt barriers
    Revisions and related patches
    Revisions (4)
    1. v1 re-posted go to this post
    2. v2 [diff against previous] re-posted go to this post re-posted go to this post
    3. v3 [diff against previous] re-posted go to this post
    4. v4 current [diff against previous] re-posted go to this post
Message details and related content
As part of memory barrier cleanup, this patchset
extends checkpatch to make it easier to stop
incorrect memory barrier usage.

This replaces the checkpatch patches in my series
	arch: barrier cleanup + barriers for virt
and will be included in the pull request including
the series.

changes from v3:
	rename smp_barrier_stems to barrier_stems
	as suggested by Julian Calaby.
	add (?: ... ) around a variable in regexp,
	in case we change the value later so that it matters.
changes from v2:
	address comments by Joe Perches:
	use (?: ... ) to avoid unnecessary capture groups
	rename smp_barriers to smp_barrier_stems for clarity
	add barriers before/after atomic
Changes from v1:
	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

Michael S. Tsirkin (3):
  checkpatch.pl: add missing memory barriers
  checkpatch: check for __smp outside barrier.h
  checkpatch: add virt barriers

 scripts/checkpatch.pl | 33 ++++++++++++++++++++++++++++++++-
 1 file changed, 32 insertions(+), 1 deletion(-)

-- 
MST

[PATCH v4 1/3] checkpatch.pl: add missing memory barriers

Message details and related content
SMP-only barriers were missing in checkpatch.pl

Refactor code slightly to make adding more variants easier.

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 scripts/checkpatch.pl | 22 +++++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index 2b3c228..94b4e33 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -5116,7 +5116,27 @@ 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 $barrier_stems = qr{
+			mb__before_atomic|
+			mb__after_atomic|
+			store_release|
+			load_acquire|
+			store_mb|
+			(?:$barriers)
+		}x;
+		my $all_barriers = qr{
+			(?:$barriers)|
+			smp_(?:$barrier_stems)
+		}x;
+
+		if ($line =~ /\b(?:$all_barriers)\s*\(/) {
 			if (!ctx_has_comment($first_line, $linenr)) {
 				WARN("MEMORY_BARRIER",
 				     "memory barrier without comment\n" . $herecurr);
-- 
MST

[PATCH v4 2/3] checkpatch: check for __smp outside barrier.h

Message details and related content
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 <redacted>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 scripts/checkpatch.pl | 10 ++++++++++
 1 file changed, 10 insertions(+)
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index 94b4e33..25476c2 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -5143,6 +5143,16 @@ sub process {
 			}
 		}
 
+		my $underscore_smp_barriers = qr{__smp_(?:$barrier_stems)}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

[PATCH v4 3/3] checkpatch: add virt barriers

Message details and related content
Add virt_ barriers to list of barriers to check for
presence of a comment.

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 scripts/checkpatch.pl | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index 25476c2..c7bf1aa 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -5133,7 +5133,8 @@ sub process {
 		}x;
 		my $all_barriers = qr{
 			(?:$barriers)|
-			smp_(?:$barrier_stems)
+			smp_(?:$barrier_stems)|
+			virt_(?:$barrier_stems)
 		}x;
 
 		if ($line =~ /\b(?:$all_barriers)\s*\(/) {
-- 
MST
Message details and related content
On Mon, Jan 11, 2016 at 12:59:25PM +0200, Michael S. Tsirkin wrote:
As part of memory barrier cleanup, this patchset
extends checkpatch to make it easier to stop
incorrect memory barrier usage.

This replaces the checkpatch patches in my series
	arch: barrier cleanup + barriers for virt
and will be included in the pull request including
the series.

changes from v3:
	rename smp_barrier_stems to barrier_stems
	as suggested by Julian Calaby.
In fact it was Joe Perches that suggested it.
Sorry about the confusion.
	add (?: ... ) around a variable in regexp,
	in case we change the value later so that it matters.
changes from v2:
	address comments by Joe Perches:
	use (?: ... ) to avoid unnecessary capture groups
	rename smp_barriers to smp_barrier_stems for clarity
	add barriers before/after atomic
Changes from v1:
	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

Michael S. Tsirkin (3):
  checkpatch.pl: add missing memory barriers
  checkpatch: check for __smp outside barrier.h
  checkpatch: add virt barriers

 scripts/checkpatch.pl | 33 ++++++++++++++++++++++++++++++++-
 1 file changed, 32 insertions(+), 1 deletion(-)

-- 
MST
Message details and related content
Hi Michael,

On Mon, Jan 11, 2016 at 10:04 PM, Michael S. Tsirkin [off-list ref] wrote:
On Mon, Jan 11, 2016 at 12:59:25PM +0200, Michael S. Tsirkin wrote:
quoted
As part of memory barrier cleanup, this patchset
extends checkpatch to make it easier to stop
incorrect memory barrier usage.

This replaces the checkpatch patches in my series
      arch: barrier cleanup + barriers for virt
and will be included in the pull request including
the series.

changes from v3:
      rename smp_barrier_stems to barrier_stems
      as suggested by Julian Calaby.
In fact it was Joe Perches that suggested it.
Sorry about the confusion.
I was about to point that out.

FWIW this entire series is:

Acked-by: Julian Calaby <redacted>

Thanks,

-- 
Julian Calaby

Email: julian.calaby@gmail.com
Profile: http://www.google.com/profiles/julian.calaby/
Message details and related content
On Mon, 2016-01-11 at 13:00 +0200, Michael S. Tsirkin wrote:
As part of memory barrier cleanup, this patchset
extends checkpatch to make it easier to stop
incorrect memory barrier usage.
Thanks Michael.

Acked-by: Joe Perches <joe@perches.com>
Keyboard shortcuts
hback out one level
jnext message in thread / next series-diff position
kprevious message in thread / previous series-diff position
ldrill in
Escclose help / fold thread tree
?toggle this help