Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d9f88705 authored by David Woodhouse's avatar David Woodhouse Committed by David S. Miller
Browse files

libertas: don't exit worker thread until kthread_stop() is called



The kthread code can't cope with a thread exiting of its own accord and
then someone calling kthread_stop() for it. When the thread detects that
it needs to die, make it wait for kthread_stop() to be called.

Signed-off-by: default avatarDavid Woodhouse <dwmw2@infradead.org>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 4ad36d78
Loading
Loading
Loading
Loading
+9 −4
Original line number Diff line number Diff line
@@ -662,8 +662,10 @@ static int lbs_thread(void *data)
		set_current_state(TASK_INTERRUPTIBLE);
		spin_lock_irq(&priv->driver_lock);

		if (priv->surpriseremoved)
		if (kthread_should_stop())
			shouldsleep = 0;	/* Bye */
		else if (priv->surpriseremoved)
			shouldsleep = 1;	/* We need to wait until we're _told_ to die */
		else if (priv->psstate == PS_STATE_SLEEP)
			shouldsleep = 1;	/* Sleep mode. Nothing we can do till it wakes */
		else if (priv->intcounter)
@@ -699,12 +701,15 @@ static int lbs_thread(void *data)
		lbs_deb_thread("main-thread 333: intcounter=%d currenttxskb=%p dnld_sent=%d\n",
			       priv->intcounter, priv->currenttxskb, priv->dnld_sent);

		if (kthread_should_stop() || priv->surpriseremoved) {
			lbs_deb_thread("main-thread: break from main thread: surpriseremoved=0x%x\n",
				       priv->surpriseremoved);
		if (kthread_should_stop()) {
			lbs_deb_thread("main-thread: break from main thread\n");
			break;
		}

		if (priv->surpriseremoved) {
			lbs_deb_thread("adapter removed; waiting to die...\n");
			continue;
		}

		spin_lock_irq(&priv->driver_lock);