diff options
| author | Peter Zijlstra <peterz@infradead.org> | 2018-12-17 12:14:53 +0300 | 
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2019-01-21 13:15:37 +0300 | 
| commit | 4c4e3731564c8945ac5ac90fc2a1e1f21cb79c92 (patch) | |
| tree | 525ab413da993f5805ba6b2853ed8d85effcd8d4 /scripts/gdb/linux/modules.py | |
| parent | e6018c0f5c996e61639adce6a0697391a2861916 (diff) | |
| download | linux-4c4e3731564c8945ac5ac90fc2a1e1f21cb79c92.tar.xz | |
sched/wake_q: Fix wakeup ordering for wake_q
Notable cmpxchg() does not provide ordering when it fails, however
wake_q_add() requires ordering in this specific case too. Without this
it would be possible for the concurrent wakeup to not observe our
prior state.
Andrea Parri provided:
  C wake_up_q-wake_q_add
  {
	int next = 0;
	int y = 0;
  }
  P0(int *next, int *y)
  {
	int r0;
	/* in wake_up_q() */
	WRITE_ONCE(*next, 1);   /* node->next = NULL */
	smp_mb();               /* implied by wake_up_process() */
	r0 = READ_ONCE(*y);
  }
  P1(int *next, int *y)
  {
	int r1;
	/* in wake_q_add() */
	WRITE_ONCE(*y, 1);      /* wake_cond = true */
	smp_mb__before_atomic();
	r1 = cmpxchg_relaxed(next, 1, 2);
  }
  exists (0:r0=0 /\ 1:r1=0)
  This "exists" clause cannot be satisfied according to the LKMM:
  Test wake_up_q-wake_q_add Allowed
  States 3
  0:r0=0; 1:r1=1;
  0:r0=1; 1:r1=0;
  0:r0=1; 1:r1=1;
  No
  Witnesses
  Positive: 0 Negative: 3
  Condition exists (0:r0=0 /\ 1:r1=0)
  Observation wake_up_q-wake_q_add Never 0 3
Reported-by: Yongji Xie <elohimes@gmail.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Davidlohr Bueso <dave@stgolabs.net>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Waiman Long <longman@redhat.com>
Cc: Will Deacon <will.deacon@arm.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'scripts/gdb/linux/modules.py')
0 files changed, 0 insertions, 0 deletions
