tools/memory-model: Label MP tests' producers and consumers

This commit adds comments that label the MP tests' producer and consumer
processes, and also that label the "exists" clause as the bad outcome.

Reported-by: Johannes Weiner <hannes@cmpxchg.org>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
This commit is contained in:
Paul E. McKenney
2020-11-05 13:39:28 -08:00
parent acc4bdc55d
commit b6ff30849c
8 changed files with 24 additions and 24 deletions
@@ -13,14 +13,14 @@ C MP+fencewmbonceonce+fencermbonceonce
int flag;
}
P0(int *buf, int *flag)
P0(int *buf, int *flag) // Producer
{
WRITE_ONCE(*buf, 1);
smp_wmb();
WRITE_ONCE(*flag, 1);
}
P1(int *buf, int *flag)
P1(int *buf, int *flag) // Consumer
{
int r0;
int r1;
@@ -30,4 +30,4 @@ P1(int *buf, int *flag)
r1 = READ_ONCE(*buf);
}
exists (1:r0=1 /\ 1:r1=0)
exists (1:r0=1 /\ 1:r1=0) (* Bad outcome. *)
@@ -15,13 +15,13 @@ C MP+onceassign+derefonce
int y=0;
}
P0(int *x, int **p)
P0(int *x, int **p) // Producer
{
WRITE_ONCE(*x, 1);
rcu_assign_pointer(*p, x);
}
P1(int *x, int **p)
P1(int *x, int **p) // Consumer
{
int *r0;
int r1;
@@ -32,4 +32,4 @@ P1(int *x, int **p)
rcu_read_unlock();
}
exists (1:r0=x /\ 1:r1=0)
exists (1:r0=x /\ 1:r1=0) (* Bad outcome. *)
@@ -15,7 +15,7 @@ C MP+polockmbonce+poacquiresilsil
int x;
}
P0(spinlock_t *lo, int *x)
P0(spinlock_t *lo, int *x) // Producer
{
spin_lock(lo);
smp_mb__after_spinlock();
@@ -23,7 +23,7 @@ P0(spinlock_t *lo, int *x)
spin_unlock(lo);
}
P1(spinlock_t *lo, int *x)
P1(spinlock_t *lo, int *x) // Consumer
{
int r1;
int r2;
@@ -34,4 +34,4 @@ P1(spinlock_t *lo, int *x)
r3 = spin_is_locked(lo);
}
exists (1:r1=1 /\ 1:r2=0 /\ 1:r3=1)
exists (1:r1=1 /\ 1:r2=0 /\ 1:r3=1) (* Bad outcome. *)
@@ -15,14 +15,14 @@ C MP+polockonce+poacquiresilsil
int x;
}
P0(spinlock_t *lo, int *x)
P0(spinlock_t *lo, int *x) // Producer
{
spin_lock(lo);
WRITE_ONCE(*x, 1);
spin_unlock(lo);
}
P1(spinlock_t *lo, int *x)
P1(spinlock_t *lo, int *x) // Consumer
{
int r1;
int r2;
@@ -33,4 +33,4 @@ P1(spinlock_t *lo, int *x)
r3 = spin_is_locked(lo);
}
exists (1:r1=1 /\ 1:r2=0 /\ 1:r3=1)
exists (1:r1=1 /\ 1:r2=0 /\ 1:r3=1) (* Bad outcome. *)
@@ -17,7 +17,7 @@ C MP+polocks
int flag;
}
P0(int *buf, int *flag, spinlock_t *mylock)
P0(int *buf, int *flag, spinlock_t *mylock) // Producer
{
WRITE_ONCE(*buf, 1);
spin_lock(mylock);
@@ -25,7 +25,7 @@ P0(int *buf, int *flag, spinlock_t *mylock)
spin_unlock(mylock);
}
P1(int *buf, int *flag, spinlock_t *mylock)
P1(int *buf, int *flag, spinlock_t *mylock) // Consumer
{
int r0;
int r1;
@@ -36,4 +36,4 @@ P1(int *buf, int *flag, spinlock_t *mylock)
r1 = READ_ONCE(*buf);
}
exists (1:r0=1 /\ 1:r1=0)
exists (1:r0=1 /\ 1:r1=0) (* Bad outcome. *)
@@ -12,13 +12,13 @@ C MP+poonceonces
int flag;
}
P0(int *buf, int *flag)
P0(int *buf, int *flag) // Producer
{
WRITE_ONCE(*buf, 1);
WRITE_ONCE(*flag, 1);
}
P1(int *buf, int *flag)
P1(int *buf, int *flag) // Consumer
{
int r0;
int r1;
@@ -27,4 +27,4 @@ P1(int *buf, int *flag)
r1 = READ_ONCE(*buf);
}
exists (1:r0=1 /\ 1:r1=0)
exists (1:r0=1 /\ 1:r1=0) (* Bad outcome. *)
@@ -13,13 +13,13 @@ C MP+pooncerelease+poacquireonce
int flag;
}
P0(int *buf, int *flag)
P0(int *buf, int *flag) // Producer
{
WRITE_ONCE(*buf, 1);
smp_store_release(flag, 1);
}
P1(int *buf, int *flag)
P1(int *buf, int *flag) // Consumer
{
int r0;
int r1;
@@ -28,4 +28,4 @@ P1(int *buf, int *flag)
r1 = READ_ONCE(*buf);
}
exists (1:r0=1 /\ 1:r1=0)
exists (1:r0=1 /\ 1:r1=0) (* Bad outcome. *)
@@ -17,7 +17,7 @@ C MP+porevlocks
int flag;
}
P0(int *buf, int *flag, spinlock_t *mylock)
P0(int *buf, int *flag, spinlock_t *mylock) // Consumer
{
int r0;
int r1;
@@ -28,7 +28,7 @@ P0(int *buf, int *flag, spinlock_t *mylock)
spin_unlock(mylock);
}
P1(int *buf, int *flag, spinlock_t *mylock)
P1(int *buf, int *flag, spinlock_t *mylock) // Producer
{
spin_lock(mylock);
WRITE_ONCE(*buf, 1);
@@ -36,4 +36,4 @@ P1(int *buf, int *flag, spinlock_t *mylock)
WRITE_ONCE(*flag, 1);
}
exists (0:r0=1 /\ 0:r1=0)
exists (0:r0=1 /\ 0:r1=0) (* Bad outcome. *)