Re: [PATCH] log: output logs of printk safe buffers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Hagio-san,

Thank you for the review. 
I will update the patch taking your comments.

Thanks,
Shogo Matsumoto

> -----Original Message-----
> From: HAGIO KAZUHITO(萩尾 一仁) <k-hagio-ab@xxxxxxx>
> Sent: Tuesday, January 4, 2022 11:31 AM
> To: Matsumoto, Shogo <shogo.matsumoto@xxxxxxxxxxx>; Discussion
> list for crash utility usage, maintenance and development
> <crash-utility@xxxxxxxxxx>
> Subject: RE:  [PATCH] log: output logs of printk safe buffers
> 
> Hi Matsumoto-san,
> 
> thanks for the patch, only minor respects below:
> 
> -----Original Message-----
> > We sometimes overlook logs written to printk safe buffers
> > (safe_print_seq/nmi_print_seq) which have not been flushed yet.
> >
> > This patch will output unflushed logs of the safe buffers
> > at the bottom of log command output as follows:
> >
> > [nmi_print_seq] CPU: 0  BUFFER: ffff888063c18ac0  LEN: 28
> > nmi print seq test message
> > [safe_print_seq] CPU: 1  BUFFER: ffff888063d19ae0  LEN: 30
> > safe print seq test message
> >
> > Note that the safe buffer (struct printk_safe_seq_buf) was introduced
> > in kernel-4.11 and removed in kernel-5.15.
> >
> > Signed-off-by: Shogo Matsumoto <shogo.matsumoto@xxxxxxxxxxx>
> > ---
> >  defs.h   |  3 +++
> >  kernel.c | 58
> +++++++++++++++++++++++++++++++++++++++++++++++++++
> +++++
> >  2 files changed, 61 insertions(+)
> >
> > diff --git a/defs.h b/defs.h
> > index 7e2a16e..3ee51e0 100644
> > --- a/defs.h
> > +++ b/defs.h
> > @@ -2146,6 +2146,8 @@ struct offset_table {                    /* stash of
> commonly-used offsets */
> >  	long wait_queue_entry_private;
> >  	long wait_queue_head_head;
> >  	long wait_queue_entry_entry;
> > +	long printk_safe_seq_buf_len;
> > +	long printk_safe_seq_buf_buffer;
> >  };
> >
> >  struct size_table {         /* stash of commonly-used sizes */
> > @@ -2310,6 +2312,7 @@ struct size_table {         /* stash of
> commonly-used sizes */
> >  	long prb_desc;
> >  	long wait_queue_entry;
> >  	long task_struct_state;
> > +	long printk_safe_seq_buf_buffer;
> >  };
> >
> >  struct array_table {
> > diff --git a/kernel.c b/kernel.c
> > index f4598ea..cc97176 100644
> > --- a/kernel.c
> > +++ b/kernel.c
> > @@ -93,6 +93,7 @@ static void source_tree_init(void);
> >  static ulong dump_audit_skb_queue(ulong);
> >  static ulong __dump_audit(char *);
> >  static void dump_audit(void);
> > +static void dump_printk_safe_seq_buf(void);
> >  static char *vmcoreinfo_read_string(const char *);
> >  static void check_vmcoreinfo(void);
> >  static int is_pvops_xen(void);
> > @@ -5048,6 +5049,7 @@ cmd_log(void)
> >  	}
> >
> >  	dump_log(msg_flags);
> > +	dump_printk_safe_seq_buf();
> >  }
> >
> >
> > @@ -11534,6 +11536,62 @@ dump_audit(void)
> >  		error(INFO, "kernel audit log is empty\n");
> >  }
> >
> > +static void
> > +__dump_printk_safe_seq_buf(char *buf_name)
> > +{
> > +	int cpu, buffer_size;
> > +	char *buffer;
> > +
> > +	if (!symbol_exists(buf_name)) {
> > +		return;
> > +	}
> > +
> > +	buffer_size = SIZE(printk_safe_seq_buf_buffer);
> > +	buffer = GETBUF(buffer_size);
> > +	for (cpu = 0; cpu < kt->cpus; cpu++) {
> > +		ulong len_addr, buffer_addr;
> > +		int len;
> > +
> > +		len_addr = symbol_value(buf_name) +
> kt->__per_cpu_offset[cpu] +
> > OFFSET(printk_safe_seq_buf_len);
> 
> I'd like to move the symbol_value() out of the loop.  and more exactly,
> OFFSET(atomic_t_counter) needs to be added, although it's zero.
> 
> > +		buffer_addr = symbol_value(buf_name) +
> kt->__per_cpu_offset[cpu] +
> > OFFSET(printk_safe_seq_buf_buffer);
> > +		readmem(len_addr, KVADDR, &len, STRUCT_SIZE("atomic_t"),
> "printk_safe_seq_buf len",
> > FAULT_ON_ERROR);
> 
> I think sizeof(int) is better than STRUCT_SIZE("atomic_t").
> 
> Thanks,
> Kazu
> 
> > +		readmem(buffer_addr, KVADDR, buffer, buffer_size,
> "printk_safe_seq_buf buffer",
> > FAULT_ON_ERROR);
> > +
> > +		if (len > 0) {
> > +			int i, n;
> > +			char *p;
> > +			fprintf(fp, "[%s] CPU: %d  BUFFER: %lx  LEN: %d\n",
> buf_name, cpu, buffer_addr, len);
> > +			n = (len <= buffer_size) ? len : buffer_size;
> > +			for (i = 0, p = buffer; i < n; i++, p++) {
> > +				if (*p == 0x1) { //SOH
> > +					i++; p++;
> > +					continue;
> > +				} else {
> > +					fputc(ascii(*p) ? *p : '.', fp);
> > +				}
> > +			}
> > +			fputc('\n', fp);
> > +		}
> > +	}
> > +	FREEBUF(buffer);
> > +}
> > +
> > +static void
> > +dump_printk_safe_seq_buf(void)
> > +{
> > +	if (!STRUCT_EXISTS("printk_safe_seq_buf"))
> > +		return;
> > +
> > +	if (INVALID_SIZE(printk_safe_seq_buf_buffer)) {
> > +		MEMBER_OFFSET_INIT(printk_safe_seq_buf_len,
> "printk_safe_seq_buf", "len");
> > +		MEMBER_OFFSET_INIT(printk_safe_seq_buf_buffer,
> "printk_safe_seq_buf", "buffer");
> > +		MEMBER_SIZE_INIT(printk_safe_seq_buf_buffer,
> "printk_safe_seq_buf", "buffer");
> > +	}
> > +
> > +	__dump_printk_safe_seq_buf("nmi_print_seq");
> > +	__dump_printk_safe_seq_buf("safe_print_seq");
> > +}
> > +
> >  /*
> >   * Reads a string value from the VMCOREINFO data stored in (live) memory.
> >   *
> > --
> > 2.29.2
> >
> >
> >
> > --
> > Crash-utility mailing list
> > Crash-utility@xxxxxxxxxx
> > https://listman.redhat.com/mailman/listinfo/crash-utility


--
Crash-utility mailing list
Crash-utility@xxxxxxxxxx
https://listman.redhat.com/mailman/listinfo/crash-utility




[Index of Archives]     [Fedora Development]     [Fedora Desktop]     [Fedora SELinux]     [Yosemite News]     [KDE Users]     [Fedora Tools]

 

Powered by Linux