[Crash-utility] [PATCH v2 2/2] fix error crash: cannot resolve "schedulers"

Nikola Pajkovsky npajkovsky at suse.cz
Fri Feb 2 16:28:09 UTC 2018


Since Xen commit 666aca08175b ("sched: use the auto-generated list of
schedulers") crash cannot open Xen vmcores, because symbol 'schedulers'
does not exits. Xen 4.7 implemented schedulers as its own section.

xen/arch/x86/xen.lds.S
       __start_schedulers_array = .;
       *(.data.schedulers)
       __end_schedulers_array = .;

Crash must not look up for "schedulers" symbol and fails, if symbol is
not found. It must check if __start_schedulers_array exits, and if it
does, use it and get size of the section. Otherwise, crash fallback to
looking up "schedulers" symbol. That way, crash can open vmcore before
and after Xen 4.7.

Signed-off-by: Nikola Pajkovsky <npajkovsky at suse.cz>
---
 xen_hyper.c | 25 +++++++++++++++++++++++--
 1 file changed, 23 insertions(+), 2 deletions(-)

diff --git a/xen_hyper.c b/xen_hyper.c
index 479aa1acfd43..2a42e44b1f70 100644
--- a/xen_hyper.c
+++ b/xen_hyper.c
@@ -437,6 +437,16 @@ xen_hyper_misc_init(void)
  */
 #define XEN_HYPER_SCHEDULER_NAME 1024
 
+static int section_size(char *start_section, char *end_section)
+{
+	ulong sp_start, sp_end;
+
+	sp_start = symbol_value(start_section);
+	sp_end = symbol_value(end_section);
+
+	return (sp_end - sp_start) / sizeof(long);
+}
+
 static void
 xen_hyper_schedule_init(void)
 {
@@ -448,6 +458,7 @@ xen_hyper_schedule_init(void)
 	char *buf;
 	char opt_name_buf[XEN_HYPER_OPT_SCHED_SIZE];
 	int i, cpuid, flag;
+	char *sp_name;
 
 	/* get scheduler information */
 	if((xhscht->scheduler_struct =
@@ -469,9 +480,19 @@ xen_hyper_schedule_init(void)
 	XEN_HYPER_OPT_SCHED_SIZE, "opt_sched,", RETURN_ON_ERROR)) {
 		error(FATAL, "cannot read opt_sched,.\n");
 	}
-	nr_schedulers = get_array_length("schedulers", 0, 0);
+
+	/* symbol exists since Xen 4.7 */
+	if (symbol_exists("__start_schedulers_array")) {
+		sp_name = "__start_schedulers_array";
+		nr_schedulers = section_size("__start_schedulers_array",
+					     "__end_schedulers_array");
+	} else {
+		sp_name = "schedulers";
+		nr_schedulers = get_array_length("schedulers", 0, 0);
+	}
+
 	schedulers_buf = (long *)GETBUF(nr_schedulers * sizeof(long));
-	schedulers = symbol_value("schedulers");
+	schedulers = symbol_value(sp_name);
 	addr = schedulers;
 	while (xhscht->name == NULL) {
 		if (!readmem(addr, KVADDR, schedulers_buf,
-- 
2.13.6




More information about the Crash-utility mailing list