linux-um archives
 help / color / mirror / Atom feed
From: Werner Almesberger <werner@almesberger.net>
To: user-mode-linux-devel@lists.sourceforge.net
Subject: [uml-devel] RFC: lossless printk
Date: Thu, 1 Apr 2004 04:25:12 -0300	[thread overview]
Message-ID: <20040401042512.Y28573@almesberger.net> (raw)

The non-blocking console of UML silenty drops printks if they would
block. This is a tad annoying if you want to record all of them in
a file, e.g. if you're using UML for automated regression tests.

The patch below optionally makes printks pause and retry until they
succeed. Note that printk.c does the serialization for us, so
there's no need to lock again.

Not sure if this should really be a config option, or it it
shouldn't be enabled by default. I've been using this for a while
in a slightly more limited form, and it never seemed to get in the
way such that I'd prefer the original, "lossy" printk.

- Werner

---------------------------------- cut here -----------------------------------

--- linux-2.6.4-orig/arch/um/Kconfig_char	Wed Mar 10 23:55:26 2004
+++ linux-2.6.4/arch/um/Kconfig_char	Wed Mar 31 22:18:21 2004
@@ -5,6 +5,14 @@
 	bool
 	default y
 
+config LOSSLESS_STDIO_CONSOLE
+	bool "Lossless standard output console"
+	depends on STDIO_CONSOLE
+	help
+	When console output goes to standard output, retry write operations
+	that would block. This is particularly useful when recording the
+	output of a UML system in a file.
+
 config SSL
 	bool "Virtual serial line"
 	help
--- linux-2.6.4-orig/arch/um/drivers/Makefile	Tue Mar 16 03:11:43 2004
+++ linux-2.6.4/arch/um/drivers/Makefile	Wed Mar 31 22:17:18 2004
@@ -41,13 +41,14 @@
 obj-$(CONFIG_UML_WATCHDOG) += harddog.o
 obj-$(CONFIG_BLK_DEV_COW) += cow_kern.o
 obj-$(CONFIG_BLK_DEV_COW_COMMON) += cow_user.o
+obj-$(CONFIG_LOSSLESS_STDIO_CONSOLE) += console_user.o
 
 obj-y += stdio_console.o $(CHAN_OBJS)
 
 USER_SINGLE_OBJS = $(foreach f,$(patsubst %.o,%,$(obj-y) $(obj-m)),$($(f)-objs))
 
 USER_OBJS := $(filter %_user.o,$(obj-y) $(obj-m) $(USER_SINGLE_OBJS)) fd.o \
-	null.o pty.o tty.o xterm.o
+	null.o pty.o tty.o xterm.o console_user.o
 USER_OBJS := $(foreach file,$(USER_OBJS),$(obj)/$(file))
 
 $(USER_OBJS) : %.o: %.c
--- linux-2.6.4-orig/arch/um/drivers/stdio_console.c	Tue Mar 16 03:11:43 2004
+++ linux-2.6.4/arch/um/drivers/stdio_console.c	Wed Mar 31 22:16:59 2004
@@ -194,6 +194,11 @@
 static void console_write(struct console *console, const char *string, 
 			  unsigned len)
 {
+#ifdef CONFIG_LOSSLESS_STDIO_CONSOLE
+	void lossless_stdio_console_write(const char *string,unsigned len);
+
+	lossless_stdio_console_write(string,len);
+#else
 	struct line *line = &vts[console->index];
 
 	if(con_init_done)
@@ -201,6 +206,7 @@
 	console_write_chan(&line->chan_list, string, len);
 	if(con_init_done)
 		up(&line->sem);
+#endif
 }
 
 static struct tty_driver *console_device(struct console *c, int *index)
--- /dev/null	Fri Dec 12 23:38:58 2003
+++ linux-2.6.4/arch/um/drivers/console_user.c	Thu Apr  1 04:15:28 2004
@@ -0,0 +1,53 @@
+/*
+ * arch/um/drivers/console_user.c - Lossless console driver using write(2)
+ *
+ * Written 2003,2004 by Werner Almesberger
+ */
+
+
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <errno.h>
+
+
+/*
+ * UML makes the console non-blocking. And indeed, even when stdout is
+ * redirected to a file, we may occasionally get EAGAIN, and lose a message or
+ * ten. This console write function just retries the write, without affecting
+ * other users of the console.
+ */
+
+
+void lossless_stdio_console_write(const char *string,unsigned len)
+{
+	const char *p;
+	int wrote;
+
+	for (p = string; len; p += wrote) {
+		while (1) {
+			int n;
+
+			wrote = write(1,p,len);
+			if (wrote >= 0)
+				break;
+
+			if (errno == EAGAIN) {
+				usleep(100000); /* nap for 100ms */
+				continue;
+			}
+
+			/*
+			 * We're in trouble. Try to get the message out with
+			 * our dying breath, then expire.
+			 */
+			for (n = errno; n; n--)
+				write(2,"#",1);
+
+			/* doesn't really do much, but try to die anyway */
+			abort();
+		}
+		len -= wrote;
+	}
+}

-- 
  _________________________________________________________________________
 / Werner Almesberger, Buenos Aires, Argentina     werner@almesberger.net /
/_http://www.almesberger.net/____________________________________________/


-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click
_______________________________________________
User-mode-linux-devel mailing list
User-mode-linux-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel

             reply	other threads:[~2004-04-01  7:25 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-04-01  7:25 Werner Almesberger [this message]
2004-04-01 10:58 ` [uml-devel] RFC: lossless printk Henrik Nordstrom
2004-04-01 15:36   ` Werner Almesberger
2004-04-01 17:42     ` Henrik Nordstrom
2004-04-01 18:28       ` Werner Almesberger
2004-04-01 20:36         ` Henrik Nordstrom
     [not found] ` <Pine.LNX.4.58.0404010149580.13832@gradall.private.brainfood.com>
2004-04-01 11:30   ` Werner Almesberger
2004-04-01 11:48     ` Henrik Nordstrom
2004-04-02 20:19       ` Werner Almesberger

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20040401042512.Y28573@almesberger.net \
    --to=werner@almesberger.net \
    --cc=user-mode-linux-devel@lists.sourceforge.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox