xref: /linux/Documentation/litmus-tests/rcu/RCU+sync+read.litmus (revision 4b4193256c8d3bc3a5397b5cd9494c2ad386317d)
1*a591890cSJoel Fernandes (Google)C RCU+sync+read
2*a591890cSJoel Fernandes (Google)
3*a591890cSJoel Fernandes (Google)(*
4*a591890cSJoel Fernandes (Google) * Result: Never
5*a591890cSJoel Fernandes (Google) *
6*a591890cSJoel Fernandes (Google) * This litmus test demonstrates that after a grace period, an RCU updater always
7*a591890cSJoel Fernandes (Google) * sees all stores done in prior RCU read-side critical sections. Such
8*a591890cSJoel Fernandes (Google) * read-side critical sections would have ended before the grace period ended.
9*a591890cSJoel Fernandes (Google) *
10*a591890cSJoel Fernandes (Google) * This is one implication of the RCU grace-period guarantee, which says (among
11*a591890cSJoel Fernandes (Google) * other things) that an RCU read-side critical section cannot span a grace period.
12*a591890cSJoel Fernandes (Google) *)
13*a591890cSJoel Fernandes (Google)
14*a591890cSJoel Fernandes (Google){
15*a591890cSJoel Fernandes (Google)int x = 0;
16*a591890cSJoel Fernandes (Google)int y = 0;
17*a591890cSJoel Fernandes (Google)}
18*a591890cSJoel Fernandes (Google)
19*a591890cSJoel Fernandes (Google)P0(int *x, int *y)
20*a591890cSJoel Fernandes (Google){
21*a591890cSJoel Fernandes (Google)	rcu_read_lock();
22*a591890cSJoel Fernandes (Google)	WRITE_ONCE(*x, 1);
23*a591890cSJoel Fernandes (Google)	WRITE_ONCE(*y, 1);
24*a591890cSJoel Fernandes (Google)	rcu_read_unlock();
25*a591890cSJoel Fernandes (Google)}
26*a591890cSJoel Fernandes (Google)
27*a591890cSJoel Fernandes (Google)P1(int *x, int *y)
28*a591890cSJoel Fernandes (Google){
29*a591890cSJoel Fernandes (Google)	int r0;
30*a591890cSJoel Fernandes (Google)	int r1;
31*a591890cSJoel Fernandes (Google)
32*a591890cSJoel Fernandes (Google)	r0 = READ_ONCE(*x);
33*a591890cSJoel Fernandes (Google)	synchronize_rcu();
34*a591890cSJoel Fernandes (Google)	r1 = READ_ONCE(*y);
35*a591890cSJoel Fernandes (Google)}
36*a591890cSJoel Fernandes (Google)
37*a591890cSJoel Fernandes (Google)exists (1:r0=1 /\ 1:r1=0)
38