On 14.03.23 09:51, HAGIO KAZUHITO(萩尾 一仁) wrote:
On 2023/03/13 22:01, Juergen Gross wrote:There has been a significant modification regarding scheduler data in the Xen hypervisor. Adapt to new structures and removed fields. Note that this is only the bare minimum to not let crash error out when opening a vmcore in Xen mode with a recent Xen version. Signed-off-by: Juergen Gross <jgross@xxxxxxxx> --- xen_hyper.c | 67 +++++++++++++++++++++++++++++++++--------------- xen_hyper_defs.h | 4 ++- 2 files changed, 49 insertions(+), 22 deletions(-) diff --git a/xen_hyper.c b/xen_hyper.c index 72720e2..4c884dd 100644 --- a/xen_hyper.c +++ b/xen_hyper.c @@ -417,13 +417,21 @@ void xen_hyper_misc_init(void) { XEN_HYPER_STRUCT_SIZE_INIT(schedule_data, "schedule_data"); - XEN_HYPER_MEMBER_OFFSET_INIT(schedule_data_schedule_lock, "schedule_data", "schedule_lock"); - XEN_HYPER_MEMBER_OFFSET_INIT(schedule_data_curr, "schedule_data", "curr"); - if (MEMBER_EXISTS("schedule_data", "idle")) - XEN_HYPER_MEMBER_OFFSET_INIT(schedule_data_idle, "schedule_data", "idle"); - XEN_HYPER_MEMBER_OFFSET_INIT(schedule_data_sched_priv, "schedule_data", "sched_priv"); - XEN_HYPER_MEMBER_OFFSET_INIT(schedule_data_s_timer, "schedule_data", "s_timer"); - XEN_HYPER_MEMBER_OFFSET_INIT(schedule_data_tick, "schedule_data", "tick"); + XEN_HYPER_STRUCT_SIZE_INIT(sched_resource, "sched_resource"); + if (XEN_HYPER_VALID_SIZE(schedule_data)) { + XEN_HYPER_MEMBER_OFFSET_INIT(schedule_data_schedule_lock, "schedule_data", "schedule_lock"); + XEN_HYPER_MEMBER_OFFSET_INIT(schedule_data_curr, "schedule_data", "curr"); + if (MEMBER_EXISTS("schedule_data", "idle")) + XEN_HYPER_MEMBER_OFFSET_INIT(schedule_data_idle, "schedule_data", "idle"); + XEN_HYPER_MEMBER_OFFSET_INIT(schedule_data_sched_priv, "schedule_data", "sched_priv"); + XEN_HYPER_MEMBER_OFFSET_INIT(schedule_data_s_timer, "schedule_data", "s_timer"); + XEN_HYPER_MEMBER_OFFSET_INIT(schedule_data_tick, "schedule_data", "tick"); + } else if (XEN_HYPER_VALID_SIZE(sched_resource)) { + XEN_HYPER_MEMBER_OFFSET_INIT(schedule_data_schedule_lock, "sched_resource", "schedule_lock"); + XEN_HYPER_MEMBER_OFFSET_INIT(schedule_data_curr, "sched_resource", "curr"); + XEN_HYPER_MEMBER_OFFSET_INIT(schedule_data_sched_priv, "sched_resource", "sched_priv"); + XEN_HYPER_MEMBER_OFFSET_INIT(schedule_data_s_timer, "sched_resource", "s_timer"); + }XEN_HYPER_STRUCT_SIZE_INIT(scheduler, "scheduler");XEN_HYPER_MEMBER_OFFSET_INIT(scheduler_name, "scheduler", "name"); @@ -467,6 +475,7 @@ xen_hyper_schedule_init(void) long *schedulers_buf; int nr_schedulers; struct xen_hyper_sched_context *schc; + long buf_size; char *buf; char opt_name_buf[XEN_HYPER_OPT_SCHED_SIZE]; int i, cpuid, flag; @@ -561,28 +570,43 @@ xen_hyper_schedule_init(void) } BZERO(xhscht->sched_context_array, sizeof(struct xen_hyper_sched_context) * XEN_HYPER_MAX_CPUS()); - buf = GETBUF(XEN_HYPER_SIZE(schedule_data)); - if (symbol_exists("per_cpu__schedule_data")) { + if (symbol_exists("per_cpu__sched_res")) { + addr = symbol_value("per_cpu__sched_res"); + buf_size = XEN_HYPER_SIZE(sched_resource); + flag = 0; + } else if (symbol_exists("per_cpu__schedule_data")) { addr = symbol_value("per_cpu__schedule_data"); - flag = TRUE; + buf_size = XEN_HYPER_SIZE(schedule_data); + flag = 1; } else { addr = symbol_value("schedule_data"); - flag = FALSE; + buf_size = XEN_HYPER_SIZE(schedule_data); + flag = 2; } + buf = GETBUF(buf_size); for_cpu_indexes(i, cpuid) { schc = &xhscht->sched_context_array[cpuid]; if (flag) { - schc->schedule_data = - xen_hyper_per_cpu(addr, i); + if (flag == 1) { + schc->schedule_data = + xen_hyper_per_cpu(addr, i); + } else { + schc->schedule_data = addr + + XEN_HYPER_SIZE(schedule_data) * i; + } + if (!readmem(schc->schedule_data, + KVADDR, buf, XEN_HYPER_SIZE(schedule_data), + "schedule_data", RETURN_ON_ERROR)) { + error(FATAL, "cannot read schedule_data.\n"); + } } else { - schc->schedule_data = addr + - XEN_HYPER_SIZE(schedule_data) * i; - } - if (!readmem(schc->schedule_data, - KVADDR, buf, XEN_HYPER_SIZE(schedule_data), - "schedule_data", RETURN_ON_ERROR)) { - error(FATAL, "cannot read schedule_data.\n"); + schc->sched_resource = xen_hyper_per_cpu(addr, i); + if (!readmem(schc->sched_resource, + KVADDR, buf, XEN_HYPER_SIZE(sched_resource), + "sched_resource", RETURN_ON_ERROR)) { + error(FATAL, "cannot read sched_resource.\n"); + } } schc->cpu_id = cpuid; schc->curr = ULONG(buf + XEN_HYPER_OFFSET(schedule_data_curr)); @@ -1599,7 +1623,8 @@ xen_hyper_store_vcpu_context(struct xen_hyper_vcpu_context *vcc, vcc->next_in_list = ULONG(vcp + XEN_HYPER_OFFSET(vcpu_next_in_list)); if (XEN_HYPER_VALID_MEMBER(vcpu_sleep_tick)) vcc->sleep_tick = ULONG(vcp + XEN_HYPER_OFFSET(vcpu_sleep_tick)); - vcc->sched_priv = ULONG(vcp + XEN_HYPER_OFFSET(vcpu_sched_priv)); + if (XEN_HYPER_VALID_MEMBER(vcpu_sched_priv)) + vcc->sched_priv = ULONG(vcp + XEN_HYPER_OFFSET(vcpu_sched_priv)); vcc->state = INT(vcp + XEN_HYPER_OFFSET(vcpu_runstate) + XEN_HYPER_OFFSET(vcpu_runstate_info_state)); vcc->state_entry_time = ULONGLONG(vcp + diff --git a/xen_hyper_defs.h b/xen_hyper_defs.h index acf910a..908b470 100644 --- a/xen_hyper_defs.h +++ b/xen_hyper_defs.h @@ -547,6 +547,7 @@ struct xen_hyper_pcpu_table { struct xen_hyper_sched_context { uint cpu_id; ulong schedule_data; + ulong sched_resource;Please add this to xen_hyper_dump_xen_hyper_sched_table().ulong curr; ulong idle; ulong sched_priv; @@ -595,6 +596,7 @@ struct xen_hyper_size_table { #endif long note_buf_t; /* elf note v1 */ long schedule_data; + long sched_resource;Please add this to xen_hyper_dump_xen_hyper_size_table().
Okay.
Also, could you move these two above to the last member of each table? It's to avoid breaking extension modules previously compiled with old definitions, for example, like commit c477b04aee34.
Yes, of course. Juergen
Attachment:
OpenPGP_0xB0DE9DD628BF132F.asc
Description: OpenPGP public key
Attachment:
OpenPGP_signature
Description: OpenPGP digital signature
-- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://listman.redhat.com/mailman/listinfo/crash-utility Contribution Guidelines: https://github.com/crash-utility/crash/wiki