Add s390.{cfg,cat}
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
@@ -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
@@ -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
Peter Zijlstra
maintainerQuoted 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 ?
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
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
Alan Stern
maintainerQuoted 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
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
Alan Stern
maintainerQuoted 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
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-mcaI 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
Alan Stern
maintainerQuoted 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
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-mcaQuoted 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_ghband 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
Alan Stern
maintainerQuoted 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
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 atomQuoted 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
Peter Zijlstra
maintainerQuoted 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.
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