Skip to content

Commit

Permalink
[PATCH] pcmcia/cs: fix possible missed wakeup
Browse files Browse the repository at this point in the history
- 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>
  • Loading branch information
Daniel Ritz authored and Linus Torvalds committed Sep 9, 2005
1 parent b3743fa commit bf4de6f
Showing 1 changed file with 5 additions and 4 deletions.
9 changes: 5 additions & 4 deletions drivers/pcmcia/cs.c
Original file line number Diff line number Diff line change
Expand Up @@ -654,9 +654,10 @@ static int pccardd(void *__skt)
skt->thread = NULL;
complete_and_exit(&skt->thread_done, 0);
}
complete(&skt->thread_done);

add_wait_queue(&skt->thread_wait, &wait);
complete(&skt->thread_done);

for (;;) {
unsigned long flags;
unsigned int events;
Expand All @@ -682,11 +683,11 @@ static int pccardd(void *__skt)
continue;
}

schedule();
try_to_freeze();

if (!skt->thread)
break;

schedule();
try_to_freeze();
}
remove_wait_queue(&skt->thread_wait, &wait);

Expand Down

0 comments on commit bf4de6f

Please sign in to comment.