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

Commit 8da8c86f authored by Ian Abbott's avatar Ian Abbott Committed by Greg Kroah-Hartman
Browse files

staging: comedi: wake up async waiters when become non-busy



Wake up all waiters on the comedi subdevice's async wait queue whenever
the subdevice is marked "non-busy".  This happens when an asynchronous
command is cancelled or when a command is terminated and all data has
been read or written.  Note: use `wake_up_interruptible_all()` as we
only use interruptible waits.

Remove the call to `wake_up_interruptible()` from `do_cancel_ioctl()` as
it will call `wake_up_interruptible_all()` indirectly via `do_cancel()`
and `do_become_nonbusy()`.

Signed-off-by: default avatarIan Abbott <abbotti@mev.co.uk>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 3867e20d
Loading
Loading
Loading
Loading
+3 −3
Original line number Original line Diff line number Diff line
@@ -563,13 +563,14 @@ static void do_become_nonbusy(struct comedi_device *dev,
		async->inttrig = NULL;
		async->inttrig = NULL;
		kfree(async->cmd.chanlist);
		kfree(async->cmd.chanlist);
		async->cmd.chanlist = NULL;
		async->cmd.chanlist = NULL;
		s->busy = NULL;
		wake_up_interruptible_all(&s->async->wait_head);
	} else {
	} else {
		dev_err(dev->class_dev,
		dev_err(dev->class_dev,
			"BUG: (?) do_become_nonbusy called with async=NULL\n");
			"BUG: (?) do_become_nonbusy called with async=NULL\n");
	}

		s->busy = NULL;
		s->busy = NULL;
	}
	}
}


static int do_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
static int do_cancel(struct comedi_device *dev, struct comedi_subdevice *s)
{
{
@@ -1700,7 +1701,6 @@ static int do_cancel_ioctl(struct comedi_device *dev, unsigned int arg,
		return -EBUSY;
		return -EBUSY;


	ret = do_cancel(dev, s);
	ret = do_cancel(dev, s);
	wake_up_interruptible(&s->async->wait_head);


	return ret;
	return ret;
}
}