On Thu, Sep 03, 2015 at 11:47:34AM -0700, Andy Grover wrote:
On 09/03/2015 05:26 AM, Michal Hocko wrote:
On Wed 02-09-15 15:45:10, Andy Grover wrote:
Hi Hans and Greg,
Is this an issue with uio? I swear it didn't used to throw this warning...
Thanks -- Andy
[ 5174.883261] ------------[ cut here ]------------
[ 5174.883617] WARNING: CPU: 0 PID: 1532 at
/home/agrover/git/kernel/kernel/sched/core.c:7389 __might_sleep+0x7d/0x90()
[ 5174.884407] do not call blocking ops when !TASK_RUNNING; state=1 set at
[<ffffffffa02a5821>] uio_read+0x91/0x170 [uio]
The warning says that the driver is calling copy_to_user with
TASK_INTERRUPTIBLE which is wrong in general because this context can
sleep and a schedule would destroy the state. It doesn't matter here
because the code would break out from the loop regardless of the
copy_to_user return value.
I assume that TASK_INTERRUPTIBLE is necessary before the event_count
check to prevent from wake up races. If that is the case then you can
simply do:
diff --git a/drivers/uio/uio.c b/drivers/uio/uio.c
index 3257d4220d01..7d8959e3833b 100644
--- a/drivers/uio/uio.c
+++ b/drivers/uio/uio.c
@@ -524,6 +524,7 @@ static ssize_t uio_read(struct file *filep, char __user *buf,
event_count = atomic_read(&idev->event);
if (event_count != listener->event_count) {
+ __set_current_state(TASK_RUNNING);
if (copy_to_user(buf, &event_count, count))
retval = -EFAULT;
else {
This certainly makes the warning go away. If this looks good to everyone
else can we get this change in?
What changed to require this? Why is this suddenly showing up now?