Re: [PATCH 3/3] xen: adjust to new scheduler structures

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

[Index of Archives]     [Fedora Development]     [Fedora Desktop]     [Fedora SELinux]     [Yosemite News]     [KDE Users]     [Fedora Tools]

 

Powered by Linux