162306a36Sopenharmony_ciC RCU+sync+free
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci(*
462306a36Sopenharmony_ci * Result: Never
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * This litmus test demonstrates that an RCU reader can never see a write that
762306a36Sopenharmony_ci * follows a grace period, if it did not see writes that precede that grace
862306a36Sopenharmony_ci * period.
962306a36Sopenharmony_ci *
1062306a36Sopenharmony_ci * This is a typical pattern of RCU usage, where the write before the grace
1162306a36Sopenharmony_ci * period assigns a pointer, and the writes following the grace period destroy
1262306a36Sopenharmony_ci * the object that the pointer used to point to.
1362306a36Sopenharmony_ci *
1462306a36Sopenharmony_ci * This is one implication of the RCU grace-period guarantee, which says (among
1562306a36Sopenharmony_ci * other things) that an RCU read-side critical section cannot span a grace period.
1662306a36Sopenharmony_ci *)
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci{
1962306a36Sopenharmony_ciint x = 1;
2062306a36Sopenharmony_ciint *y = &x;
2162306a36Sopenharmony_ciint z = 1;
2262306a36Sopenharmony_ci}
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ciP0(int *x, int *z, int **y)
2562306a36Sopenharmony_ci{
2662306a36Sopenharmony_ci	int *r0;
2762306a36Sopenharmony_ci	int r1;
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci	rcu_read_lock();
3062306a36Sopenharmony_ci	r0 = rcu_dereference(*y);
3162306a36Sopenharmony_ci	r1 = READ_ONCE(*r0);
3262306a36Sopenharmony_ci	rcu_read_unlock();
3362306a36Sopenharmony_ci}
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ciP1(int *x, int *z, int **y)
3662306a36Sopenharmony_ci{
3762306a36Sopenharmony_ci	rcu_assign_pointer(*y, z);
3862306a36Sopenharmony_ci	synchronize_rcu();
3962306a36Sopenharmony_ci	WRITE_ONCE(*x, 0);
4062306a36Sopenharmony_ci}
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ciexists (0:r0=x /\ 0:r1=0)
43