Re: [evlog-dev] [PATCH] save most recent event when the buffer overflows
Hien Nguyen <[email protected]> Wed, 30 Apr 2003 09:49:59 -0700
| Newsgroups | gmane.linux.kernel.event-logging |
|---|---|
| Message-ID | <[email protected]> |
Hi Yi,
We are currently making a lot of changes in the kernel (i.e. Jim
re-wrote the evlog kernel buffer and combined the evl_buf.c and
evl_cmd.c files to just one file evlog.c etc...). We will release the
new kernel patch in the near future, we like to postpone this patch
until then.
Thanks for your contributions.
Hien.
Zhu, Yi wrote:
> 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,
-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf