From a0a416b179cacf2301aa094db7f727993642e5c5 Mon Sep 17 00:00:00 2001 From: Chris Lew Date: Sat, 18 Apr 2020 14:19:07 -0700 Subject: [PATCH] neuron: block_client: Fix init loop Depending on timing there is a chance the channel initialization will happen at different intervals. When this happens, the first channel wakeup will be cleared by the init loop and never be set again by the channel init. This leads to a stall in init because both channels will never have both their wakeups set to signal channel init done. Change-Id: I435e78c3e4b83cf6b827d3827f35d1e6a1b297fa Acked-by: Chris Henroid Signed-off-by: Chris Lew --- net/neuron/protocol/prot_block_client.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/net/neuron/protocol/prot_block_client.c b/net/neuron/protocol/prot_block_client.c index 4a0041140976f..f82d0b92b5de5 100644 --- a/net/neuron/protocol/prot_block_client.c +++ b/net/neuron/protocol/prot_block_client.c @@ -178,8 +178,8 @@ static int protocol_block_client_thread(void *data) skb_req = NULL; /* Wait for the channels to start */ - wakeup_mask = 0; while (!kthread_should_stop()) { + wakeup_mask = 0; if (!channel_dev->max_size || !channel_dev->queue_length) wakeup_mask |= CHANNEL_BIT(C_IN); @@ -192,10 +192,6 @@ static int protocol_block_client_thread(void *data) wait_event_killable(kdata->wait_q, kthread_should_stop() || (kdata->wakeups & wakeup_mask)); - - wakeup_mask &= ~xchg(&kdata->wakeups, 0); - /* flush shared variable to memory */ - smp_mb__after_atomic(); } if (kthread_should_stop()) return 0;