Skip to content

Commit

Permalink
[PATCH] drivers/isdn/hysdn/hysdn_sched.c: sleep after taking spinlock…
Browse files Browse the repository at this point in the history
… fix

spin_lock_irq{save,restore} is incorrectly called here (the function can
sleep after acquring the lock).

done the necessary corrections and removed unwanted cli/sti.

Signed-off-by: Amol Lad <amol@verismonetworks.com>
Signed-off-by: Karsten Keil <kkeil@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
Amol Lad authored and Linus Torvalds committed Nov 3, 2006
1 parent 43530d2 commit 1f604c4
Showing 1 changed file with 4 additions and 15 deletions.
19 changes: 4 additions & 15 deletions drivers/isdn/hysdn/hysdn_sched.c
Original file line number Diff line number Diff line change
Expand Up @@ -155,52 +155,41 @@ hysdn_tx_cfgline(hysdn_card *card, unsigned char *line, unsigned short chan)
if (card->debug_flags & LOG_SCHED_ASYN)
hysdn_addlog(card, "async tx-cfg chan=%d len=%d", chan, strlen(line) + 1);

spin_lock_irqsave(&card->hysdn_lock, flags);
while (card->async_busy) {
sti();

if (card->debug_flags & LOG_SCHED_ASYN)
hysdn_addlog(card, "async tx-cfg delayed");

msleep_interruptible(20); /* Timeout 20ms */
if (!--cnt) {
spin_unlock_irqrestore(&card->hysdn_lock, flags);
if (!--cnt)
return (-ERR_ASYNC_TIME); /* timed out */
}
cli();
} /* wait for buffer to become free */

spin_lock_irqsave(&card->hysdn_lock, flags);
strcpy(card->async_data, line);
card->async_len = strlen(line) + 1;
card->async_channel = chan;
card->async_busy = 1; /* request transfer */

/* now queue the task */
schedule_work(&card->irq_queue);
sti();
spin_unlock_irqrestore(&card->hysdn_lock, flags);

if (card->debug_flags & LOG_SCHED_ASYN)
hysdn_addlog(card, "async tx-cfg data queued");

cnt++; /* short delay */
cli();

while (card->async_busy) {
sti();

if (card->debug_flags & LOG_SCHED_ASYN)
hysdn_addlog(card, "async tx-cfg waiting for tx-ready");

msleep_interruptible(20); /* Timeout 20ms */
if (!--cnt) {
spin_unlock_irqrestore(&card->hysdn_lock, flags);
if (!--cnt)
return (-ERR_ASYNC_TIME); /* timed out */
}
cli();
} /* wait for buffer to become free again */

spin_unlock_irqrestore(&card->hysdn_lock, flags);

if (card->debug_flags & LOG_SCHED_ASYN)
hysdn_addlog(card, "async tx-cfg data send");

Expand Down

0 comments on commit 1f604c4

Please sign in to comment.