* [PATCH 1/1] usblp: do not set TASK_INTERRUPTIBLE before lock
@ 2015-11-02 9:27 Jiri Slaby
2015-11-11 23:28 ` Pete Zaitcev
0 siblings, 1 reply; 2+ messages in thread
From: Jiri Slaby @ 2015-11-02 9:27 UTC (permalink / raw)
To: zaitcev; +Cc: linux-usb, linux-kernel, Jiri Slaby, Greg Kroah-Hartman
It is not permitted to set task state before lock. usblp_wwait sets
the state to TASK_INTERRUPTIBLE and calls mutex_lock_interruptible.
Upon return from that function, the state will be TASK_RUNNING again.
This is clearly a bug and a warning is generated with LOCKDEP too:
WARNING: CPU: 1 PID: 5109 at kernel/sched/core.c:7404 __might_sleep+0x7d/0x90()
do not call blocking ops when !TASK_RUNNING; state=1 set at [<ffffffffa0c588d0>] usblp_wwait+0xa0/0x310 [usblp]
Modules linked in: ...
CPU: 1 PID: 5109 Comm: captmon Tainted: G W 4.2.5-0.gef2823b-default #1
Hardware name: LENOVO 23252SG/23252SG, BIOS G2ET33WW (1.13 ) 07/24/2012
ffffffff81a4edce ffff880236ec7ba8 ffffffff81716651 0000000000000000
ffff880236ec7bf8 ffff880236ec7be8 ffffffff8106e146 0000000000000282
ffffffff81a50119 000000000000028b 0000000000000000 ffff8802dab7c508
Call Trace:
...
[<ffffffff8106e1c6>] warn_slowpath_fmt+0x46/0x50
[<ffffffff8109a8bd>] __might_sleep+0x7d/0x90
[<ffffffff8171b20f>] mutex_lock_interruptible_nested+0x2f/0x4b0
[<ffffffffa0c588fc>] usblp_wwait+0xcc/0x310 [usblp]
[<ffffffffa0c58bb2>] usblp_write+0x72/0x350 [usblp]
[<ffffffff8121ed98>] __vfs_write+0x28/0xf0
...
Commit 7f477358e2384c54b190cc3b6ce28277050a041b (usblp: Implement the
ENOSPC convention) moved the set prior locking. So move it back after
the lock.
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Cc: Pete Zaitcev <zaitcev@redhat.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Fixes: 7f477358e2 ("usblp: Implement the ENOSPC convention")
---
drivers/usb/class/usblp.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/usb/class/usblp.c b/drivers/usb/class/usblp.c
index 433bbc34a8a4..071964c7847f 100644
--- a/drivers/usb/class/usblp.c
+++ b/drivers/usb/class/usblp.c
@@ -884,11 +884,11 @@ static int usblp_wwait(struct usblp *usblp, int nonblock)
add_wait_queue(&usblp->wwait, &waita);
for (;;) {
- set_current_state(TASK_INTERRUPTIBLE);
if (mutex_lock_interruptible(&usblp->mut)) {
rc = -EINTR;
break;
}
+ set_current_state(TASK_INTERRUPTIBLE);
rc = usblp_wtest(usblp, nonblock);
mutex_unlock(&usblp->mut);
if (rc <= 0)
--
2.6.2
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH 1/1] usblp: do not set TASK_INTERRUPTIBLE before lock
2015-11-02 9:27 [PATCH 1/1] usblp: do not set TASK_INTERRUPTIBLE before lock Jiri Slaby
@ 2015-11-11 23:28 ` Pete Zaitcev
0 siblings, 0 replies; 2+ messages in thread
From: Pete Zaitcev @ 2015-11-11 23:28 UTC (permalink / raw)
To: Jiri Slaby; +Cc: linux-usb, linux-kernel, Greg Kroah-Hartman, zaitcev
On Mon, 2 Nov 2015 10:27:00 +0100
Jiri Slaby <jslaby@suse.cz> wrote:
> Signed-off-by: Jiri Slaby <jslaby@suse.cz>
> --- a/drivers/usb/class/usblp.c
> +++ b/drivers/usb/class/usblp.c
> @@ -884,11 +884,11 @@ static int usblp_wwait(struct usblp *usblp, int nonblock)
>
> add_wait_queue(&usblp->wwait, &waita);
> for (;;) {
> - set_current_state(TASK_INTERRUPTIBLE);
> if (mutex_lock_interruptible(&usblp->mut)) {
> rc = -EINTR;
> break;
> }
> + set_current_state(TASK_INTERRUPTIBLE);
> rc = usblp_wtest(usblp, nonblock);
> mutex_unlock(&usblp->mut);
> if (rc <= 0)
I'm fully onboard with this. In the original "big cleanup" 317c67b8f,
I got this right. But then I either missed that mutex_lock_interruptible()
can set the state, or it didn't do it back then (it was in 2007), and
the 7f477358e introduced the existing code.
Acked-By: Pete Zaitcev <zaitcev@yahoo.com>
-- Pete
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2015-11-11 23:28 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-11-02 9:27 [PATCH 1/1] usblp: do not set TASK_INTERRUPTIBLE before lock Jiri Slaby
2015-11-11 23:28 ` Pete Zaitcev
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®