Skip to contentSkip to conversation

Add s390.{cfg,cat}

RFC PATCH In review Paul E. McKenney 3 participants 14 messages Mar 28, 2018 – Apr 3, 2018

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

RFC PATCH 1/1 Add s390.{cfg,cat}

Hello!

The prototype patch shown below provides files required to allow herd7 to evaluate C-language litmus tests for the multicopy-atomic TSO ordering provided by s390. This patch should be viewed with great suspicion. It does what I expect it to do on SB (with and without barriers), IRIW without barriers, and Alan's SB with read-of-write added, but my expectations are quite likely faulty, and my test cases are very few in number.

Either way, this is the easy part. The hard part (which I am happy to leave to others) is making litmus7 and klitmus7 able to do tests on actual hardware, as well as enabling herd to handle litmus tests containing BAL. ;-)

Note that CPU architectures already supported by herd might well need only a .cfg file that refers to herd's pre-existing support.

Thoughts?

Thanx, Paul

------------------------------------------------------------------------

commit 2fff0ff161b71215e7f7292b9eff4bc77ba64f29

Author: Paul E. McKenney <[email protected]>
Date:   Wed Mar 28 06:30:39 2018 -0700

tools/memory-model: Add .cfg and .cat files for s390

This commit adds s390.cat and s390.cfg files to allow users to check litmus tests for s390-specific code. Note that this change only enables herd7 checking of C-language litmus tests. Larger changes are required to enable the litmus7 and klitmus7 tools to check litmus tests on real hardare.

tools/memory-model/s390.cat new file +12 -0
new file mode 100644
index 000000000000..618e88f50d9a
@@ -0,0 +1,12 @@
+s390
+
+include "fences.cat"
+include "cos.cat"
+
+(* Atomic *)
+empty rmw & (fre;coe) as atom
+
+(* TSO with multicopy atomicity *)
+acyclic (po \ (W * R)) | po-loc | fr | rf | co as sc
+
+(* Fences are somehow handled implicitly, at least for SB+mb... *)
tools/memory-model/s390.cfg new file +21 -0
new file mode 100644
index 000000000000..d77e05d2395c
@@ -0,0 +1,21 @@
+macros linux-kernel.def
+bell linux-kernel.bell
+model s390.cat
+graph columns
+squished true
+showevents noregs
+movelabel true
+fontsize 8
+xscale 2.0
+yscale 1.5
+arrowsize 0.8
+showinitrf false
+showfinalrf false
+showinitwrites false
+splines spline
+pad 0.1
+edgeattr hb,color,indigo
+edgeattr co,color,blue
+edgeattr mb,color,darkgreen
+edgeattr wmb,color,darkgreen
+edgeattr rmb,color,darkgreen
maintainer
#1 lore raw
Quoted 5 lines · Paul E. McKenney

Hello!

The prototype patch shown below provides files required to allow herd7 to evaluate C-language litmus tests for the multicopy-atomic TSO ordering provided by s390.

There really isn't anything s390 specific here is there? That is, would this not equally work for x86 and sparc, both of which are similarly TSO ?

Given that, should this not be called TSO instead of s390 ?

#2 lore raw
Quoted 10 lines · Peter Zijlstra
Quoted 5 lines · Paul E. McKenney

Hello!

The prototype patch shown below provides files required to allow herd7 to evaluate C-language litmus tests for the multicopy-atomic TSO ordering provided by s390.

There really isn't anything s390 specific here is there? That is, would this not equally work for x86 and sparc, both of which are similarly TSO ?

As I understand it, there is a difference. The difference from TSO systems such as x86 is that s390 is multicopy atomic as well as TSO. In contrast, x86 is TSO as well as other-multicopy-atomic. I must defer to Martin and Christian for details -- this should be interpreted as a feeble first attempt on my part, not any sort of IBM-approved definition of s390. ;-)

Quoted 1 line

Given that, should this not be called TSO instead of s390 ?

I agree completely with a single tso.cfg, TSO.cfg, or whatever name, as opposed to a bunch of identical files for x86, SPARC, ...

Thanx, Paul

maintainer
#4 lore raw
In reply to Paul E. McKenney
Quoted 15 lines · Paul E. McKenney

Hello!

The prototype patch shown below provides files required to allow herd7 to evaluate C-language litmus tests for the multicopy-atomic TSO ordering provided by s390. This patch should be viewed with great suspicion. It does what I expect it to do on SB (with and without barriers), IRIW without barriers, and Alan's SB with read-of-write added, but my expectations are quite likely faulty, and my test cases are very few in number.

Either way, this is the easy part. The hard part (which I am happy to leave to others) is making litmus7 and klitmus7 able to do tests on actual hardware, as well as enabling herd to handle litmus tests containing BAL. ;-)

Quoted 4 lines

Note that CPU architectures already supported by herd might well need only a .cfg file that refers to herd's pre-existing support.

Thoughts?

I don't quite see the point of this. You're not suggesting that we have one Linux Kernel Memory Consistency Model for s390 and another one for all the other architectures, are you?

If the idea is merely to provide a herd model for s390 then it should go into the DIY repository, not into the LKMM repository.

Alan

#5 lore raw
Quoted 17 lines · Alan Stern
Quoted 15 lines · Paul E. McKenney

Hello!

The prototype patch shown below provides files required to allow herd7 to evaluate C-language litmus tests for the multicopy-atomic TSO ordering provided by s390. This patch should be viewed with great suspicion. It does what I expect it to do on SB (with and without barriers), IRIW without barriers, and Alan's SB with read-of-write added, but my expectations are quite likely faulty, and my test cases are very few in number.

Either way, this is the easy part. The hard part (which I am happy to leave to others) is making litmus7 and klitmus7 able to do tests on actual hardware, as well as enabling herd to handle litmus tests containing BAL. ;-)

Quoted 8 lines
Quoted 4 lines

Note that CPU architectures already supported by herd might well need only a .cfg file that refers to herd's pre-existing support.

Thoughts?

I don't quite see the point of this. You're not suggesting that we have one Linux Kernel Memory Consistency Model for s390 and another one for all the other architectures, are you?

Certainly not for common code!

Quoted 2 lines

If the idea is merely to provide a herd model for s390 then it should go into the DIY repository, not into the LKMM repository.

Makes sense.

In the meantime, does the cat file look to you like it correctly models the combination of TSO and multicopy atomicity? Do the fences really work, or did I just get lucky with my choice of litmus tests?

Thanx, Paul

#3 lore raw
In reply to Paul E. McKenney
Quoted 19 lines · Paul E. McKenney
Quoted 10 lines · Peter Zijlstra
Quoted 5 lines · Paul E. McKenney

Hello!

The prototype patch shown below provides files required to allow herd7 to evaluate C-language litmus tests for the multicopy-atomic TSO ordering provided by s390.

There really isn't anything s390 specific here is there? That is, would this not equally work for x86 and sparc, both of which are similarly TSO ?

As I understand it, there is a difference. The difference from TSO systems such as x86 is that s390 is multicopy atomic as well as TSO. In contrast, x86 is TSO as well as other-multicopy-atomic. I must defer to Martin and Christian for details -- this should be interpreted as a feeble first attempt on my part, not any sort of IBM-approved definition of s390. ;-)

Quoted 4 lines
Quoted 1 line

Given that, should this not be called TSO instead of s390 ?

I agree completely with a single tso.cfg, TSO.cfg, or whatever name, as opposed to a bunch of identical files for x86, SPARC, ...

And to Alan's point, it appears that you can already test x86 TSO ordering on C-language litmus tests as follows:

herd7 -conf linux-kernel.cfg -cat x86tso.cat litmus-tests/SB+poonceoncescoh.litmus

Might simply be working by accident, but it does currently work. ;-)

Thanx, Paul

maintainer
#12 lore raw
In reply to Alan Stern
Quoted 6 lines · Alan Stern

I don't quite see the point of this. You're not suggesting that we have one Linux Kernel Memory Consistency Model for s390 and another one for all the other architectures, are you?

If the idea is merely to provide a herd model for s390 then it should go into the DIY repository, not into the LKMM repository.

I suspect the use-case was validating s390 arch code which might not have followed all the regular linux rules because they know its TSO. But yes, I'm tempted to agree that even arch specific code ought to follow the regular rules, just to avoid completely messing up the reader.

maintainer
#6 lore raw
In reply to Paul E. McKenney
Quoted 32 lines · Paul E. McKenney
Quoted 17 lines · Alan Stern
Quoted 15 lines · Paul E. McKenney

Hello!

The prototype patch shown below provides files required to allow herd7 to evaluate C-language litmus tests for the multicopy-atomic TSO ordering provided by s390. This patch should be viewed with great suspicion. It does what I expect it to do on SB (with and without barriers), IRIW without barriers, and Alan's SB with read-of-write added, but my expectations are quite likely faulty, and my test cases are very few in number.

Either way, this is the easy part. The hard part (which I am happy to leave to others) is making litmus7 and klitmus7 able to do tests on actual hardware, as well as enabling herd to handle litmus tests containing BAL. ;-)

Quoted 8 lines
Quoted 4 lines

Note that CPU architectures already supported by herd might well need only a .cfg file that refers to herd's pre-existing support.

Thoughts?

I don't quite see the point of this. You're not suggesting that we have one Linux Kernel Memory Consistency Model for s390 and another one for all the other architectures, are you?

Certainly not for common code!

Quoted 2 lines

If the idea is merely to provide a herd model for s390 then it should go into the DIY repository, not into the LKMM repository.

Quoted 6 lines

Makes sense.

In the meantime, does the cat file look to you like it correctly models the combination of TSO and multicopy atomicity? Do the fences really work, or did I just get lucky with my choice of litmus tests?

You got lucky. Try creating an SB litmus test where, instead of an smp_mb() fence between the write and the read, each thread executes some other kind of fence.

The acyclicity condition should have been written more like this:

let po_ghb = ([R] ; po ; [M]) | ([M] ; po ; [W])

acyclic mfence | po_ghb | rf | fr | co as tso-mca

I don't know what the fence instruction is on s390; change the "mfence" above accordingly. The main difference between this and the corresponding expression in x86tso.cat is that I replaced rfe with rf.

This doesn't account for atomic operations properly; see the "implied" term in x86tso.cat.

Alan

#13 lore raw
In reply to Peter Zijlstra
Quoted 5 lines · Peter Zijlstra
Quoted 4 lines · Alan Stern

I don't quite see the point of this. You're not suggesting that we have one Linux Kernel Memory Consistency Model for s390 and another one for all the other architectures, are you?

Quoted 7 lines
Quoted 2 lines

If the idea is merely to provide a herd model for s390 then it should go into the DIY repository, not into the LKMM repository.

I suspect the use-case was validating s390 arch code which might not have followed all the regular linux rules because they know its TSO. But yes, I'm tempted to agree that even arch specific code ought to follow the regular rules, just to avoid completely messing up the reader.

Another use case is testing an s390 .cat file without having to teach herd about s390 assembly. ;-)

Thanx, Paul

#7 lore raw
In reply to Alan Stern
Quoted 36 lines · Alan Stern
Quoted 34 lines · Paul E. McKenney
Quoted 17 lines · Alan Stern
Quoted 15 lines · Paul E. McKenney

Hello!

The prototype patch shown below provides files required to allow herd7 to evaluate C-language litmus tests for the multicopy-atomic TSO ordering provided by s390. This patch should be viewed with great suspicion. It does what I expect it to do on SB (with and without barriers), IRIW without barriers, and Alan's SB with read-of-write added, but my expectations are quite likely faulty, and my test cases are very few in number.

Either way, this is the easy part. The hard part (which I am happy to leave to others) is making litmus7 and klitmus7 able to do tests on actual hardware, as well as enabling herd to handle litmus tests containing BAL. ;-)

Quoted 8 lines
Quoted 4 lines

Note that CPU architectures already supported by herd might well need only a .cfg file that refers to herd's pre-existing support.

Thoughts?

I don't quite see the point of this. You're not suggesting that we have one Linux Kernel Memory Consistency Model for s390 and another one for all the other architectures, are you?

Certainly not for common code!

Quoted 2 lines

If the idea is merely to provide a herd model for s390 then it should go into the DIY repository, not into the LKMM repository.

Makes sense.

Quoted 8 lines
Quoted 4 lines

In the meantime, does the cat file look to you like it correctly models the combination of TSO and multicopy atomicity? Do the fences really work, or did I just get lucky with my choice of litmus tests?

You got lucky. Try creating an SB litmus test where, instead of an smp_mb() fence between the write and the read, each thread executes some other kind of fence.

Ah, it does indeed get "Never" in that case, which I do not believe to e correct.

Quoted 9 lines

The acyclicity condition should have been written more like this:

let po_ghb = ([R] ; po ; [M]) | ([M] ; po ; [W])

acyclic mfence | po_ghb | rf | fr | co as tso-mca

I don't know what the fence instruction is on s390; change the "mfence" above accordingly. The main difference between this and the corresponding expression in x86tso.cat is that I replaced rfe with rf.

The s390 fence instruction is "bcr 14,0" or "bcr 15,0", depending on how recent of hardware you are running. The latter works everywhere, if I recall correctly. But I do not believe that herd knows about either instruction yet. Ah, and I need to lose the "empty rmw & (fre;coe)". That appears to be where my spurious ordering was coming from, strange though that seems to me.

And your use of "rf" instead of "rfe" makes sense, as that is what makes the read-from-write provide ordering, correct? And that should also cover the "Uniproc check" that would otherwise be required, right?

Except that I get "Sometimes" on CoWR+poonceonce+Once.litmus... Which I can fix by unioning po-loc into po-ghb. Or is there some better way to do this?

Quoted 2 lines

This doesn't account for atomic operations properly; see the "implied" term in x86tso.cat.

I will look at this more later, reaching end of both battery and useful attention span...

Thanx, Paul

maintainer
#8 lore raw
Quoted 18 lines · Paul E. McKenney
Quoted 8 lines
Quoted 4 lines

In the meantime, does the cat file look to you like it correctly models the combination of TSO and multicopy atomicity? Do the fences really work, or did I just get lucky with my choice of litmus tests?

You got lucky. Try creating an SB litmus test where, instead of an smp_mb() fence between the write and the read, each thread executes some other kind of fence.

Ah, it does indeed get "Never" in that case, which I do not believe to e correct.

Quoted 6 lines

The acyclicity condition should have been written more like this:

let po_ghb = ([R] ; po ; [M]) | ([M] ; po ; [W])

acyclic mfence | po_ghb | rf | fr | co as tso-mca

Quoted 8 lines
Quoted 3 lines

I don't know what the fence instruction is on s390; change the "mfence" above accordingly. The main difference between this and the corresponding expression in x86tso.cat is that I replaced rfe with rf.

The s390 fence instruction is "bcr 14,0" or "bcr 15,0", depending on how recent of hardware you are running. The latter works everywhere, if I recall correctly. But I do not believe that herd knows about either instruction yet.

Herd does not need to understand s390 assembly in order to handle the things defined in linux.def, such as "smp_mb()". linux.def doesn't contain any x86 assembly language stuff either (or PPC or ARM).

Quoted 3 lines

Ah, and I need to lose the "empty rmw & (fre;coe)".
That appears to be where my spurious ordering was coming from, strange though that seems to me.

No, don't drop it; it was not the source of your spurious ordering. The extra ordering came from your "(po \ (W * R))" term, which unintentionally matches fences as well as memory accesses.

Quoted 3 lines

And your use of "rf" instead of "rfe" makes sense, as that is what makes the read-from-write provide ordering, correct? And that should also cover the "Uniproc check" that would otherwise be required, right?

I don't think so...

Quoted 1 line

Except that I get "Sometimes" on CoWR+poonceonce+Once.litmus...

Exactly.

Quoted 2 lines

Which I can fix by unioning po-loc into po-ghb. Or is there some better way to do this?

You could just keep the "uniproc" check. These two approaches accept the same set of litmus tests.

Logically, I think of these as two distinct categories of ordering. po_ghb and tso-mca have to do with the order in which stores reach the cache, whereas "uniproc" (AKA sequential consistency per variable) has to do with enforcement of the cache coherence requirements. Clearly they are related, but they aren't the same thing.

Quoted 5 lines
Quoted 2 lines

This doesn't account for atomic operations properly; see the "implied" term in x86tso.cat.

I will look at this more later, reaching end of both battery and useful attention span...

Alan

#9 lore raw
Quoted 54 lines · Alan Stern
Quoted 18 lines · Paul E. McKenney
Quoted 8 lines
Quoted 4 lines

In the meantime, does the cat file look to you like it correctly models the combination of TSO and multicopy atomicity? Do the fences really work, or did I just get lucky with my choice of litmus tests?

You got lucky. Try creating an SB litmus test where, instead of an smp_mb() fence between the write and the read, each thread executes some other kind of fence.

Ah, it does indeed get "Never" in that case, which I do not believe to e correct.

Quoted 6 lines

The acyclicity condition should have been written more like this:

let po_ghb = ([R] ; po ; [M]) | ([M] ; po ; [W])

acyclic mfence | po_ghb | rf | fr | co as tso-mca

Quoted 8 lines
Quoted 3 lines

I don't know what the fence instruction is on s390; change the "mfence" above accordingly. The main difference between this and the corresponding expression in x86tso.cat is that I replaced rfe with rf.

The s390 fence instruction is "bcr 14,0" or "bcr 15,0", depending on how recent of hardware you are running. The latter works everywhere, if I recall correctly. But I do not believe that herd knows about either instruction yet.

Herd does not need to understand s390 assembly in order to handle the things defined in linux.def, such as "smp_mb()". linux.def doesn't contain any x86 assembly language stuff either (or PPC or ARM).

Quoted 3 lines

Ah, and I need to lose the "empty rmw & (fre;coe)".
That appears to be where my spurious ordering was coming from, strange though that seems to me.

No, don't drop it; it was not the source of your spurious ordering. The extra ordering came from your "(po \ (W * R))" term, which unintentionally matches fences as well as memory accesses.

Quoted 3 lines

And your use of "rf" instead of "rfe" makes sense, as that is what makes the read-from-write provide ordering, correct? And that should also cover the "Uniproc check" that would otherwise be required, right?

I don't think so...

Quoted 1 line

Except that I get "Sometimes" on CoWR+poonceonce+Once.litmus...

Exactly.

Quoted 2 lines

Which I can fix by unioning po-loc into po-ghb. Or is there some better way to do this?

Quoted 14 lines

You could just keep the "uniproc" check. These two approaches accept the same set of litmus tests.

Logically, I think of these as two distinct categories of ordering. po_ghb and tso-mca have to do with the order in which stores reach the cache, whereas "uniproc" (AKA sequential consistency per variable) has to do with enforcement of the cache coherence requirements. Clearly they are related, but they aren't the same thing.

Quoted 5 lines
Quoted 2 lines

This doesn't account for atomic operations properly; see the "implied" term in x86tso.cat.

I will look at this more later, reaching end of both battery and useful attention span...

Like the following, perhaps?

Thanx, Paul

------------------------------------------------------------------------

s390

include "fences.cat"
include "cos.cat"

(* Fundamental coherence ordering *)
let com = rf | co | fr
acyclic po-loc | com as coherence

(* Atomic *)
empty rmw & (fre;coe) as atom

(* Fences *)
let mb = [M] ; fencerel(Mb) ; [M]

(* TSO with multicopy atomicity *)
let po-ghb = ([R] ; po ; [M]) | ([M] ; po ; [W])
acyclic mb | po-ghb | fr | rf | co as sc

maintainer
#10 lore raw
Quoted 21 lines · Paul E. McKenney
Quoted 2 lines
Quoted 2 lines

I will look at this more later, reaching end of both battery and useful attention span...

Like the following, perhaps?

Thanx, Paul

------------------------------------------------------------------------

s390

include "fences.cat"
include "cos.cat"

(* Fundamental coherence ordering *)
let com = rf | co | fr
acyclic po-loc | com as coherence

(* Atomic *)
empty rmw & (fre;coe) as atom

Quoted 6 lines

(* Fences *)
let mb = [M] ; fencerel(Mb) ; [M]

(* TSO with multicopy atomicity *)
let po-ghb = ([R] ; po ; [M]) | ([M] ; po ; [W])
acyclic mb | po-ghb | fr | rf | co as sc

Yes, that should work okay (apart from issues related to ordering of atomic accesses).

By the way, what does that last "sc" stand for? Surely not Sequential Consistency! You might consider renaming it to "tso-mca".

Alan

#11 lore raw
Quoted 30 lines · Alan Stern
Quoted 21 lines · Paul E. McKenney
Quoted 2 lines
Quoted 2 lines

I will look at this more later, reaching end of both battery and useful attention span...

Like the following, perhaps?

Thanx, Paul

------------------------------------------------------------------------

s390

include "fences.cat"
include "cos.cat"

(* Fundamental coherence ordering *)
let com = rf | co | fr
acyclic po-loc | com as coherence

(* Atomic *)
empty rmw & (fre;coe) as atom

Quoted 6 lines

(* Fences *)
let mb = [M] ; fencerel(Mb) ; [M]

(* TSO with multicopy atomicity *)
let po-ghb = ([R] ; po ; [M]) | ([M] ; po ; [W])
acyclic mb | po-ghb | fr | rf | co as sc

Quoted 5 lines

Yes, that should work okay (apart from issues related to ordering of atomic accesses).

By the way, what does that last "sc" stand for? Surely not Sequential Consistency! You might consider renaming it to "tso-mca".

Good point, fixed.

But it is the closest to SC in commercial computing systems, for whatever that is worth. ;-)

Thanx, Paul