On Mon, 2018-04-09 at 15:24 +1000, Nicholas Piggin wrote: > Convert to using the standard delay poll/delay form. > > The console code: > > - Did not previously delay or sleep in its busy loop. > > Cc: Benjamin Herrenschmidt <b...@kernel.crashing.org> > Signed-off-by: Nicholas Piggin <npig...@gmail.com>
Does it help with anything ? We don't technically *have* to delay or wait, I thought it would be good to try to hit the console as fast as possible in that case... Ben. > --- > arch/powerpc/platforms/powernv/opal.c | 38 ++++++++++++++++----------- > 1 file changed, 23 insertions(+), 15 deletions(-) > > diff --git a/arch/powerpc/platforms/powernv/opal.c > b/arch/powerpc/platforms/powernv/opal.c > index 87d4c0aa7f64..473c8ce14a34 100644 > --- a/arch/powerpc/platforms/powernv/opal.c > +++ b/arch/powerpc/platforms/powernv/opal.c > @@ -378,33 +378,41 @@ int opal_put_chars(uint32_t vtermno, const char *data, > int total_len) > /* We still try to handle partial completions, though they > * should no longer happen. > */ > - rc = OPAL_BUSY; > - while(total_len > 0 && (rc == OPAL_BUSY || > - rc == OPAL_BUSY_EVENT || rc == OPAL_SUCCESS)) { > + > + while (total_len > 0) { > olen = cpu_to_be64(total_len); > - rc = opal_console_write(vtermno, &olen, data); > + > + rc = OPAL_BUSY; > + while (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT) { > + rc = opal_console_write(vtermno, &olen, data); > + if (rc == OPAL_BUSY_EVENT) { > + mdelay(OPAL_BUSY_DELAY_MS); > + opal_poll_events(NULL); > + } else if (rc == OPAL_BUSY) { > + mdelay(OPAL_BUSY_DELAY_MS); > + } > + } > + > len = be64_to_cpu(olen); > > /* Closed or other error drop */ > - if (rc != OPAL_SUCCESS && rc != OPAL_BUSY && > - rc != OPAL_BUSY_EVENT) { > - written += total_len; > + if (rc != OPAL_SUCCESS) { > + written += total_len; /* drop remaining chars */ > break; > } > - if (rc == OPAL_SUCCESS) { > - total_len -= len; > - data += len; > - written += len; > - } > + > + total_len -= len; > + data += len; > + written += len; > + > /* This is a bit nasty but we need that for the console to > * flush when there aren't any interrupts. We will clean > * things a bit later to limit that to synchronous path > * such as the kernel console and xmon/udbg > */ > - do > + do { > opal_poll_events(&evt); > - while(rc == OPAL_SUCCESS && > - (be64_to_cpu(evt) & OPAL_EVENT_CONSOLE_OUTPUT)); > + } while (be64_to_cpu(evt) & OPAL_EVENT_CONSOLE_OUTPUT); > } > spin_unlock_irqrestore(&opal_write_lock, flags); > return written;