The zSeries machines make up the IBMTM
mainframe family, previously
known as the 360, 370, and 390 [Int04c].
Parallelism came late to zSeries, but given that these mainframes first
shipped in the mid 1960s, this is not saying much.
The bcr 15,0 instruction is used for the Linux smp_mb(),
smp_rmb(), and smp_wmb() primitives.
It also has comparatively strong memory-ordering semantics, as shown in
Table , which should allow the
smp_wmb() primitive to be a nop (and by the time you read this,
this change may well have happened).
The table actually understates the situation, as the zSeries memory model
is otherwise sequentially consistent, meaning that all CPUs
will agree on the order of unrelated stores from different CPUs.
As with most CPUs, the zSeries architecture does not guarantee a cache-coherent instruction stream, hence, self-modifying code must execute a serializing instruction between updating the instructions and executing them. That said, many actual zSeries machines do in fact accommodate self-modifying code without serializing instructions. The zSeries instruction set provides a large set of serializing instructions, including compare-and-swap, some types of branches (for example, the aforementioned bcr 15,0 instruction), and test-and-set, among others.
Paul E. McKenney 2011-12-16