.. | .. |
---|
1 | | -This directory contains the following litmus tests: |
---|
| 1 | +============ |
---|
| 2 | +LITMUS TESTS |
---|
| 3 | +============ |
---|
2 | 4 | |
---|
3 | 5 | CoRR+poonceonce+Once.litmus |
---|
4 | 6 | Test of read-read coherence, that is, whether or not two |
---|
.. | .. |
---|
36 | 38 | ISA2+pooncelock+pooncelock+pombonce.litmus |
---|
37 | 39 | Tests whether the ordering provided by a lock-protected S |
---|
38 | 40 | litmus test is visible to an external process whose accesses are |
---|
39 | | - separated by smp_mb(). This addition of an external process to |
---|
| 41 | + separated by smp_mb(). This addition of an external process to |
---|
40 | 42 | S is otherwise known as ISA2. |
---|
41 | 43 | |
---|
42 | 44 | ISA2+poonceonces.litmus |
---|
.. | .. |
---|
151 | 153 | A great many more litmus tests are available here: |
---|
152 | 154 | |
---|
153 | 155 | https://github.com/paulmckrcu/litmus |
---|
| 156 | + |
---|
| 157 | +================== |
---|
| 158 | +LITMUS TEST NAMING |
---|
| 159 | +================== |
---|
| 160 | + |
---|
| 161 | +Litmus tests are usually named based on their contents, which means that |
---|
| 162 | +looking at the name tells you what the litmus test does. The naming |
---|
| 163 | +scheme covers litmus tests having a single cycle that passes through |
---|
| 164 | +each process exactly once, so litmus tests not fitting this description |
---|
| 165 | +are named on an ad-hoc basis. |
---|
| 166 | + |
---|
| 167 | +The structure of a litmus-test name is the litmus-test class, a plus |
---|
| 168 | +sign ("+"), and one string for each process, separated by plus signs. |
---|
| 169 | +The end of the name is ".litmus". |
---|
| 170 | + |
---|
| 171 | +The litmus-test classes may be found in the infamous test6.pdf: |
---|
| 172 | +https://www.cl.cam.ac.uk/~pes20/ppc-supplemental/test6.pdf |
---|
| 173 | +Each class defines the pattern of accesses and of the variables accessed. |
---|
| 174 | +For example, if the one process writes to a pair of variables, and |
---|
| 175 | +the other process reads from these same variables, the corresponding |
---|
| 176 | +litmus-test class is "MP" (message passing), which may be found on the |
---|
| 177 | +left-hand end of the second row of tests on page one of test6.pdf. |
---|
| 178 | + |
---|
| 179 | +The strings used to identify the actions carried out by each process are |
---|
| 180 | +complex due to a desire to have short(er) names. Thus, there is a tool to |
---|
| 181 | +generate these strings from a given litmus test's actions. For example, |
---|
| 182 | +consider the processes from SB+rfionceonce-poonceonces.litmus: |
---|
| 183 | + |
---|
| 184 | + P0(int *x, int *y) |
---|
| 185 | + { |
---|
| 186 | + int r1; |
---|
| 187 | + int r2; |
---|
| 188 | + |
---|
| 189 | + WRITE_ONCE(*x, 1); |
---|
| 190 | + r1 = READ_ONCE(*x); |
---|
| 191 | + r2 = READ_ONCE(*y); |
---|
| 192 | + } |
---|
| 193 | + |
---|
| 194 | + P1(int *x, int *y) |
---|
| 195 | + { |
---|
| 196 | + int r3; |
---|
| 197 | + int r4; |
---|
| 198 | + |
---|
| 199 | + WRITE_ONCE(*y, 1); |
---|
| 200 | + r3 = READ_ONCE(*y); |
---|
| 201 | + r4 = READ_ONCE(*x); |
---|
| 202 | + } |
---|
| 203 | + |
---|
| 204 | +The next step is to construct a space-separated list of descriptors, |
---|
| 205 | +interleaving descriptions of the relation between a pair of consecutive |
---|
| 206 | +accesses with descriptions of the second access in the pair. |
---|
| 207 | + |
---|
| 208 | +P0()'s WRITE_ONCE() is read by its first READ_ONCE(), which is a |
---|
| 209 | +reads-from link (rf) and internal to the P0() process. This is |
---|
| 210 | +"rfi", which is an abbreviation for "reads-from internal". Because |
---|
| 211 | +some of the tools string these abbreviations together with space |
---|
| 212 | +characters separating processes, the first character is capitalized, |
---|
| 213 | +resulting in "Rfi". |
---|
| 214 | + |
---|
| 215 | +P0()'s second access is a READ_ONCE(), as opposed to (for example) |
---|
| 216 | +smp_load_acquire(), so next is "Once". Thus far, we have "Rfi Once". |
---|
| 217 | + |
---|
| 218 | +P0()'s third access is also a READ_ONCE(), but to y rather than x. |
---|
| 219 | +This is related to P0()'s second access by program order ("po"), |
---|
| 220 | +to a different variable ("d"), and both accesses are reads ("RR"). |
---|
| 221 | +The resulting descriptor is "PodRR". Because P0()'s third access is |
---|
| 222 | +READ_ONCE(), we add another "Once" descriptor. |
---|
| 223 | + |
---|
| 224 | +A from-read ("fre") relation links P0()'s third to P1()'s first |
---|
| 225 | +access, and the resulting descriptor is "Fre". P1()'s first access is |
---|
| 226 | +WRITE_ONCE(), which as before gives the descriptor "Once". The string |
---|
| 227 | +thus far is thus "Rfi Once PodRR Once Fre Once". |
---|
| 228 | + |
---|
| 229 | +The remainder of P1() is similar to P0(), which means we add |
---|
| 230 | +"Rfi Once PodRR Once". Another fre links P1()'s last access to |
---|
| 231 | +P0()'s first access, which is WRITE_ONCE(), so we add "Fre Once". |
---|
| 232 | +The full string is thus: |
---|
| 233 | + |
---|
| 234 | + Rfi Once PodRR Once Fre Once Rfi Once PodRR Once Fre Once |
---|
| 235 | + |
---|
| 236 | +This string can be given to the "norm7" and "classify7" tools to |
---|
| 237 | +produce the name: |
---|
| 238 | + |
---|
| 239 | + $ norm7 -bell linux-kernel.bell \ |
---|
| 240 | + Rfi Once PodRR Once Fre Once Rfi Once PodRR Once Fre Once | \ |
---|
| 241 | + sed -e 's/:.*//g' |
---|
| 242 | + SB+rfionceonce-poonceonces |
---|
| 243 | + |
---|
| 244 | +Adding the ".litmus" suffix: SB+rfionceonce-poonceonces.litmus |
---|
| 245 | + |
---|
| 246 | +The descriptors that describe connections between consecutive accesses |
---|
| 247 | +within the cycle through a given litmus test can be provided by the herd7 |
---|
| 248 | +tool (Rfi, Po, Fre, and so on) or by the linux-kernel.bell file (Once, |
---|
| 249 | +Release, Acquire, and so on). |
---|
| 250 | + |
---|
| 251 | +To see the full list of descriptors, execute the following command: |
---|
| 252 | + |
---|
| 253 | + $ diyone7 -bell linux-kernel.bell -show edges |
---|