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

Commit c1d2a313 authored by Nicholas Piggin's avatar Nicholas Piggin Committed by Michael Ellerman
Browse files

powerpc/powernv: Fix NVRAM sleep in invalid context when crashing



Similarly to opal_event_shutdown, opal_nvram_write can be called in
the crash path with irqs disabled. Special case the delay to avoid
sleeping in invalid context.

Fixes: 3b807033 ("powerpc/powernv: Fix OPAL NVRAM driver OPAL_BUSY loops")
Cc: stable@vger.kernel.org # v3.2
Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 497a0790
Loading
Loading
Loading
Loading
+12 −2
Original line number Diff line number Diff line
@@ -44,6 +44,10 @@ static ssize_t opal_nvram_read(char *buf, size_t count, loff_t *index)
	return count;
}

/*
 * This can be called in the panic path with interrupts off, so use
 * mdelay in that case.
 */
static ssize_t opal_nvram_write(char *buf, size_t count, loff_t *index)
{
	s64 rc = OPAL_BUSY;
@@ -58,9 +62,15 @@ static ssize_t opal_nvram_write(char *buf, size_t count, loff_t *index)
	while (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT) {
		rc = opal_write_nvram(__pa(buf), count, off);
		if (rc == OPAL_BUSY_EVENT) {
			if (in_interrupt() || irqs_disabled())
				mdelay(OPAL_BUSY_DELAY_MS);
			else
				msleep(OPAL_BUSY_DELAY_MS);
			opal_poll_events(NULL);
		} else if (rc == OPAL_BUSY) {
			if (in_interrupt() || irqs_disabled())
				mdelay(OPAL_BUSY_DELAY_MS);
			else
				msleep(OPAL_BUSY_DELAY_MS);
		}
	}