[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] Bring back console_start_log_everything() as a milder alternative to
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1213362900 -3600 # Node ID d4dcd4d399524db60c52963cda5acc73305f8b42 # Parent a41d14c3bf190a5a3523b15fdc417a043b00a844 Bring back console_start_log_everything() as a milder alternative to console_start_sync(). Revert keyhandler logic to use it. The difference now is that serial logic is updated to not drop characters if inb a log_everything region. Still this is milder than a sync region since the async buffer must be filled before we start to busy-wait on each character. Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx> --- xen/common/keyhandler.c | 13 ++++++--- xen/drivers/char/console.c | 12 ++++++++ xen/drivers/char/serial.c | 61 +++++++++++++++++++++++++++++++++++---------- xen/include/xen/console.h | 3 ++ xen/include/xen/serial.h | 5 +++ 5 files changed, 77 insertions(+), 17 deletions(-) diff -r a41d14c3bf19 -r d4dcd4d39952 xen/common/keyhandler.c --- a/xen/common/keyhandler.c Fri Jun 13 13:55:50 2008 +0100 +++ b/xen/common/keyhandler.c Fri Jun 13 14:15:00 2008 +0100 @@ -36,10 +36,10 @@ static void keypress_action(unsigned lon { keyhandler_t *h; unsigned char key = keypress_key; - console_start_sync(); + console_start_log_everything(); if ( (h = key_table[key].u.handler) != NULL ) (*h)(key); - console_end_sync(); + console_end_log_everything(); } static DECLARE_TASKLET(keypress_tasklet, keypress_action, 0); @@ -50,10 +50,10 @@ void handle_keypress(unsigned char key, if ( !in_irq() || (key_table[key].flags & KEYHANDLER_IRQ_CALLBACK) ) { - console_start_sync(); + console_start_log_everything(); if ( (h = key_table[key].u.irq_handler) != NULL ) (*h)(key, regs); - console_end_sync(); + console_end_log_everything(); } else { @@ -105,6 +105,9 @@ static void dump_registers(unsigned char { unsigned int cpu; + /* We want to get everything out that we possibly can. */ + console_start_sync(); + printk("'%c' pressed -> dumping registers\n", key); /* Get local execution state out immediately, in case we get stuck. */ @@ -120,6 +123,8 @@ static void dump_registers(unsigned char } printk("\n"); + + console_end_sync(); } static void dump_dom0_registers(unsigned char key) diff -r a41d14c3bf19 -r d4dcd4d39952 xen/drivers/char/console.c --- a/xen/drivers/char/console.c Fri Jun 13 13:55:50 2008 +0100 +++ b/xen/drivers/char/console.c Fri Jun 13 14:15:00 2008 +0100 @@ -635,6 +635,18 @@ int console_has(const char *device) return 0; } +void console_start_log_everything(void) +{ + serial_start_log_everything(sercon_handle); + atomic_inc(&print_everything); +} + +void console_end_log_everything(void) +{ + serial_end_log_everything(sercon_handle); + atomic_dec(&print_everything); +} + void console_force_unlock(void) { spin_lock_init(&console_lock); diff -r a41d14c3bf19 -r d4dcd4d39952 xen/drivers/char/serial.c --- a/xen/drivers/char/serial.c Fri Jun 13 13:55:50 2008 +0100 +++ b/xen/drivers/char/serial.c Fri Jun 13 14:15:00 2008 +0100 @@ -108,19 +108,23 @@ static void __serial_putc(struct serial_ if ( (port->txbufp - port->txbufc) == serial_txbufsz ) { -#ifdef SERIAL_NEVER_DROP_CHARS - /* Buffer is full: we spin waiting for space to appear. */ - int i; - while ( !port->driver->tx_empty(port) ) - cpu_relax(); - for ( i = 0; i < port->tx_fifo_size; i++ ) - port->driver->putc( - port, port->txbuf[mask_serial_txbuf_idx(port->txbufc++)]); - port->txbuf[mask_serial_txbuf_idx(port->txbufp++)] = c; -#else - /* Buffer is full: drop characters until buffer is half empty. */ - port->tx_quench = 1; -#endif + if ( port->tx_log_everything ) + { + /* Buffer is full: we spin waiting for space to appear. */ + int i; + while ( !port->driver->tx_empty(port) ) + cpu_relax(); + for ( i = 0; i < port->tx_fifo_size; i++ ) + port->driver->putc( + port, + port->txbuf[mask_serial_txbuf_idx(port->txbufc++)]); + port->txbuf[mask_serial_txbuf_idx(port->txbufp++)] = c; + } + else + { + /* Buffer is full: drop chars until buffer is half empty. */ + port->tx_quench = 1; + } return; } @@ -388,6 +392,37 @@ void serial_end_sync(int handle) spin_unlock_irqrestore(&port->tx_lock, flags); } +void serial_start_log_everything(int handle) +{ + struct serial_port *port; + unsigned long flags; + + if ( handle == -1 ) + return; + + port = &com[handle & SERHND_IDX]; + + spin_lock_irqsave(&port->tx_lock, flags); + port->tx_log_everything++; + port->tx_quench = 0; + spin_unlock_irqrestore(&port->tx_lock, flags); +} + +void serial_end_log_everything(int handle) +{ + struct serial_port *port; + unsigned long flags; + + if ( handle == -1 ) + return; + + port = &com[handle & SERHND_IDX]; + + spin_lock_irqsave(&port->tx_lock, flags); + port->tx_log_everything--; + spin_unlock_irqrestore(&port->tx_lock, flags); +} + int serial_tx_space(int handle) { struct serial_port *port; diff -r a41d14c3bf19 -r d4dcd4d39952 xen/include/xen/console.h --- a/xen/include/xen/console.h Fri Jun 13 13:55:50 2008 +0100 +++ b/xen/include/xen/console.h Fri Jun 13 14:15:00 2008 +0100 @@ -26,6 +26,9 @@ void console_start_sync(void); void console_start_sync(void); void console_end_sync(void); +void console_start_log_everything(void); +void console_end_log_everything(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. diff -r a41d14c3bf19 -r d4dcd4d39952 xen/include/xen/serial.h --- a/xen/include/xen/serial.h Fri Jun 13 13:55:50 2008 +0100 +++ b/xen/include/xen/serial.h Fri Jun 13 14:15:00 2008 +0100 @@ -33,6 +33,7 @@ struct serial_port { char *txbuf; unsigned int txbufp, txbufc; bool_t tx_quench; + int tx_log_everything; /* Force synchronous transmit. */ int sync; /* Receiver callback functions (asynchronous receivers). */ @@ -97,6 +98,10 @@ void serial_start_sync(int handle); void serial_start_sync(int handle); void serial_end_sync(int handle); +/* Start/end a region where we will wait rather than drop characters. */ +void serial_start_log_everything(int handle); +void serial_end_log_everything(int handle); + /* Return number of bytes headroom in transmit buffer. */ int serial_tx_space(int handle); _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |