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