Thread (30 messages) 30 messages, 8 authors, 2021-06-18

Re: [PATCH 1/6] sched: Unbreak wakeups

From: Will Deacon <will@kernel.org>
Date: 2021-06-02 14:48:15
Also in: cgroups, dm-devel, kvm, linux-block, linux-fsdevel, linux-mm, linux-pm, linux-usb, lkml, netdev, rcu

On Wed, Jun 02, 2021 at 03:12:26PM +0200, Peter Zijlstra wrote:
Remove broken task->state references and let wake_up_process() DTRT.

The anti-pattern in these patches breaks the ordering of ->state vs
COND as described in the comment near set_current_state() and can lead
to missed wakeups:

	(OoO load, observes RUNNING)<-.
	for (;;) {                    |
	  t->state = UNINTERRUPTIBLE; |
	  smp_mb();          ,-----> ,' (OoO load, observed !COND)
                             |       |
	                     |       |	COND = 1;
			     |	     `- if (t->state != RUNNING)
                             |		  wake_up_process(t); // not done
	  if (COND) ---------'
	    break;
	  schedule(); // forever waiting
	}
	t->state = TASK_RUNNING;

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 drivers/net/ethernet/qualcomm/qca_spi.c |    6 ++----
 drivers/usb/gadget/udc/max3420_udc.c    |   15 +++++----------
 drivers/usb/host/max3421-hcd.c          |    3 +--
 kernel/softirq.c                        |    2 +-
 4 files changed, 9 insertions(+), 17 deletions(-)
Acked-by: Will Deacon <will@kernel.org>

I couldn't spot any others.

Will
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help