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;

Reply via email to