[PATCH] pcmcia/cs: fix possible missed wakeup
- thread_done should only be completed when the wait_queue is installed. - all wake up conditions should be checked before schedule() this fixes a hang of rmmod in the sequence modprobe yenta_socket; rmmod yenta_socket as reported by Andreas Steinmetz. w/o this rmmod yenta_socket can hang on wait_for_completion() in pcmcia_unregister_socket() Signed-off-by: Daniel Ritz <daniel.ritz@gmx.ch> Cc: Dominik Brodowski <linux@brodo.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
b3743fa444
commit
bf4de6f2db
@@ -654,9 +654,10 @@ static int pccardd(void *__skt)
|
|||||||
skt->thread = NULL;
|
skt->thread = NULL;
|
||||||
complete_and_exit(&skt->thread_done, 0);
|
complete_and_exit(&skt->thread_done, 0);
|
||||||
}
|
}
|
||||||
complete(&skt->thread_done);
|
|
||||||
|
|
||||||
add_wait_queue(&skt->thread_wait, &wait);
|
add_wait_queue(&skt->thread_wait, &wait);
|
||||||
|
complete(&skt->thread_done);
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
unsigned int events;
|
unsigned int events;
|
||||||
@@ -682,11 +683,11 @@ static int pccardd(void *__skt)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
schedule();
|
|
||||||
try_to_freeze();
|
|
||||||
|
|
||||||
if (!skt->thread)
|
if (!skt->thread)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
schedule();
|
||||||
|
try_to_freeze();
|
||||||
}
|
}
|
||||||
remove_wait_queue(&skt->thread_wait, &wait);
|
remove_wait_queue(&skt->thread_wait, &wait);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user