Messages in this thread | | | Date | Tue, 24 Jan 2023 12:09:48 +0100 | From | Andrea Parri <> | Subject | Re: Internal vs. external barriers (was: Re: Interesting LKMM litmus test) |
| |
> There is the one below, but I am (1) not sure that I have it right, > (2) not immediately certain that the Linux-kernel implementation would > forbid it, (3) not immediately sure that it should be forbidden. > > In the meantime, thoughts?
As it stands, P0 to completion, then P1 to completion, then P2 to completion should meet the "exists" clause; I guess we want "x=1" in the clause (or the values of the stores to "x" exchanged).
Andrea
> ------------------------------------------------------------------------ > > C C-srcu-observed-3 > > (* > * Result: Sometimes > *) > > {} > > P0(int *x, int *y, int *z, struct srcu_struct *s) > { > int r1; > > r1 = srcu_read_lock(s); > WRITE_ONCE(*y, 1); > WRITE_ONCE(*x, 1); > srcu_read_unlock(s, r1); > } > > P1(int *x, int *y, int *z, struct srcu_struct *s) > { > int r1; > > r1 = READ_ONCE(*y); > synchronize_srcu(s); > WRITE_ONCE(*z, 1); > } > > P2(int *x, int *y, int *z, struct srcu_struct *s) > { > WRITE_ONCE(*z, 2); > smp_mb(); > WRITE_ONCE(*x, 2); > } > > exists (1:r1=1 /\ x=2 /\ z=2)
| |