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

Dave Anderson anderson at redhat.com
Fri Feb 2 17:06:35 UTC 2018


Nikola,

Looks good -- patches are queued for crash-7.2.1:

  https://github.com/crash-utility/crash/commit/e4499a9de664826b0db2f650684959c2f3f9998c
  
Thanks,
  Dave


----- Original Message -----
> 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
> 
> --
> Crash-utility mailing list
> Crash-utility at redhat.com
> https://www.redhat.com/mailman/listinfo/crash-utility
> 




More information about the Crash-utility mailing list