[evlog-dev] [PATCH] save most recent event when the buffer overflows
"Zhu, Yi" <[email protected]> Tue, 29 Apr 2003 16:51:46 +0800 (CST)
| Newsgroups | gmane.linux.kernel.event-logging |
|---|---|
| Message-ID | <[email protected]> |
Hi,
I implemented the "saving most recent event when the buffer overflows" feature
(TODO list 16) for kernel 2.4.20 in below patch. Currently it is enabled by
selecting CONFIG_EVLOG_SAVE_RECENT when make menuconfig. I am also glad to know
if there is any requirement to export it as a proc interface to configure it at
run time.
diff -Nura evlog/kernel/v2.4.20/arch/i386/config.in evlog-saverecent/kernel/v2.4.20/arch/i386/config.in
--- evlog/kernel/v2.4.20/arch/i386/config.in 2003-04-14 10:56:21.000000000 +0800
+++ evlog-saverecent/kernel/v2.4.20/arch/i386/config.in 2003-04-25 19:00:11.000000000 +0800
@@ -237,6 +237,7 @@
if [ "$CONFIG_EVLOG" != "n" ]; then
int 'Eventlog buffer size (in K bytes)' CONFIG_EVLOG_BUFSIZE 128
bool 'Forward printk messages to enterprise event log' CONFIG_EVLOG_FWPRINTK
+ bool 'Select kernel event buffer to save most recent event when the buffer overflows' CONFIG_EVLOG_SAVE_RECENT
fi
# Visual Workstation support is utterly broken.
diff -Nura evlog/kernel/v2.4.20/Documentation/Configure.help evlog-saverecent/kernel/v2.4.20/Documentation/Configure.help
--- evlog/kernel/v2.4.20/Documentation/Configure.help 2003-04-14 10:56:21.000000000 +0800
+++ evlog-saverecent/kernel/v2.4.20/Documentation/Configure.help 2003-04-25 19:07:29.000000000 +0800
@@ -128,6 +128,14 @@
If you don't know what to do here, say N.
+Select kernel event buffer to save most recent event when the buffer overflows
+CONFIG_EVLOG_SAVE_RECENT
+ This option configures kernel event buffer to save the most recent event
+ when the buffer overflows. However this requires more processing time in
+ the kernel. By default, event logging will keep the oldest event.
+
+ If you don't know what to do here, say N.
+
Symmetric Multi-Processing support
CONFIG_SMP
This enables support for systems with more than one CPU. If you have
diff -Nura evlog/kernel/v2.4.20/kernel/evl_buf.c evlog-saverecent/kernel/v2.4.20/kernel/evl_buf.c
--- evlog/kernel/v2.4.20/kernel/evl_buf.c 2003-04-14 10:56:21.000000000 +0800
+++ evlog-saverecent/kernel/v2.4.20/kernel/evl_buf.c 2003-04-29 16:09:57.000000000 +0800
@@ -107,6 +107,7 @@
const char * databuf);
extern int console_loglevel;
extern struct console *console_drivers;
+unsigned char * evl_getnext_rec(unsigned char *, size_t, unsigned char *);
/*
@@ -133,13 +134,38 @@
{
unsigned char *head, *end;
unsigned char *wrapbuf = bf_curr;
+#ifdef CONFIG_EVLOG_SAVE_RECENT
+ evl_buf_rec_t *p_rec;
+ size_t rec_size;
+# if defined(__ia64__)
+ evl_buf_rec_t record;
+# endif
+#endif
end = bf_curr + len;
head = evl_ebuf.bf_head;
if (bf_curr < head && end >= head) {
/* Insufficient free space in buffer; drop record. */
+
+#ifdef CONFIG_EVLOG_SAVE_RECENT
+ p_rec = (evl_buf_rec_t *) head;
+ rec_size = REC_HDR_SIZE + p_rec->rechdr.log_size;
+ while ( head + rec_size <= end ) {
+ head = evl_getnext_rec(head, rec_size, evl_ebuf.bf_tail);
+ p_rec = (evl_buf_rec_t *) head;
+# if defined(__ia64__)
+ memcpy(&record, rec, sizeof(evl_buf_rec_t));
+ rec_size = REC_HDR_SIZE + record.rechdr.log_size;
+# else
+ rec_size = REC_HDR_SIZE + p_rec->rechdr.log_size;
+# endif
+ };
+ evl_ebuf.bf_head = evl_getnext_rec(head, rec_size, evl_ebuf.bf_tail);
+ return wrapbuf;
+#else
return NULL;
+#endif
}
if (end > evl_ebuf.bf_end) {
/* end would be of end of buffer */
@@ -155,7 +181,23 @@
end = evl_ebuf.bf_buf + len;
if (end >= head) {
/* Insufficient free space in buffer; drop record. */
+#ifdef CONFIG_EVLOG_SAVE_RECENT
+ p_rec = (evl_buf_rec_t *) head;
+ rec_size = REC_HDR_SIZE + p_rec->rechdr.log_size;
+ while ( head + rec_size <= end ) {
+ head = evl_getnext_rec(head, rec_size, evl_ebuf.bf_tail);
+ p_rec = (evl_buf_rec_t *) head;
+# if defined(__ia64__)
+ memcpy(&record, rec, sizeof(evl_buf_rec_t));
+ rec_size = REC_HDR_SIZE + record.rechdr.log_size;
+# else
+ rec_size = REC_HDR_SIZE + p_rec->rechdr.log_size;
+# endif
+ };
+ evl_ebuf.bf_head = evl_getnext_rec(head, rec_size, evl_ebuf.bf_tail);
+#else
return NULL;
+#endif
}
}
return wrapbuf;
@@ -741,8 +783,10 @@
spin_lock_irqsave(&ebuf_lock, iflags);
if (evl_check_buf() < 0) {
evl_ebuf.bf_dropped++;
+#ifndef CONFIG_EVLOG_SAVE_RECENT
spin_unlock_irqrestore(&ebuf_lock, iflags);
return -ENOSPC;
+#endif
}
if (args) {
Thanks,
--
-----------------------------------------------------------------
Opinions expressed are those of the author and do not represent
Intel Corp.
Zhu Yi (Chuyee)
Intel China Software Lab (ICSL)
22nd Floor, ShanghaiMart Tower No. 2299 Yan'an Road(West)
Shanghai 200336, PRC
Tel: 8621-52574545-1261
Fax: 8621-62366119
GnuPG v1.0.6 (GNU/Linux)
http://cn.geocities.com/chewie_chuyee/gpg.txt
1024D/71C34820 C939 2B0B FBCE 1D51 109A 55E5 8650 DB90 71C3 4820
-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf