Kmemdump requires the prb, data, descriptors and info. Add it inside the log_buf_vmcoreinfo_setup() In the case when the log buffer is dynamically replaced by a runtime allocated version, call kmemdump to register the data but call unregister to remove the old registered data first. Signed-off-by: Eugen Hristev <eugen.hristev@xxxxxxxxxx> --- kernel/printk/printk.c | 47 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c index 5aee9ffb16b9..f75489fd82df 100644 --- a/kernel/printk/printk.c +++ b/kernel/printk/printk.c @@ -49,6 +49,7 @@ #include <linux/sched/debug.h> #include <linux/sched/task_stack.h> #include <linux/panic.h> +#include <linux/kmemdump.h> #include <linux/uaccess.h> #include <asm/sections.h> @@ -964,6 +965,43 @@ const struct file_operations kmsg_fops = { }; #ifdef CONFIG_VMCORE_INFO +static void log_buf_vmcoreinfo_kmemdump_update(void *data, size_t data_size, + void *descs, size_t descs_size, + void *infos, size_t infos_size) +{ + kmemdump_unregister(KMEMDUMP_ID_COREIMAGE_prb_data); + kmemdump_register_id(KMEMDUMP_ID_COREIMAGE_prb_data, + (void *)data, data_size); + + kmemdump_unregister(KMEMDUMP_ID_COREIMAGE_prb_descs); + kmemdump_register_id(KMEMDUMP_ID_COREIMAGE_prb_descs, + (void *)descs, descs_size); + + kmemdump_unregister(KMEMDUMP_ID_COREIMAGE_prb_infos); + kmemdump_register_id(KMEMDUMP_ID_COREIMAGE_prb_infos, + (void *)infos, infos_size); +} + +static void log_buf_vmcoreinfo_kmemdump(void) +{ + kmemdump_register_id(KMEMDUMP_ID_COREIMAGE_prb, + (void *)&prb, sizeof(prb)); + kmemdump_register_id(KMEMDUMP_ID_COREIMAGE_prb_descs, + (void *)&_printk_rb_static_descs, + sizeof(_printk_rb_static_descs)); + kmemdump_register_id(KMEMDUMP_ID_COREIMAGE_prb_infos, + (void *)&_printk_rb_static_infos, + sizeof(_printk_rb_static_infos)); + kmemdump_register_id(KMEMDUMP_ID_COREIMAGE_prb_data, + (void *)&__log_buf, __LOG_BUF_LEN); + kmemdump_register_id(KMEMDUMP_ID_COREIMAGE_printk_rb_static, + (void *)&printk_rb_static, + sizeof(printk_rb_static)); + kmemdump_register_id(KMEMDUMP_ID_COREIMAGE_printk_rb_dynamic, + (void *)&printk_rb_dynamic, + sizeof(printk_rb_dynamic)); +} + /* * This appends the listed symbols to /proc/vmcore * @@ -1029,6 +1067,8 @@ void log_buf_vmcoreinfo_setup(void) VMCOREINFO_STRUCT_SIZE(latched_seq); VMCOREINFO_OFFSET(latched_seq, val); + + log_buf_vmcoreinfo_kmemdump(); } #endif @@ -1214,6 +1254,11 @@ void __init setup_log_buf(int early) new_descs, ilog2(new_descs_count), new_infos); +#ifdef CONFIG_VMCORE_INFO + log_buf_vmcoreinfo_kmemdump_update(new_log_buf, new_log_buf_len, + new_descs, new_descs_size, + new_infos, new_infos_size); +#endif local_irq_save(flags); log_buf_len = new_log_buf_len; @@ -1257,8 +1302,10 @@ void __init setup_log_buf(int early) return; err_free_descs: + kmemdump_unregister(KMEMDUMP_ID_COREIMAGE_prb_descs); memblock_free(new_descs, new_descs_size); err_free_log_buf: + kmemdump_unregister(KMEMDUMP_ID_COREIMAGE_prb_data); memblock_free(new_log_buf, new_log_buf_len); out: print_log_buf_usage_stats(); -- 2.43.0