Skip to content

Commit

Permalink
[POWERPC] iSeries: don't printk with HV spinlock held
Browse files Browse the repository at this point in the history
Printk was observed to hang during module unload due to a limited
window of characters that may be sent to the hypervisor.  The window
only reexpands when we receive an ack from the HV and the spinlock here
prevents us from ever processing that ack.  This fixes it by dropping
the lock before doing the printk, then looping back to the top to
reacquire the lock.

Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
Signed-off-by: Paul Mackerras <paulus@samba.org>
  • Loading branch information
Stephen Rothwell authored and Paul Mackerras committed Dec 14, 2007
1 parent da8cadb commit 88f0178
Showing 1 changed file with 15 additions and 2 deletions.
17 changes: 15 additions & 2 deletions arch/powerpc/platforms/iseries/lpevents.c
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,7 @@ void process_hvlpevents(void)
{
struct HvLpEvent * event;

restart:
/* If we have recursed, just return */
if (!spin_trylock(&hvlpevent_queue.hq_lock))
return;
Expand All @@ -146,8 +147,20 @@ void process_hvlpevents(void)
if (event->xType < HvLpEvent_Type_NumTypes &&
lpEventHandler[event->xType])
lpEventHandler[event->xType](event);
else
printk(KERN_INFO "Unexpected Lp Event type=%d\n", event->xType );
else {
u8 type = event->xType;

/*
* Don't printk in the spinlock as printk
* may require ack events form the HV to send
* any characters there.
*/
hvlpevent_clear_valid(event);
spin_unlock(&hvlpevent_queue.hq_lock);
printk(KERN_INFO
"Unexpected Lp Event type=%d\n", type);
goto restart;
}

hvlpevent_clear_valid(event);
} else if (hvlpevent_queue.hq_overflow_pending)
Expand Down

0 comments on commit 88f0178

Please sign in to comment.