From: Ivan Delalande <colona@arista.com>
To: "HAGIO KAZUHITO(萩尾 一仁)" <k-hagio-ab@nec.com>
Cc: "kexec@lists.infradead.org" <kexec@lists.infradead.org>,
John Ogness <john.ogness@linutronix.de>
Subject: [PATCH v2] makedumpfile: support --partial-dmesg on 5.10+ kernels
Date: Mon, 30 Aug 2021 16:28:44 -0700 [thread overview]
Message-ID: <YS1prC+k23E964Qz@visor> (raw)
In-Reply-To: <TYYPR01MB677762D7B0E7850537CDF61BDDFF9@TYYPR01MB6777.jpnprd01.prod.outlook.com>
The new printk ringbuffer implementation added in kernel v5.10 with
commit 896fbe20b4e2 ("printk: use the lockless ringbuffer") also
exported a new vmcore symbol "clear_seq" to keep track where dmesg had
been cleared like "clear_idx" on previous versions. Use it in
dump_lockless_dmesg when --partial-dmesg is passed to find and start
dumping messages only from that index.
On v5.13, commit 7d7a23a91c91 ("printk: use seqcount_latch for
clear_seq") converted it from a simple value, and so an additional step
is required to find and retrieve the sequence at the right offset in the
latched_seq structure it now uses.
Signed-off-by: Ivan Delalande <colona@arista.com>
---
makedumpfile.c | 12 ++++++++++++
makedumpfile.h | 6 ++++++
printk.c | 19 +++++++++++++++++++
3 files changed, 37 insertions(+)
diff --git a/makedumpfile.c b/makedumpfile.c
index b1b3b42..ac17f19 100644
--- a/makedumpfile.c
+++ b/makedumpfile.c
@@ -1555,6 +1555,7 @@ get_symbol_info(void)
SYMBOL_INIT(pgdat_list, "pgdat_list");
SYMBOL_INIT(contig_page_data, "contig_page_data");
SYMBOL_INIT(prb, "prb");
+ SYMBOL_INIT(clear_seq, "clear_seq");
SYMBOL_INIT(log_buf, "log_buf");
SYMBOL_INIT(log_buf_len, "log_buf_len");
SYMBOL_INIT(log_end, "log_end");
@@ -2000,6 +2001,9 @@ get_structure_info(void)
OFFSET_INIT(printk_info.text_len, "printk_info", "text_len");
OFFSET_INIT(atomic_long_t.counter, "atomic_long_t", "counter");
+
+ SIZE_INIT(latched_seq, "latched_seq");
+ OFFSET_INIT(latched_seq.val, "latched_seq", "val");
} else if (SIZE(printk_log) != NOT_FOUND_STRUCTURE) {
/*
* In kernel 3.11-rc4 the log structure name was renamed
@@ -2231,6 +2235,7 @@ write_vmcoreinfo_data(void)
WRITE_SYMBOL("pgdat_list", pgdat_list);
WRITE_SYMBOL("contig_page_data", contig_page_data);
WRITE_SYMBOL("prb", prb);
+ WRITE_SYMBOL("clear_seq", clear_seq);
WRITE_SYMBOL("log_buf", log_buf);
WRITE_SYMBOL("log_buf_len", log_buf_len);
WRITE_SYMBOL("log_end", log_end);
@@ -2266,6 +2271,7 @@ write_vmcoreinfo_data(void)
WRITE_STRUCTURE_SIZE("printk_ringbuffer", printk_ringbuffer);
WRITE_STRUCTURE_SIZE("prb_desc", prb_desc);
WRITE_STRUCTURE_SIZE("printk_info", printk_info);
+ WRITE_STRUCTURE_SIZE("latched_seq", latched_seq);
} else if (info->flag_use_printk_log)
WRITE_STRUCTURE_SIZE("printk_log", printk_log);
else
@@ -2335,6 +2341,8 @@ write_vmcoreinfo_data(void)
WRITE_MEMBER_OFFSET("printk_info.text_len", printk_info.text_len);
WRITE_MEMBER_OFFSET("atomic_long_t.counter", atomic_long_t.counter);
+
+ WRITE_MEMBER_OFFSET("latched_seq.val", latched_seq.val);
} else if (info->flag_use_printk_log) {
WRITE_MEMBER_OFFSET("printk_log.ts_nsec", printk_log.ts_nsec);
WRITE_MEMBER_OFFSET("printk_log.len", printk_log.len);
@@ -2676,6 +2684,7 @@ read_vmcoreinfo(void)
READ_SYMBOL("pgdat_list", pgdat_list);
READ_SYMBOL("contig_page_data", contig_page_data);
READ_SYMBOL("prb", prb);
+ READ_SYMBOL("clear_seq", clear_seq);
READ_SYMBOL("log_buf", log_buf);
READ_SYMBOL("log_buf_len", log_buf_len);
READ_SYMBOL("log_end", log_end);
@@ -2784,6 +2793,9 @@ read_vmcoreinfo(void)
READ_MEMBER_OFFSET("printk_info.text_len", printk_info.text_len);
READ_MEMBER_OFFSET("atomic_long_t.counter", atomic_long_t.counter);
+
+ READ_STRUCTURE_SIZE("latched_seq", latched_seq);
+ READ_MEMBER_OFFSET("latched_seq.val", latched_seq.val);
} else if (SIZE(printk_log) != NOT_FOUND_STRUCTURE) {
info->flag_use_printk_ringbuffer = FALSE;
info->flag_use_printk_log = TRUE;
diff --git a/makedumpfile.h b/makedumpfile.h
index ca50a89..bd9e2f6 100644
--- a/makedumpfile.h
+++ b/makedumpfile.h
@@ -1656,6 +1656,7 @@ struct symbol_table {
unsigned long long pgdat_list;
unsigned long long contig_page_data;
unsigned long long prb;
+ unsigned long long clear_seq;
unsigned long long log_buf;
unsigned long long log_buf_len;
unsigned long long log_end;
@@ -1749,6 +1750,7 @@ struct size_table {
long printk_ringbuffer;
long prb_desc;
long printk_info;
+ long latched_seq;
/*
* for Xen extraction
@@ -1973,6 +1975,10 @@ struct offset_table {
long counter;
} atomic_long_t;
+ struct latched_seq_s {
+ long val;
+ } latched_seq;
+
/*
* symbols on ppc64 arch
*/
diff --git a/printk.c b/printk.c
index e8501c7..61e0b26 100644
--- a/printk.c
+++ b/printk.c
@@ -145,6 +145,7 @@ dump_record(struct prb_map *m, unsigned long id)
int
dump_lockless_dmesg(void)
{
+ unsigned long long clear_seq;
unsigned long head_id;
unsigned long tail_id;
unsigned long kaddr;
@@ -216,6 +217,24 @@ dump_lockless_dmesg(void)
OFFSET(atomic_long_t.counter));
head_id = ULONG(m.desc_ring + OFFSET(prb_desc_ring.head_id) +
OFFSET(atomic_long_t.counter));
+ if (info->flag_partial_dmesg && SYMBOL(clear_seq) != NOT_FOUND_SYMBOL) {
+ if (!readmem(VADDR, SYMBOL(clear_seq), &clear_seq,
+ sizeof(clear_seq))) {
+ ERRMSG("Can't get clear_seq.\n");
+ goto out_text_data;
+ }
+ if (SIZE(latched_seq) != NOT_FOUND_STRUCTURE) {
+ kaddr = SYMBOL(clear_seq) + OFFSET(latched_seq.val) +
+ (clear_seq & 0x1) * sizeof(clear_seq);
+ if (!readmem(VADDR, kaddr, &clear_seq,
+ sizeof(clear_seq))) {
+ ERRMSG("Can't get latched clear_seq.\n");
+ goto out_text_data;
+ }
+ }
+ tail_id = head_id - head_id % m.desc_ring_count +
+ clear_seq % m.desc_ring_count;
+ }
if (!open_dump_file()) {
ERRMSG("Can't open output file.\n");
--
2.33.0
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
next prev parent reply other threads:[~2021-08-30 23:28 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-08-16 22:49 [PATCH] makedumpfile: support --partial-dmesg on 5.10+ kernels Ivan Delalande
2021-08-18 1:21 ` HAGIO KAZUHITO(萩尾 一仁)
2021-08-30 23:28 ` Ivan Delalande [this message]
2021-09-01 5:27 ` [PATCH v2] " HAGIO KAZUHITO(萩尾 一仁)
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=YS1prC+k23E964Qz@visor \
--to=colona@arista.com \
--cc=john.ogness@linutronix.de \
--cc=k-hagio-ab@nec.com \
--cc=kexec@lists.infradead.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.