[Skiboot] [PATCH] Add OPAL_CONSOLE_FLUSH to the OPAL API

Russell Currey ruscur at russell.cc
Mon Nov 30 13:13:39 AEDT 2015


On Fri, 2015-11-27 at 18:16 +1100, Stewart Smith wrote:
> Russell Currey <ruscur at russell.cc> writes:
> > uart consoles only flush output when polled.  The Linux kernel calls these
> > pollers frequently, except when in a panic state.  As such, panic messages
> > are not fully printed unless the system is configured to reboot after
> > panic.
> > 
> > This patch adds a new call to the OPAL API to completely flush the buffer.
> > If the system has a uart console (i.e. BMC machines), it will fully flush
> > the buffer.  If not, this function will have no effect.  This will allow
> > the Linux kernel to ensure the panic message has been fully printed out.
> > 
> > Signed-off-by: Russell Currey <ruscur at russell.cc>
> > ---
> > A patch to the Linux kernel to call this function while panicking will be
> > sent upstream shortly.  If this function is not defined (i.e. an older
> > Skiboot version), it will just call opal_poll_events a bunch of times.
> > ---
> >  core/console.c                               |  1 +
> >  doc/opal-api/opal-console-read-write-1-2.txt | 16 +++++++++++++++-
> >  include/opal-api.h                           |  3 ++-
> >  3 files changed, 18 insertions(+), 2 deletions(-)
> > 
> > diff --git a/core/console.c b/core/console.c
> > index 1cee5da..9295d6c 100644
> > --- a/core/console.c
> > +++ b/core/console.c
> > @@ -295,6 +295,7 @@ void flush_console_driver(void)
> >  	if (con_driver && con_driver->flush != NULL)
> >  		con_driver->flush();
> >  }
> > +opal_call(OPAL_CONSOLE_FLUSH, flush_console_driver, 0);
> 
> Current semantics of flush_console_driver are to block if needed while
> things are flushed out. This is why we have async console flushing, so
> that boot with a billion printfs going on doesn't take a huge amount of
> time, and instead we only flush when we're about to shutdown or reboot.
> 
> Except that OPAL_CONSOLE_WRITE *does* flush the uart out.. so I think
> this patch is okay....
> 
> Although I think we want to commit to the API being "if OPAL_BUSY is
> returned, call again as the whole buffer is *not* yet flushed". As I
> think that would leave us open to be being able to hook into the kernel
> tty layer flush()ing mechanism in the future?
> 
Is there a reason why any tty layer flushing mechanism couldn't hook into
opal_poll_events?  I suppose it's not purpose-built for flushing, but I 
don't fully understand how much else the pollers do.

I'll change it to be more asynchronous, anyway.
> >  void set_console(struct con_ops *driver)
> >  {
> > diff --git a/doc/opal-api/opal-console-read-write-1-2.txt b/doc/opal-
> > api/opal-console-read-write-1-2.txt
> > index b8fbc12..97d0632 100644
> > --- a/doc/opal-api/opal-console-read-write-1-2.txt
> > +++ b/doc/opal-api/opal-console-read-write-1-2.txt
> > @@ -1,11 +1,12 @@
> >  OPAL Console calls
> >  ------------------
> >  
> > -There are three OPAL calls relating to the OPAL console:
> > +There are four OPAL calls relating to the OPAL console:
> >  
> >  #define OPAL_CONSOLE_WRITE			1
> >  #define OPAL_CONSOLE_READ			2
> >  #define OPAL_CONSOLE_WRITE_BUFFER_SPACE		25
> > +#define OPAL_CONSOLE_FLUSH			117
> >  
> >  The OPAL console calls can support multiple consoles. Each console MUST
> >  be represented in the device tree.
> > @@ -64,3 +65,16 @@ Returns:
> >  	OPAL_CLOSED
> >  
> >  Use OPAL_POLL_EVENTS for how to determine
> > +
> > +OPAL_CONSOLE_FLUSH
> > +------------------
> > +
> > +Parameters:
> > +	none
> 
> Should same paramter as OPAL_CONSOLE_READ/WRITE, which accepts a
> term_number parameter. We may want a simple way to say "just the one
> that's actually the OPAL console dammit" - maybe ~0 as term_number?
> 
> > +
> > +Returns:
> > +	none
> 
> Should return OPAL_SUCCESS and as mentioned above OPAL_BUSY if buffer
> not completely flushed (actually... come to think of it, maybe
> OPAL_PARTIAL is what we want there).
> 
> Even though OPAL_CONSOLE_WRITE is currently synchronous and all that,
> let's not limit what we specify the API to be.
> 
Okay, so how about:

 - OPAL_PARAMETER if the term_number is invalid
 - OPAL_UNSUPPORTED if the console type doesn't support implement flush()
 - OPAL_BUSY if there's still more to flush
 - OPAL_SUCCESS if the buffer is now fully flushed

Cheers.


More information about the Skiboot mailing list