Patch from Fillod Stephane:

  You will find in the attached file "syslog.patch" a patch which adds
  config options to set at compile time the size of the circular buffer,
  and some documentation update.
diff --git a/docs/busybox.sgml b/docs/busybox.sgml
index 1d2e926..ac400c7 100644
--- a/docs/busybox.sgml
+++ b/docs/busybox.sgml
@@ -1976,6 +1976,38 @@
 		</para>
 	</sect1>
 
+	<sect1 id="logread">
+	    <title>logread</title>
+
+		<para>
+		Usage: logread [OPTION]...
+		</para>
+
+		<para>
+		Shows the messages from syslogd (using circular buffer).
+		</para>
+
+		<para>
+		Options:
+		</para>
+
+		<para>
+		<screen>
+			-f	Output data as the log grows.
+		</screen>
+		</para>
+
+		<para>
+		Example:
+		</para>
+
+		<para>
+		<screen>
+			$ logread
+		</screen>
+		</para>
+	</sect1>
+
 	<sect1 id="ls">
 	    <title>ls</title>
 
@@ -3110,7 +3142,7 @@
 			-O FILE	Use an alternate log file (default=/var/log/messages)
 			-R HOST[:PORT] Log remotely to IP or hostname on PORT (default PORT=514/UDP)
 			-L      Log locally as well as network logging (default is network only)
-			-C      Log to a circular buffer. Read this buffer using 'logread'
+			-C [size(KiB)] Log to a circular buffer. Read this buffer using 'logread'
 		</screen>
 		</para>
 
diff --git a/include/usage.h b/include/usage.h
index 6db0385..ea1b5d5 100644
--- a/include/usage.h
+++ b/include/usage.h
@@ -1458,10 +1458,12 @@
 	"root\n" 
 
 #define logread_trivial_usage \
-        ""
+	"[OPTION]..."
 
 #define logread_full_usage \
-        "Shows the messages from syslogd (using circular buffer)."
+        "Shows the messages from syslogd (using circular buffer).\n\n"
+	"Options:\n" \
+	"\t-f\t\toutput data as the log grows"
 
 #define losetup_trivial_usage \
 	"[OPTION]... LOOPDEVICE FILE\n" \
@@ -2280,7 +2282,7 @@
 	"\n\t-R HOST[:PORT]\tLog to IP or hostname on PORT (default PORT=514/UDP)\n" \
 	"\t-L\t\tLog locally and via network logging (default is network only)") \
 	USAGE_IPC_LOG( \
-	"\n\t-C\t\tLog to a circular buffer (read the buffer using logread)")
+	"\n\t-C [size(KiB)]\tLog to a circular buffer (read the buffer using logread)")
 #define syslogd_example_usage \
 	"$ syslogd -R masterlog:514\n" \
 	"$ syslogd -R 192.168.1.1:601\n"
diff --git a/sysklogd/Config.in b/sysklogd/Config.in
index cb2ee08..a671f59 100644
--- a/sysklogd/Config.in
+++ b/sysklogd/Config.in
@@ -56,6 +56,14 @@
 	  entire filesystem, which may cause your system to
 	  break badly.
 
+config CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE
+	int "    Circular buffer size in Kbytes (minimum 4KB)"
+	default 16
+	depends on CONFIG_FEATURE_IPC_SYSLOG
+	help
+	  This option sets the size of the circular buffer
+	  used to record system log messages.
+
 config CONFIG_LOGREAD
 	bool "  logread"
 	default y
@@ -66,6 +74,17 @@
 	  utility will allow you to read the messages that are
 	  stored in the syslogd circular buffer.
 
+config CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING
+	bool "    logread double buffering"
+	default n
+	depends on CONFIG_LOGREAD
+	help
+	  'logread' ouput to slow serial terminals can have 
+	  side effects on syslog because of the semaphore.
+	  This option make logread to double buffer copy 
+	  from circular buffer, minimizing semaphore 
+	  contention at some minor memory expense.
+
 config CONFIG_KLOGD
 	bool "klogd"
 	default n
diff --git a/sysklogd/logread.c b/sysklogd/logread.c
index 524178f..207e78b 100644
--- a/sysklogd/logread.c
+++ b/sysklogd/logread.c
@@ -108,8 +108,7 @@
 	i = follow ? buf->tail : buf->head;
 
 	do {
-#undef RC_LOGREAD
-#ifdef RC_LOGREAD
+#ifdef CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING
 		char *buf_data;
 		int log_len,j;
 #endif
@@ -128,7 +127,7 @@
 		}
 	
 		// Read Memory 
-#ifdef RC_LOGREAD
+#ifdef CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING
 		log_len = buf->tail - i;
 		if (log_len < 0)
 			log_len += buf->size;
@@ -155,7 +154,7 @@
 		// release the lock on the log chain
 		sem_up(log_semid);
 
-#ifdef RC_LOGREAD
+#ifdef CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING
 		for (j=0; j < log_len; j+=strlen(buf_data+j)+1) {
 			printf("%s", buf_data+j);
 			if (follow)
diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c
index 622500e..42426ed 100644
--- a/sysklogd/syslogd.c
+++ b/sysklogd/syslogd.c
@@ -94,6 +94,12 @@
 
 /* circular buffer variables/structures */
 #ifdef CONFIG_FEATURE_IPC_SYSLOG
+
+#if CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE < 4
+#error Sorry, you must set the syslogd buffer size to at least 4KB.
+#error Please check CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE
+#endif
+
 #include <sys/ipc.h>
 #include <sys/sem.h>
 #include <sys/shm.h>
@@ -114,7 +120,7 @@
 
 static int shmid = -1;	// ipc shared memory id
 static int s_semid = -1;	// ipc semaphore id
-static int data_size = 16000;	// default data size
+static int shm_size = ((CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE)*1024);	// default shm size
 static int circular_logging = FALSE;
 
 /*
@@ -156,7 +162,7 @@
 void ipcsyslog_init(void)
 {
 	if (buf == NULL) {
-		if ((shmid = shmget(KEY_ID, data_size, IPC_CREAT | 1023)) == -1) {
+		if ((shmid = shmget(KEY_ID, shm_size, IPC_CREAT | 1023)) == -1) {
 			bb_perror_msg_and_die("shmget");
 		}
 
@@ -164,7 +170,7 @@
 			bb_perror_msg_and_die("shmat");
 		}
 
-		buf->size = data_size - sizeof(*buf);
+		buf->size = shm_size - sizeof(*buf);
 		buf->head = buf->tail = 0;
 
 		// we'll trust the OS to set initial semval to 0 (let's hope)
@@ -654,7 +660,7 @@
 			if (optarg) {
 				int buf_size = atoi(optarg);
 				if (buf_size >= 4) {
-					data_size = buf_size;
+					shm_size = buf_size;
 				}
 			}
 			circular_logging = TRUE;