Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 88f0178e authored by Stephen Rothwell's avatar Stephen Rothwell Committed by Paul Mackerras
Browse files

[POWERPC] iSeries: don't printk with HV spinlock held



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: default avatarStephen Rothwell <sfr@canb.auug.org.au>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent da8cadb3
Loading
Loading
Loading
Loading
+15 −2
Original line number Diff line number Diff line
@@ -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;
@@ -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)