WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [RFC][patch] console_flush()

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] [RFC][patch] console_flush()
From: Jimi Xenidis <jimix@xxxxxxxxxxxxxx>
Date: Fri, 31 Mar 2006 14:24:04 -0500
Delivery-date: Fri, 31 Mar 2006 19:25:20 +0000
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
It occurs to me that since console_sync_start/stop use ++ and -- respectively, that it was designed to be "nested" and bracket code segments. If this is indeed desirable than perhaps we need another interface that simply flushed the console. The only real use I can see for it is to flush after the panic message rather than using console_sync_start() before it.

Patch below.
thoughts?
-JX

Signed-off-by: Jimi Xenidis <jimix@xxxxxxxxxxxxxx>
---
diff -r d76a7a40f3a9 xen/drivers/char/console.c
--- a/xen/drivers/char/console.c        Fri Mar 31 17:44:26 2006 +0100
+++ b/xen/drivers/char/console.c        Fri Mar 31 13:12:16 2006 -0500
@@ -526,6 +526,11 @@ void console_force_lock(void)
     spin_lock(&console_lock);
}
+void console_flush(void)
+{
+    serial_flush(sercon_handle);
+}
+
void console_start_sync(void)
{
     serial_start_sync(sercon_handle);
@@ -684,7 +689,6 @@ void panic(const char *fmt, ...)
     va_end(args);
     /* Spit out multiline message in one go. */
-    console_start_sync();
     spin_lock_irqsave(&lock, flags);
     printk("\n****************************************\n");
     printk("Panic on CPU %d:\n", smp_processor_id());
@@ -692,6 +696,7 @@ void panic(const char *fmt, ...)
     printk("****************************************\n\n");
     printk("Reboot in five seconds...\n");
     spin_unlock_irqrestore(&lock, flags);
+    console_flush();
     debugger_trap_immediate();
diff -r d76a7a40f3a9 xen/drivers/char/serial.c
--- a/xen/drivers/char/serial.c Fri Mar 31 17:44:26 2006 +0100
+++ b/xen/drivers/char/serial.c Fri Mar 31 13:12:16 2006 -0500
@@ -301,6 +301,30 @@ void serial_force_unlock(int handle)
     serial_start_sync(handle);
}
+static void serial_flush_locked(struct serial_port *port)
+{
+    while ( (port->txbufp - port->txbufc) != 0 )
+    {
+        while ( !port->driver->tx_empty(port) )
+            cpu_relax();
+        port->driver->putc(
+            port, port->txbuf[MASK_SERIAL_TXBUF_IDX(port->txbufc++)]);
+    }
+}
+
+void serial_flush(int handle)
+{
+    struct serial_port *port = &com[handle & SERHND_IDX];
+    unsigned long flags;
+
+    if ( handle == -1 )
+        return;
+
+    spin_lock_irqsave(&port->tx_lock, flags);
+    serial_flush_locked(port);
+    spin_unlock_irqrestore(&port->tx_lock, flags);
+};
+
void serial_start_sync(int handle)
{
     struct serial_port *port = &com[handle & SERHND_IDX];
@@ -311,16 +335,8 @@ void serial_start_sync(int handle)

     spin_lock_irqsave(&port->tx_lock, flags);
-    if ( port->sync++ == 0 )
-    {
-        while ( (port->txbufp - port->txbufc) != 0 )
-        {
-            while ( !port->driver->tx_empty(port) )
-                cpu_relax();
-            port->driver->putc(
- port, port->txbuf[MASK_SERIAL_TXBUF_IDX(port->txbufc+ +)]);
-        }
-    }
+    port->sync++;
+    serial_flush_locked(port);
     spin_unlock_irqrestore(&port->tx_lock, flags);
}
diff -r d76a7a40f3a9 xen/include/xen/console.h
--- a/xen/include/xen/console.h Fri Mar 31 17:44:26 2006 +0100
+++ b/xen/include/xen/console.h Fri Mar 31 13:12:16 2006 -0500
@@ -22,6 +22,7 @@ void console_force_unlock(void);
void console_force_unlock(void);
void console_force_lock(void);
+void console_flush(void);
void console_start_sync(void);
void console_end_sync(void);
diff -r d76a7a40f3a9 xen/include/xen/serial.h
--- a/xen/include/xen/serial.h  Fri Mar 31 17:44:26 2006 +0100
+++ b/xen/include/xen/serial.h  Fri Mar 31 13:12:16 2006 -0500
@@ -93,6 +93,7 @@ void serial_force_unlock(int handle);
void serial_force_unlock(int handle);
/* Start/end a synchronous region (temporarily disable interrupt- driven tx). */
+void serial_flush(int handle);
void serial_start_sync(int handle);
void serial_end_sync(int handle);


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-devel] [RFC][patch] console_flush(), Jimi Xenidis <=