Blame SOURCES/0004-Handle-task_struct-cpu-member-changes-for-kernels-5..patch

f27a4c
From 488a59f85a57961fb0527aac40ae30fc7a17a24c Mon Sep 17 00:00:00 2001
f27a4c
From: Alexander Egorenkov <egorenar@linux.ibm.com>
f27a4c
Date: Wed, 13 Oct 2021 10:56:39 +0200
f27a4c
Subject: [PATCH] Handle task_struct cpu member changes for kernels >= 5.16-rc1
f27a4c
f27a4c
Kernel commit bcf9033e5449bdcaa9bed46467a7141a8049dadb
f27a4c
("sched: move CPU field back into thread_info if THREAD_INFO_IN_TASK=y")
f27a4c
moved the member cpu of task_struct back into thread_info.
f27a4c
Without the patch, crash fails with the following error message
f27a4c
during session initialization:
f27a4c
f27a4c
  crash: invalid structure member offset: task_struct_cpu
f27a4c
         FILE: task.c  LINE: 2904  FUNCTION: add_context()
f27a4c
f27a4c
Signed-off-by: Alexander Egorenkov <egorenar@linux.ibm.com>
f27a4c
Signed-off-by: Kazuhito Hagio <k-hagio-ab@nec.com>
f27a4c
---
f27a4c
 task.c | 7 ++++---
f27a4c
 1 file changed, 4 insertions(+), 3 deletions(-)
f27a4c
f27a4c
diff --git a/task.c b/task.c
f27a4c
index 672b41697e75..bb6a5da8ad33 100644
f27a4c
--- a/task.c
f27a4c
+++ b/task.c
f27a4c
@@ -278,8 +278,10 @@ task_init(void)
f27a4c
 	} else if (VALID_MEMBER(task_struct_stack))
f27a4c
 		MEMBER_OFFSET_INIT(task_struct_thread_info, "task_struct", "stack");
f27a4c
 
f27a4c
+	MEMBER_OFFSET_INIT(task_struct_cpu, "task_struct", "cpu");
f27a4c
+
f27a4c
 	if (VALID_MEMBER(task_struct_thread_info)) {
f27a4c
-		if (tt->flags & THREAD_INFO_IN_TASK) {
f27a4c
+		if (tt->flags & THREAD_INFO_IN_TASK && VALID_MEMBER(task_struct_cpu)) {
f27a4c
 			MEMBER_OFFSET_INIT(thread_info_flags, "thread_info", "flags");
f27a4c
 			/* (unnecessary) reminders */
f27a4c
 			ASSIGN_OFFSET(thread_info_task) = INVALID_OFFSET;
f27a4c
@@ -315,7 +317,6 @@ task_init(void)
f27a4c
         MEMBER_OFFSET_INIT(task_struct_has_cpu, "task_struct", "has_cpu");
f27a4c
         MEMBER_OFFSET_INIT(task_struct_cpus_runnable,  
f27a4c
 		"task_struct", "cpus_runnable");
f27a4c
-	MEMBER_OFFSET_INIT(task_struct_cpu, "task_struct", "cpu");
f27a4c
 	MEMBER_OFFSET_INIT(task_struct_active_mm, "task_struct", "active_mm");
f27a4c
 	MEMBER_OFFSET_INIT(task_struct_next_run, "task_struct", "next_run");
f27a4c
 	MEMBER_OFFSET_INIT(task_struct_flags, "task_struct", "flags");
f27a4c
@@ -2900,7 +2901,7 @@ add_context(ulong task, char *tp)
f27a4c
 		else
f27a4c
 			tc->thread_info = ULONG(tp + OFFSET(task_struct_thread_info));
f27a4c
 		fill_thread_info(tc->thread_info);
f27a4c
-		if (tt->flags & THREAD_INFO_IN_TASK)
f27a4c
+		if (tt->flags & THREAD_INFO_IN_TASK && VALID_MEMBER(task_struct_cpu))
f27a4c
                 	processor_addr = (int *) (tp + OFFSET(task_struct_cpu));
f27a4c
 		else
f27a4c
 			processor_addr = (int *) (tt->thread_info + 
f27a4c
-- 
f27a4c
2.30.2
f27a4c