C C-LB+o-sync-o+rl-o-o-rul+o-rl-rul-o+o-sync-o.litmus { } P0(int *a, int *b) { int r1; r1 = READ_ONCE(*a); synchronize_rcu(); WRITE_ONCE(*b, 1); } P1(int *b, int *c) { int r2; rcu_read_lock(); r2 = READ_ONCE(*b); WRITE_ONCE(*c, 1); rcu_read_unlock(); } P2(int *c, int *d) { int r3; r3 = READ_ONCE(*c); rcu_read_lock(); // do_something_else(); rcu_read_unlock(); WRITE_ONCE(*d, 1); } P3(int *d, int *a) { int r4; r4 = READ_ONCE(*d); synchronize_rcu(); WRITE_ONCE(*a, 1); } exists (0:r1=1 /\ 1:r2=1 /\ 2:r3=1 /\ 3:r4=1)