xref: /linux/Documentation/litmus-tests/locking/DCL-broken.litmus (revision 24168c5e6dfbdd5b414f048f47f75d64533296ca)
1C DCL-broken
2
3(*
4 * Result: Sometimes
5 *
6 * This litmus test demonstrates more than just locking is required to
7 * correctly implement double-checked locking.
8 *)
9
10{
11	int flag;
12	int data;
13}
14
15P0(int *flag, int *data, spinlock_t *lck)
16{
17	int r0;
18	int r1;
19	int r2;
20
21	r0 = READ_ONCE(*flag);
22	if (r0 == 0) {
23		spin_lock(lck);
24		r1 = READ_ONCE(*flag);
25		if (r1 == 0) {
26			WRITE_ONCE(*data, 1);
27			WRITE_ONCE(*flag, 1);
28		}
29		spin_unlock(lck);
30	}
31	r2 = READ_ONCE(*data);
32}
33
34P1(int *flag, int *data, spinlock_t *lck)
35{
36	int r0;
37	int r1;
38	int r2;
39
40	r0 = READ_ONCE(*flag);
41	if (r0 == 0) {
42		spin_lock(lck);
43		r1 = READ_ONCE(*flag);
44		if (r1 == 0) {
45			WRITE_ONCE(*data, 1);
46			WRITE_ONCE(*flag, 1);
47		}
48		spin_unlock(lck);
49	}
50	r2 = READ_ONCE(*data);
51}
52
53locations [flag;data;0:r0;0:r1;1:r0;1:r1]
54exists (0:r2=0 \/ 1:r2=0)
55