-
Notifications
You must be signed in to change notification settings - Fork 29
Open
Description
GenMC 0.7 detects a race in the following code with LKMM. I am unsure whether that is a real race or something else:
#include <lkmm.h>
int spin, lock;
T0( ) {
spin = 0;
smp_wmb();
WRITE_ONCE(lock, 1);
}
T1( ) {
if (READ_ONCE(lock) != 0) {
smp_mb();
spin = 1;
}
}GenMC detects a race between both updates of spin (line number wont match, sorry):
$ genmc -lkmm test.c
WARNING: LKMM support is still at an experimental stage!
Error detected: Non-Atomic race!
Event (1, 3) conflicts with event (0, 2) in graph:
<-1, 0> main:
(0, 0): B
(0, 1): TC [forks 1] L.39
(0, 2): Wna (spin, 0) L.9
(0, 3): Fwmb L.11
(0, 4): Wrlx (lock, 1) L.12
(0, 5): TJ L.41
<0, 1> run1:
(1, 0): B
(1, 1): Rrlx (lock, 1) [(0, 4)] L.25
(1, 2): Fmb L.26
(1, 3): Wna (spin, 1) L.27
Number of complete executions explored: 0
Number of blocked executions seen: 1
Total wall-clock time: 0.01s
The issue can be fixed if T0 writes to lock with smp_store_release or if we use smp_mb() instead of smp_wmb(), but I thought the smp_wmb() should guarantee the order of both writes.
Here is a gist with the complete code and a few other variants.
PS: The data race is also detected in GenMC 0.6.1.
Metadata
Metadata
Assignees
Labels
No labels