[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 21/23] xen/vpl011: buffer out chars when the backend is xen
On Mon, 15 Oct 2018, Julien Grall wrote: > Hi, > > On 05/10/2018 19:47, Stefano Stabellini wrote: > > To avoid mixing the output of different domains on the console, buffer > > the output chars and print line by line. Unless the domain has input > > from the serial, in which case we want to print char by char for a > > smooth user experience. > > > > The size of SBSA_UART_OUT_BUF_SIZE is arbitrary, choose the same size > > as VUART_BUT_SIZE used in vuart.c. > > > > Export a function named console_input_domain() to allow others to know > > which domains has input at a given time. > > > > Signed-off-by: Stefano Stabellini <stefanos@xxxxxxxxxx> > > CC: andrew.cooper3@xxxxxxxxxx > > CC: George.Dunlap@xxxxxxxxxxxxx > > CC: ian.jackson@xxxxxxxxxxxxx > > CC: jbeulich@xxxxxxxx > > CC: konrad.wilk@xxxxxxxxxx > > CC: tim@xxxxxxx > > CC: wei.liu2@xxxxxxxxxx > > --- > > XXX: merge this patch with "xen/arm: Allow vpl011 to be used by DomU" on > > commit > > That's not going to make the series bisectable as it depends on an > intermediate patch for console_input_domain(). A tiny patch reordering will fix this. I'll do. > The new logic looks better to me, few comments below. Good! > > > > Changes in v4: > > - make SBSA_UART_OUT_BUF_SIZE the same size of VUART_BUT_SIZE > > - rearrange the code to be clearer input and != input cases > > - code style > > - add \n when printing the out buffer because is full > > - don't print prefix for input domain > > --- > > xen/arch/arm/vpl011.c | 35 ++++++++++++++++++++++++++++++++--- > > xen/drivers/char/console.c | 7 +++++++ > > xen/include/asm-arm/vpl011.h | 4 ++++ > > xen/include/xen/console.h | 2 ++ > > 4 files changed, 45 insertions(+), 3 deletions(-) > > > > diff --git a/xen/arch/arm/vpl011.c b/xen/arch/arm/vpl011.c > > index 131507e..5e57ada 100644 > > --- a/xen/arch/arm/vpl011.c > > +++ b/xen/arch/arm/vpl011.c > > @@ -28,6 +28,7 @@ > > #include <xen/lib.h> > > #include <xen/mm.h> > > #include <xen/sched.h> > > +#include <xen/console.h> > > #include <public/domctl.h> > > #include <public/io/console.h> > > #include <asm/pl011-uart.h> > > @@ -85,12 +86,40 @@ static void vpl011_write_data_xen(struct domain *d, > > uint8_t data) > > { > > unsigned long flags; > > struct vpl011 *vpl011 = &d->arch.vpl011; > > + struct vpl011_xen_backend *intf = vpl011->backend.xen; > > + struct domain *input = console_input_domain(); > > VPL011_LOCK(d, flags); > > - printk("%c", data); > > - if (data == '\n') > > - printk("DOM%u: ", d->domain_id); > > + intf->out[intf->out_prod++] = data; > > + if ( d == input ) > > + { > > + if ( intf->out_prod == 1 ) > > + { > > + printk("%c", data); > > + intf->out_prod = 0; > > + } > > + else > > + { > > + if ( data != '\n' ) > > + intf->out[intf->out_prod++] = '\n'; > > + intf->out[intf->out_prod++] = '\0'; > > + printk("%s", intf->out); > > + intf->out_prod = 0; > > + } > > + } > > + else > > + { > > + if ( intf->out_prod == SBSA_UART_OUT_BUF_SIZE - 2 || > > + data == '\n' ) > > + { > > + if ( data != '\n' ) > > + intf->out[intf->out_prod++] = '\n'; > > + intf->out[intf->out_prod++] = '\0'; > > + printk("DOM%u: %s", d->domain_id, intf->out); > > + intf->out_prod = 0; > > + } > > + } > > vpl011->uartris |= TXI; > > vpl011->uartfr &= ~TXFE; > > diff --git a/xen/drivers/char/console.c b/xen/drivers/char/console.c > > index 0808bac..9a2b29a 100644 > > --- a/xen/drivers/char/console.c > > +++ b/xen/drivers/char/console.c > > @@ -406,6 +406,13 @@ static void dump_console_ring_key(unsigned char key) > > */ > > static unsigned int __read_mostly console_rx = 0; > > +struct domain *console_input_domain(void) > > +{ > > + if ( console_rx == 0 ) > > + return NULL; > > + return get_domain_by_id(console_rx - 1); > > +} > > + > > static void switch_serial_input(void) > > { > > if ( console_rx++ == max_init_domid + 1 ) > > diff --git a/xen/include/asm-arm/vpl011.h b/xen/include/asm-arm/vpl011.h > > index 5eb6d25..ab6fd79 100644 > > --- a/xen/include/asm-arm/vpl011.h > > +++ b/xen/include/asm-arm/vpl011.h > > @@ -30,9 +30,13 @@ > > #define VPL011_UNLOCK(d,flags) > > spin_unlock_irqrestore(&(d)->arch.vpl011.lock, flags) > > #define SBSA_UART_FIFO_SIZE 32 > > +/* Same size as VUART_BUT_SIZE, used in vuart.c */ > > s/BUT/BUF/ I'll fix > > +#define SBSA_UART_OUT_BUF_SIZE 128 > > You could directly use VUART_BUF_SIZE here to avoid the comment above. That is true, but I think it is nicer to keep the two #define separate > > struct vpl011_xen_backend { > > char in[SBSA_UART_FIFO_SIZE]; > > + char out[SBSA_UART_OUT_BUF_SIZE]; > > XENCONS_RING_IDX in_cons, in_prod; > > + XENCONS_RING_IDX out_prod; > > }; > > struct vpl011 { > > diff --git a/xen/include/xen/console.h b/xen/include/xen/console.h > > index 70c9911..c5a85c8 100644 > > --- a/xen/include/xen/console.h > > +++ b/xen/include/xen/console.h > > @@ -31,6 +31,8 @@ void console_end_sync(void); > > void console_start_log_everything(void); > > void console_end_log_everything(void); > > +struct domain *console_input_domain(void); > > + > > /* > > * Steal output from the console. Returns +ve identifier, else -ve error. > > * Takes the handle of the serial line to steal, and steal callback > > function. > > > > -- > Julien Grall > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |