All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/3] LoongArch: Add guess unwinder support
@ 2022-07-28 14:05 Qing Zhang
  2022-07-28 14:05 ` [PATCH 2/3] LoongArch: Add prologue " Qing Zhang
                   ` (2 more replies)
  0 siblings, 3 replies; 15+ messages in thread
From: Qing Zhang @ 2022-07-28 14:05 UTC (permalink / raw)
  To: Huacai Chen, WANG Xuerui; +Cc: loongarch, linux-kernel, Jiaxun Yang, hejinyang

Name "guess unwinder" comes from x86, It scans the stack and reports
every kernel text address it finds.

Three stages when we do unwind,
  (1)unwind_start(), the prapare of unwinding, fill unwind_state.
  (2)unwind_done(), judge whether the unwind process is finished or not.
  (3)unwind_next_frame(), unwind the next frame.

Make the dump_stack process go through unwind process.
Add get_stack_info() to get stack info. At present we have irq stack and
task stack. Maybe add another type in future. The next_sp means the key
info between this type stack and next type stack.

Dividing unwinder helps to add new unwinders in the future.

Signed-off-by: Qing Zhang <zhangqing@loongson.cn>

diff --git a/arch/loongarch/Kconfig.debug b/arch/loongarch/Kconfig.debug
index e69de29bb2d1..68634d4fa27b 100644
--- a/arch/loongarch/Kconfig.debug
+++ b/arch/loongarch/Kconfig.debug
@@ -0,0 +1,9 @@
+config UNWINDER_GUESS
+	bool "Guess unwinder"
+	help
+	  This option enables the "guess" unwinder for unwinding kernel stack
+	  traces.  It scans the stack and reports every kernel text address it
+	  finds.  Some of the addresses it reports may be incorrect.
+
+	  While this option often produces false positives, it can still be
+	  useful in many cases.
diff --git a/arch/loongarch/include/asm/stacktrace.h b/arch/loongarch/include/asm/stacktrace.h
index 26483e396ad1..33077010356d 100644
--- a/arch/loongarch/include/asm/stacktrace.h
+++ b/arch/loongarch/include/asm/stacktrace.h
@@ -10,6 +10,23 @@
 #include <asm/loongarch.h>
 #include <linux/stringify.h>
 
+enum stack_type {
+	STACK_TYPE_UNKNOWN,
+	STACK_TYPE_TASK,
+	STACK_TYPE_IRQ,
+};
+
+struct stack_info {
+	enum stack_type type;
+	unsigned long begin, end, next_sp;
+};
+
+bool in_task_stack(unsigned long stack, struct task_struct *task,
+			struct stack_info *info);
+bool in_irq_stack(unsigned long stack, struct stack_info *info);
+int get_stack_info(unsigned long stack, struct task_struct *task,
+			struct stack_info *info);
+
 #define STR_LONG_L    __stringify(LONG_L)
 #define STR_LONG_S    __stringify(LONG_S)
 #define STR_LONGSIZE  __stringify(LONGSIZE)
diff --git a/arch/loongarch/include/asm/unwind.h b/arch/loongarch/include/asm/unwind.h
new file mode 100644
index 000000000000..243330b39d0d
--- /dev/null
+++ b/arch/loongarch/include/asm/unwind.h
@@ -0,0 +1,37 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Most of this ideas comes from x86.
+ *
+ * Copyright (C) 2022 Loongson Technology Corporation Limited
+ */
+#ifndef _ASM_UNWIND_H
+#define _ASM_UNWIND_H
+
+#include <linux/sched.h>
+
+#include <asm/stacktrace.h>
+
+struct unwind_state {
+	struct stack_info stack_info;
+	struct task_struct *task;
+	unsigned long sp, pc;
+	bool first;
+	bool error;
+};
+
+void unwind_start(struct unwind_state *state, struct task_struct *task,
+		      struct pt_regs *regs);
+bool unwind_next_frame(struct unwind_state *state);
+unsigned long unwind_get_return_address(struct unwind_state *state);
+
+static inline bool unwind_done(struct unwind_state *state)
+{
+	return state->stack_info.type == STACK_TYPE_UNKNOWN;
+}
+
+static inline bool unwind_error(struct unwind_state *state)
+{
+	return state->error;
+}
+
+#endif /* _ASM_UNWIND_H */
diff --git a/arch/loongarch/kernel/Makefile b/arch/loongarch/kernel/Makefile
index 940de9173542..c5fa4adb23b6 100644
--- a/arch/loongarch/kernel/Makefile
+++ b/arch/loongarch/kernel/Makefile
@@ -22,4 +22,6 @@ obj-$(CONFIG_SMP)		+= smp.o
 
 obj-$(CONFIG_NUMA)		+= numa.o
 
+obj-$(CONFIG_UNWINDER_GUESS)	+= unwind_guess.o
+
 CPPFLAGS_vmlinux.lds		:= $(KBUILD_CFLAGS)
diff --git a/arch/loongarch/kernel/process.c b/arch/loongarch/kernel/process.c
index bfa0dfe8b7d7..709b7a1664f8 100644
--- a/arch/loongarch/kernel/process.c
+++ b/arch/loongarch/kernel/process.c
@@ -44,6 +44,7 @@
 #include <asm/pgtable.h>
 #include <asm/processor.h>
 #include <asm/reg.h>
+#include <asm/unwind.h>
 #include <asm/vdso.h>
 
 /*
@@ -183,6 +184,66 @@ unsigned long __get_wchan(struct task_struct *task)
 	return 0;
 }
 
+bool in_task_stack(unsigned long stack, struct task_struct *task,
+			struct stack_info *info)
+{
+	unsigned long begin = (unsigned long)task_stack_page(task);
+	unsigned long end = begin + THREAD_SIZE - 32;
+
+	if (stack < begin || stack >= end)
+		return false;
+
+	info->type = STACK_TYPE_TASK;
+	info->begin = begin;
+	info->end = end;
+	info->next_sp = 0;
+
+	return true;
+}
+
+bool in_irq_stack(unsigned long stack, struct stack_info *info)
+{
+	unsigned long nextsp;
+	unsigned long begin = (unsigned long)this_cpu_read(irq_stack);
+	unsigned long end = begin + IRQ_STACK_START;
+
+	if (stack < begin || stack >= end)
+		return false;
+
+	nextsp = *(unsigned long *)end;
+	if (nextsp & (SZREG - 1))
+		return false;
+
+	info->type = STACK_TYPE_IRQ;
+	info->begin = begin;
+	info->end = end;
+	info->next_sp = nextsp;
+
+	return true;
+}
+
+int get_stack_info(unsigned long stack, struct task_struct *task,
+		   struct stack_info *info)
+{
+	task = task ? : current;
+
+	if (!stack || stack & (SZREG - 1))
+		goto unknown;
+
+	if (in_task_stack(stack, task, info))
+		return 0;
+
+	if (task != current)
+		goto unknown;
+
+	if (in_irq_stack(stack, info))
+		return 0;
+
+unknown:
+	info->type = STACK_TYPE_UNKNOWN;
+	return -EINVAL;
+}
+
 unsigned long stack_top(void)
 {
 	unsigned long top = TASK_SIZE & PAGE_MASK;
diff --git a/arch/loongarch/kernel/traps.c b/arch/loongarch/kernel/traps.c
index 1bf58c65e2bf..ef2c3aeb1dab 100644
--- a/arch/loongarch/kernel/traps.c
+++ b/arch/loongarch/kernel/traps.c
@@ -43,6 +43,7 @@
 #include <asm/stacktrace.h>
 #include <asm/tlb.h>
 #include <asm/types.h>
+#include <asm/unwind.h>
 
 #include "access-helper.h"
 
@@ -64,19 +65,18 @@ static void show_backtrace(struct task_struct *task, const struct pt_regs *regs,
 			   const char *loglvl, bool user)
 {
 	unsigned long addr;
-	unsigned long *sp = (unsigned long *)(regs->regs[3] & ~3);
+	struct unwind_state state;
+	struct pt_regs *pregs = (struct pt_regs *)regs;
+
+	if (!task)
+		task = current;
+
+	unwind_start(&state, task, pregs);
 
 	printk("%sCall Trace:", loglvl);
-#ifdef CONFIG_KALLSYMS
-	printk("%s\n", loglvl);
-#endif
-	while (!kstack_end(sp)) {
-		if (__get_addr(&addr, sp++, user)) {
-			printk("%s (Bad stack address)", loglvl);
-			break;
-		}
-		if (__kernel_text_address(addr))
-			print_ip_sym(loglvl, addr);
+	for (; !unwind_done(&state); unwind_next_frame(&state)) {
+		addr = unwind_get_return_address(&state);
+		print_ip_sym(loglvl, addr);
 	}
 	printk("%s\n", loglvl);
 }
diff --git a/arch/loongarch/kernel/unwind_guess.c b/arch/loongarch/kernel/unwind_guess.c
new file mode 100644
index 000000000000..7eeb3e1a989d
--- /dev/null
+++ b/arch/loongarch/kernel/unwind_guess.c
@@ -0,0 +1,65 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2022 Loongson Technology Corporation Limited
+ */
+#include <linux/kernel.h>
+
+#include <asm/unwind.h>
+
+unsigned long unwind_get_return_address(struct unwind_state *state)
+{
+	if (unwind_done(state))
+		return 0;
+	else if (state->first)
+		return state->pc;
+
+	return *(unsigned long *)(state->sp);
+}
+EXPORT_SYMBOL_GPL(unwind_get_return_address);
+
+bool unwind_next_frame(struct unwind_state *state)
+{
+	struct stack_info *info = &state->stack_info;
+	unsigned long addr;
+
+	if (unwind_done(state))
+		return false;
+
+	if (state->first)
+		state->first = false;
+
+	do {
+		for (state->sp += sizeof(unsigned long);
+		     state->sp < info->end;
+		     state->sp += sizeof(unsigned long)) {
+			addr = *(unsigned long *)(state->sp);
+
+			if (__kernel_text_address(addr))
+				return true;
+		}
+
+		state->sp = info->next_sp;
+
+	} while (!get_stack_info(state->sp, state->task, info));
+
+	return false;
+}
+EXPORT_SYMBOL_GPL(unwind_next_frame);
+
+void unwind_start(struct unwind_state *state, struct task_struct *task,
+		    struct pt_regs *regs)
+{
+	memset(state, 0, sizeof(*state));
+
+	state->task = task;
+
+	state->sp = regs->regs[3];
+	state->pc = regs->csr_era;
+	state->first = true;
+
+	get_stack_info(state->sp, state->task, &state->stack_info);
+
+	if (!unwind_done(state) && !__kernel_text_address(state->pc))
+		unwind_next_frame(state);
+}
+EXPORT_SYMBOL_GPL(unwind_start);
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 2/3] LoongArch: Add prologue unwinder support
  2022-07-28 14:05 [PATCH 1/3] LoongArch: Add guess unwinder support Qing Zhang
@ 2022-07-28 14:05 ` Qing Zhang
  2022-07-29  2:03   ` Youling Tang
  2022-07-29  2:14   ` Jinyang He
  2022-07-28 14:05 ` [PATCH 3/3] LoongArch: Add stacktrace support Qing Zhang
  2022-07-29  2:01 ` [PATCH 1/3] LoongArch: Add guess unwinder support Youling Tang
  2 siblings, 2 replies; 15+ messages in thread
From: Qing Zhang @ 2022-07-28 14:05 UTC (permalink / raw)
  To: Huacai Chen, WANG Xuerui; +Cc: loongarch, linux-kernel, Jiaxun Yang, hejinyang

It unwind the stack frame based on prologue code analyze.
CONFIG_KALLSYMS is needed, at least the address and length
of each function.

Three stages when we do unwind,
  (1)unwind_start(), the prapare of unwinding, fill unwind_state.
  (2)unwind_done(), judge whether the unwind process is finished or not.
  (3)unwind_next_frame(), unwind the next frame.

Dividing unwinder helps to add new unwinders in the future, eg:
unwind_frame, unwind_orc .etc

Signed-off-by: Qing Zhang <zhangqing@loongson.cn>

diff --git a/arch/loongarch/Kconfig.debug b/arch/loongarch/Kconfig.debug
index 68634d4fa27b..57cdbe0cfd98 100644
--- a/arch/loongarch/Kconfig.debug
+++ b/arch/loongarch/Kconfig.debug
@@ -1,3 +1,11 @@
+choice
+	prompt "Choose kernel unwinder"
+	default UNWINDER_PROLOGUE if KALLSYMS
+	help
+	  This determines which method will be used for unwinding kernel stack
+	  traces for panics, oopses, bugs, warnings, perf, /proc/<pid>/stack,
+	  lockdep, and more.
+
 config UNWINDER_GUESS
 	bool "Guess unwinder"
 	help
@@ -7,3 +15,14 @@ config UNWINDER_GUESS
 
 	  While this option often produces false positives, it can still be
 	  useful in many cases.
+
+config UNWINDER_PROLOGUE
+	bool "Prologue unwinder"
+	depends on KALLSYMS
+	help
+	  This option enables the "prologue" unwinder for unwinding kernel stack
+	  traces.  It unwind the stack frame based on prologue code analyze.  Symbol
+	  information is needed, at least the address and length of each function.
+	  Some of the addresses it reports may be incorrect.
+
+endchoice
diff --git a/arch/loongarch/include/asm/inst.h b/arch/loongarch/include/asm/inst.h
index 575d1bb66ffb..bd684cff4008 100644
--- a/arch/loongarch/include/asm/inst.h
+++ b/arch/loongarch/include/asm/inst.h
@@ -23,12 +23,33 @@ enum reg1i20_op {
 	lu32id_op	= 0x0b,
 };
 
+enum reg1i21_op {
+	beqz_op		= 0x10,
+	bnez_op		= 0x11,
+};
+
 enum reg2i12_op {
+	addiw_op	= 0x0a,
+	addid_op	= 0x0b,
 	lu52id_op	= 0x0c,
+	ldb_op		= 0xa0,
+	ldh_op		= 0xa1,
+	ldw_op		= 0xa2,
+	ldd_op		= 0xa3,
+	stb_op		= 0xa4,
+	sth_op		= 0xa5,
+	stw_op		= 0xa6,
+	std_op		= 0xa7,
 };
 
 enum reg2i16_op {
 	jirl_op		= 0x13,
+	beq_op		= 0x16,
+	bne_op		= 0x17,
+	blt_op		= 0x18,
+	bge_op		= 0x19,
+	bltu_op		= 0x1a,
+	bgeu_op		= 0x1b,
 };
 
 struct reg0i26_format {
@@ -110,6 +131,29 @@ enum loongarch_gpr {
 	LOONGARCH_GPR_MAX
 };
 
+static inline bool is_stack_alloc_ins(union loongarch_instruction *ip)
+{
+	/* addi.d $sp, $sp, -imm */
+	return ip->reg2i12_format.opcode == addid_op &&
+		ip->reg2i12_format.rj == LOONGARCH_GPR_SP &&
+		ip->reg2i12_format.rd == LOONGARCH_GPR_SP &&
+		ip->reg2i12_format.immediate & (1 << 11);
+}
+
+static inline bool is_ra_save_ins(union loongarch_instruction *ip)
+{
+	/* st.d $ra, $sp, offset */
+	return ip->reg2i12_format.opcode == std_op &&
+		ip->reg2i12_format.rj == LOONGARCH_GPR_SP &&
+		ip->reg2i12_format.rd == LOONGARCH_GPR_RA;
+}
+
+static inline bool is_branch_insn(union loongarch_instruction insn)
+{
+	return insn.reg1i21_format.opcode >= beqz_op &&
+			insn.reg1i21_format.opcode <= bgeu_op;
+}
+
 u32 larch_insn_gen_lu32id(enum loongarch_gpr rd, int imm);
 u32 larch_insn_gen_lu52id(enum loongarch_gpr rd, enum loongarch_gpr rj, int imm);
 u32 larch_insn_gen_jirl(enum loongarch_gpr rd, enum loongarch_gpr rj, unsigned long pc, unsigned long dest);
diff --git a/arch/loongarch/include/asm/unwind.h b/arch/loongarch/include/asm/unwind.h
index 243330b39d0d..09394e536ea9 100644
--- a/arch/loongarch/include/asm/unwind.h
+++ b/arch/loongarch/include/asm/unwind.h
@@ -14,6 +14,10 @@
 struct unwind_state {
 	struct stack_info stack_info;
 	struct task_struct *task;
+#if defined(CONFIG_UNWINDER_PROLOGUE)
+	unsigned long ra;
+	bool enable;
+#endif
 	unsigned long sp, pc;
 	bool first;
 	bool error;
diff --git a/arch/loongarch/kernel/Makefile b/arch/loongarch/kernel/Makefile
index c5fa4adb23b6..918600e7b30f 100644
--- a/arch/loongarch/kernel/Makefile
+++ b/arch/loongarch/kernel/Makefile
@@ -23,5 +23,6 @@ obj-$(CONFIG_SMP)		+= smp.o
 obj-$(CONFIG_NUMA)		+= numa.o
 
 obj-$(CONFIG_UNWINDER_GUESS)	+= unwind_guess.o
+obj-$(CONFIG_UNWINDER_PROLOGUE) += unwind_prologue.o
 
 CPPFLAGS_vmlinux.lds		:= $(KBUILD_CFLAGS)
diff --git a/arch/loongarch/kernel/traps.c b/arch/loongarch/kernel/traps.c
index ef2c3aeb1dab..3e904fa12d48 100644
--- a/arch/loongarch/kernel/traps.c
+++ b/arch/loongarch/kernel/traps.c
@@ -73,6 +73,11 @@ static void show_backtrace(struct task_struct *task, const struct pt_regs *regs,
 
 	unwind_start(&state, task, pregs);
 
+#ifdef CONFIG_UNWINDER_PROLOGUE
+	if (user_mode(regs))
+		state.enable = false;
+#endif
+
 	printk("%sCall Trace:", loglvl);
 	for (; !unwind_done(&state); unwind_next_frame(&state)) {
 		addr = unwind_get_return_address(&state);
diff --git a/arch/loongarch/kernel/unwind_prologue.c b/arch/loongarch/kernel/unwind_prologue.c
new file mode 100644
index 000000000000..6539c9e98364
--- /dev/null
+++ b/arch/loongarch/kernel/unwind_prologue.c
@@ -0,0 +1,174 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2022 Loongson Technology Corporation Limited
+ */
+#include <linux/kallsyms.h>
+
+#include <asm/inst.h>
+#include <asm/ptrace.h>
+#include <asm/unwind.h>
+
+unsigned long unwind_get_return_address(struct unwind_state *state)
+{
+
+	if (unwind_done(state))
+		return 0;
+
+	if (state->enable)
+		return state->pc;
+	else if (state->first)
+		return state->pc;
+
+	return *(unsigned long *)(state->sp);
+
+}
+EXPORT_SYMBOL_GPL(unwind_get_return_address);
+
+static bool unwind_by_prologue(struct unwind_state *state)
+{
+	struct stack_info *info = &state->stack_info;
+	union loongarch_instruction *ip, *ip_end;
+	unsigned long frame_size = 0, frame_ra = -1;
+	unsigned long size, offset, pc = state->pc;
+
+	if (state->sp >= info->end || state->sp < info->begin)
+		return false;
+
+	if (!kallsyms_lookup_size_offset(pc, &size, &offset))
+		return false;
+
+	ip = (union loongarch_instruction *)(pc - offset);
+	ip_end = (union loongarch_instruction *)pc;
+
+	while (ip < ip_end) {
+		if (is_stack_alloc_ins(ip)) {
+			frame_size = (1 << 12) - ip->reg2i12_format.immediate;
+			ip++;
+			break;
+		}
+		ip++;
+	}
+
+	if (!frame_size) {
+		if (state->first)
+			goto first;
+
+		return false;
+	}
+
+	while (ip < ip_end) {
+		if (is_ra_save_ins(ip)) {
+			frame_ra = ip->reg2i12_format.immediate;
+			break;
+		}
+		if (is_branch_insn(*ip))
+			break;
+		ip++;
+	}
+
+	if (frame_ra < 0) {
+		if (state->first) {
+			state->sp = state->sp + frame_size;
+			goto first;
+		}
+		return false;
+	}
+
+	if (state->first)
+		state->first = false;
+
+	state->pc = *(unsigned long *)(state->sp + frame_ra);
+	state->sp = state->sp + frame_size;
+	return !!__kernel_text_address(state->pc);
+
+first:
+	state->first = false;
+	if (state->pc == state->ra)
+		return false;
+
+	state->pc = state->ra;
+
+	return !!__kernel_text_address(state->ra);
+}
+
+static bool unwind_by_guess(struct unwind_state *state)
+{
+	struct stack_info *info = &state->stack_info;
+	unsigned long addr;
+
+	for (state->sp += sizeof(unsigned long);
+	     state->sp < info->end;
+	     state->sp += sizeof(unsigned long)) {
+		addr = *(unsigned long *)(state->sp);
+		if (__kernel_text_address(addr))
+			return true;
+	}
+
+	return false;
+}
+
+bool unwind_next_frame(struct unwind_state *state)
+{
+	struct stack_info *info = &state->stack_info;
+	struct pt_regs *regs;
+	unsigned long pc;
+
+	if (unwind_done(state))
+		return false;
+
+	do {
+		if (state->enable) {
+			if (unwind_by_prologue(state))
+				return true;
+
+			if (info->type == STACK_TYPE_IRQ &&
+				info->end == state->sp) {
+				regs = (struct pt_regs *)info->next_sp;
+				pc = regs->csr_era;
+				if (user_mode(regs) || !__kernel_text_address(pc))
+					return false;
+
+				state->pc = pc;
+				state->sp = regs->regs[3];
+				state->ra = regs->regs[1];
+				state->first = true;
+				get_stack_info(state->sp, state->task, info);
+
+				return true;
+			}
+		} else {
+			if (state->first)
+				state->first = false;
+
+			if (unwind_by_guess(state))
+				return true;
+		}
+
+		state->sp = info->next_sp;
+
+	} while (!get_stack_info(state->sp, state->task, info));
+
+	return false;
+}
+EXPORT_SYMBOL_GPL(unwind_next_frame);
+
+void unwind_start(struct unwind_state *state, struct task_struct *task,
+		    struct pt_regs *regs)
+{
+	memset(state, 0, sizeof(*state));
+
+	if (__kernel_text_address(regs->csr_era))
+		state->enable = true;
+
+	state->task = task;
+	state->pc = regs->csr_era;
+	state->sp = regs->regs[3];
+	state->ra = regs->regs[1];
+	state->first = true;
+
+	get_stack_info(state->sp, state->task, &state->stack_info);
+
+	if (!unwind_done(state) && !__kernel_text_address(state->pc))
+		unwind_next_frame(state);
+}
+EXPORT_SYMBOL_GPL(unwind_start);
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 3/3] LoongArch: Add stacktrace support
  2022-07-28 14:05 [PATCH 1/3] LoongArch: Add guess unwinder support Qing Zhang
  2022-07-28 14:05 ` [PATCH 2/3] LoongArch: Add prologue " Qing Zhang
@ 2022-07-28 14:05 ` Qing Zhang
  2022-07-29  2:13   ` Youling Tang
                     ` (4 more replies)
  2022-07-29  2:01 ` [PATCH 1/3] LoongArch: Add guess unwinder support Youling Tang
  2 siblings, 5 replies; 15+ messages in thread
From: Qing Zhang @ 2022-07-28 14:05 UTC (permalink / raw)
  To: Huacai Chen, WANG Xuerui; +Cc: loongarch, linux-kernel, Jiaxun Yang, hejinyang

Use common arch_stack_walk infrastructure to avoid duplicated code and
avoid taking care of the stack storage and filtering.
Add sra (means __schedule return address) and scfa (means __schedule call
frame address) to thread_info and store it in switch_to().

Now we can print the process stack by cat /proc/*/stack and can better
support ftrace.

Signed-off-by: Qing Zhang <zhangqing@loongson.cn>

diff --git a/arch/loongarch/Kconfig b/arch/loongarch/Kconfig
index b57daee98b89..1bd656285674 100644
--- a/arch/loongarch/Kconfig
+++ b/arch/loongarch/Kconfig
@@ -38,6 +38,7 @@ config LOONGARCH
 	select ARCH_INLINE_SPIN_UNLOCK_IRQRESTORE if !PREEMPTION
 	select ARCH_MIGHT_HAVE_PC_PARPORT
 	select ARCH_MIGHT_HAVE_PC_SERIO
+	select ARCH_STACKWALK
 	select ARCH_SPARSEMEM_ENABLE
 	select ARCH_SUPPORTS_ACPI
 	select ARCH_SUPPORTS_ATOMIC_RMW
@@ -141,6 +142,10 @@ config LOCKDEP_SUPPORT
 	bool
 	default y
 
+config STACKTRACE_SUPPORT
+	bool
+	default y
+
 # MACH_LOONGSON32 and MACH_LOONGSON64 are delibrately carried over from the
 # MIPS Loongson code, to preserve Loongson-specific code paths in drivers that
 # are shared between architectures, and specifically expecting the symbols.
diff --git a/arch/loongarch/include/asm/processor.h b/arch/loongarch/include/asm/processor.h
index 57ec45aa078e..1c4b4308378d 100644
--- a/arch/loongarch/include/asm/processor.h
+++ b/arch/loongarch/include/asm/processor.h
@@ -101,6 +101,10 @@ struct thread_struct {
 	unsigned long reg23, reg24, reg25, reg26; /* s0-s3 */
 	unsigned long reg27, reg28, reg29, reg30, reg31; /* s4-s8 */
 
+	/* __schedule() return address / call frame address */
+	unsigned long sched_ra;
+	unsigned long sched_cfa;
+
 	/* CSR registers */
 	unsigned long csr_prmd;
 	unsigned long csr_crmd;
@@ -129,6 +133,9 @@ struct thread_struct {
 	struct loongarch_fpu fpu FPU_ALIGN;
 };
 
+#define thread_saved_ra(tsk)	(tsk->thread.sched_ra)
+#define thread_saved_fp(tsk)	(tsk->thread.sched_cfa)
+
 #define INIT_THREAD  {						\
 	/*							\
 	 * Main processor registers				\
@@ -145,6 +152,8 @@ struct thread_struct {
 	.reg29			= 0,				\
 	.reg30			= 0,				\
 	.reg31			= 0,				\
+	.sched_ra		= 0,				\
+	.sched_cfa		= 0,				\
 	.csr_crmd		= 0,				\
 	.csr_prmd		= 0,				\
 	.csr_euen		= 0,				\
diff --git a/arch/loongarch/include/asm/switch_to.h b/arch/loongarch/include/asm/switch_to.h
index 2a8d04375574..836cfcc19498 100644
--- a/arch/loongarch/include/asm/switch_to.h
+++ b/arch/loongarch/include/asm/switch_to.h
@@ -15,12 +15,15 @@ struct task_struct;
  * @prev:	The task previously executed.
  * @next:	The task to begin executing.
  * @next_ti:	task_thread_info(next).
+ * @sched_ra:	__schedule return address.
+ * @sched_cfa:	__schedule call frame address.
  *
  * This function is used whilst scheduling to save the context of prev & load
  * the context of next. Returns prev.
  */
 extern asmlinkage struct task_struct *__switch_to(struct task_struct *prev,
-			struct task_struct *next, struct thread_info *next_ti);
+			struct task_struct *next, struct thread_info *next_ti,
+			void *sched_ra, void *sched_cfa);
 
 /*
  * For newly created kernel threads switch_to() will return to
@@ -31,7 +34,8 @@ extern asmlinkage struct task_struct *__switch_to(struct task_struct *prev,
 #define switch_to(prev, next, last)					\
 do {									\
 	lose_fpu_inatomic(1, prev);					\
-	(last) = __switch_to(prev, next, task_thread_info(next));	\
+	(last) = __switch_to(prev, next, task_thread_info(next),	\
+		 __builtin_return_address(0), __builtin_frame_address(0)); \
 } while (0)
 
 #endif /* _ASM_SWITCH_TO_H */
diff --git a/arch/loongarch/kernel/Makefile b/arch/loongarch/kernel/Makefile
index 918600e7b30f..7449513eb08d 100644
--- a/arch/loongarch/kernel/Makefile
+++ b/arch/loongarch/kernel/Makefile
@@ -15,6 +15,7 @@ obj-$(CONFIG_EFI) 		+= efi.o
 obj-$(CONFIG_CPU_HAS_FPU)	+= fpu.o
 
 obj-$(CONFIG_MODULES)		+= module.o module-sections.o
+obj-$(CONFIG_STACKTRACE)        += stacktrace.o
 
 obj-$(CONFIG_PROC_FS)		+= proc.o
 
diff --git a/arch/loongarch/kernel/asm-offsets.c b/arch/loongarch/kernel/asm-offsets.c
index 20cd9e16a95a..eb350f3ffae5 100644
--- a/arch/loongarch/kernel/asm-offsets.c
+++ b/arch/loongarch/kernel/asm-offsets.c
@@ -103,6 +103,8 @@ void output_thread_defines(void)
 	OFFSET(THREAD_REG29, task_struct, thread.reg29);
 	OFFSET(THREAD_REG30, task_struct, thread.reg30);
 	OFFSET(THREAD_REG31, task_struct, thread.reg31);
+	OFFSET(THREAD_SCHED_RA, task_struct, thread.sched_ra);
+	OFFSET(THREAD_SCHED_CFA, task_struct, thread.sched_cfa);
 	OFFSET(THREAD_CSRCRMD, task_struct,
 	       thread.csr_crmd);
 	OFFSET(THREAD_CSRPRMD, task_struct,
diff --git a/arch/loongarch/kernel/process.c b/arch/loongarch/kernel/process.c
index 709b7a1664f8..34c3f2148714 100644
--- a/arch/loongarch/kernel/process.c
+++ b/arch/loongarch/kernel/process.c
@@ -135,6 +135,7 @@ int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
 	childregs = (struct pt_regs *) childksp - 1;
 	/*  Put the stack after the struct pt_regs.  */
 	childksp = (unsigned long) childregs;
+	p->thread.sched_cfa = 0;
 	p->thread.csr_euen = 0;
 	p->thread.csr_crmd = csr_read32(LOONGARCH_CSR_CRMD);
 	p->thread.csr_prmd = csr_read32(LOONGARCH_CSR_PRMD);
@@ -145,6 +146,7 @@ int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
 		p->thread.reg23 = (unsigned long)args->fn;
 		p->thread.reg24 = (unsigned long)args->fn_arg;
 		p->thread.reg01 = (unsigned long)ret_from_kernel_thread;
+		p->thread.sched_ra = (unsigned long)ret_from_kernel_thread;
 		memset(childregs, 0, sizeof(struct pt_regs));
 		childregs->csr_euen = p->thread.csr_euen;
 		childregs->csr_crmd = p->thread.csr_crmd;
@@ -161,6 +163,7 @@ int copy_thread(struct task_struct *p, const struct kernel_clone_args *args)
 
 	p->thread.reg03 = (unsigned long) childregs;
 	p->thread.reg01 = (unsigned long) ret_from_fork;
+	p->thread.sched_ra = (unsigned long) ret_from_fork;
 
 	/*
 	 * New tasks lose permission to use the fpu. This accelerates context
diff --git a/arch/loongarch/kernel/stacktrace.c b/arch/loongarch/kernel/stacktrace.c
new file mode 100644
index 000000000000..f4f4b8ad3917
--- /dev/null
+++ b/arch/loongarch/kernel/stacktrace.c
@@ -0,0 +1,37 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Stack trace management functions
+ *
+ * Copyright (C) 2022 Loongson Technology Corporation Limited
+ */
+#include <linux/sched.h>
+#include <linux/stacktrace.h>
+
+#include <asm/stacktrace.h>
+#include <asm/unwind.h>
+
+void arch_stack_walk(stack_trace_consume_fn consume_entry, void *cookie,
+		     struct task_struct *task, struct pt_regs *regs)
+{
+	struct pt_regs dummyregs;
+	struct unwind_state state;
+	unsigned long addr;
+
+	regs = &dummyregs;
+
+	if (task == current) {
+		regs->csr_era = (unsigned long)__builtin_return_address(0);
+		regs->regs[3] = (unsigned long)__builtin_frame_address(0);
+	} else {
+		regs->csr_era = thread_saved_ra(task);
+		regs->regs[3] = thread_saved_fp(task);
+	}
+
+	regs->regs[1] = 0;
+	for (unwind_start(&state, task, regs);
+	      !unwind_done(&state); unwind_next_frame(&state)) {
+		addr = unwind_get_return_address(&state);
+		if (!addr || !consume_entry(cookie, addr))
+			break;
+	}
+}
diff --git a/arch/loongarch/kernel/switch.S b/arch/loongarch/kernel/switch.S
index 53e2fa8e580e..03d8c7add68f 100644
--- a/arch/loongarch/kernel/switch.S
+++ b/arch/loongarch/kernel/switch.S
@@ -21,6 +21,8 @@ SYM_FUNC_START(__switch_to)
 
 	cpu_save_nonscratch a0
 	stptr.d	ra, a0, THREAD_REG01
+	stptr.d a3, a0, THREAD_SCHED_RA
+	stptr.d a4, a0, THREAD_SCHED_CFA
 	move	tp, a2
 	cpu_restore_nonscratch a1
 
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [PATCH 1/3] LoongArch: Add guess unwinder support
  2022-07-28 14:05 [PATCH 1/3] LoongArch: Add guess unwinder support Qing Zhang
  2022-07-28 14:05 ` [PATCH 2/3] LoongArch: Add prologue " Qing Zhang
  2022-07-28 14:05 ` [PATCH 3/3] LoongArch: Add stacktrace support Qing Zhang
@ 2022-07-29  2:01 ` Youling Tang
  2022-07-29  2:28   ` Jinyang He
  2 siblings, 1 reply; 15+ messages in thread
From: Youling Tang @ 2022-07-29  2:01 UTC (permalink / raw)
  To: Qing Zhang, Huacai Chen
  Cc: WANG Xuerui, loongarch, linux-kernel, Jiaxun Yang, hejinyang

Hi, Qing

On 07/28/2022 10:05 PM, Qing Zhang wrote:
> Name "guess unwinder" comes from x86, It scans the stack and reports
> every kernel text address it finds.
>
> Three stages when we do unwind,
>   (1)unwind_start(), the prapare of unwinding, fill unwind_state.
>   (2)unwind_done(), judge whether the unwind process is finished or not.
>   (3)unwind_next_frame(), unwind the next frame.
>
> Make the dump_stack process go through unwind process.
> Add get_stack_info() to get stack info. At present we have irq stack and
> task stack. Maybe add another type in future. The next_sp means the key
> info between this type stack and next type stack.
>
> Dividing unwinder helps to add new unwinders in the future.
>
> Signed-off-by: Qing Zhang <zhangqing@loongson.cn>
>
> diff --git a/arch/loongarch/Kconfig.debug b/arch/loongarch/Kconfig.debug
> index e69de29bb2d1..68634d4fa27b 100644
> --- a/arch/loongarch/Kconfig.debug
> +++ b/arch/loongarch/Kconfig.debug
> @@ -0,0 +1,9 @@
> +config UNWINDER_GUESS
> +	bool "Guess unwinder"
> +	help
> +	  This option enables the "guess" unwinder for unwinding kernel stack
> +	  traces.  It scans the stack and reports every kernel text address it
> +	  finds.  Some of the addresses it reports may be incorrect.
> +
> +	  While this option often produces false positives, it can still be
> +	  useful in many cases.
> diff --git a/arch/loongarch/include/asm/stacktrace.h b/arch/loongarch/include/asm/stacktrace.h
> index 26483e396ad1..33077010356d 100644
> --- a/arch/loongarch/include/asm/stacktrace.h
> +++ b/arch/loongarch/include/asm/stacktrace.h
> @@ -10,6 +10,23 @@
>  #include <asm/loongarch.h>
>  #include <linux/stringify.h>
>
> +enum stack_type {
> +	STACK_TYPE_UNKNOWN,
> +	STACK_TYPE_TASK,
> +	STACK_TYPE_IRQ,
> +};
> +
> +struct stack_info {
> +	enum stack_type type;
> +	unsigned long begin, end, next_sp;
> +};
> +
> +bool in_task_stack(unsigned long stack, struct task_struct *task,
> +			struct stack_info *info);
> +bool in_irq_stack(unsigned long stack, struct stack_info *info);
> +int get_stack_info(unsigned long stack, struct task_struct *task,
> +			struct stack_info *info);
> +
>  #define STR_LONG_L    __stringify(LONG_L)
>  #define STR_LONG_S    __stringify(LONG_S)
>  #define STR_LONGSIZE  __stringify(LONGSIZE)
> diff --git a/arch/loongarch/include/asm/unwind.h b/arch/loongarch/include/asm/unwind.h
> new file mode 100644
> index 000000000000..243330b39d0d
> --- /dev/null
> +++ b/arch/loongarch/include/asm/unwind.h
> @@ -0,0 +1,37 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +/*
> + * Most of this ideas comes from x86.
> + *
> + * Copyright (C) 2022 Loongson Technology Corporation Limited
> + */
> +#ifndef _ASM_UNWIND_H
> +#define _ASM_UNWIND_H
> +
> +#include <linux/sched.h>
> +
> +#include <asm/stacktrace.h>
> +
> +struct unwind_state {
> +	struct stack_info stack_info;
> +	struct task_struct *task;
> +	unsigned long sp, pc;
> +	bool first;
> +	bool error;
> +};
> +
> +void unwind_start(struct unwind_state *state, struct task_struct *task,
> +		      struct pt_regs *regs);
> +bool unwind_next_frame(struct unwind_state *state);
> +unsigned long unwind_get_return_address(struct unwind_state *state);
> +
> +static inline bool unwind_done(struct unwind_state *state)
> +{
> +	return state->stack_info.type == STACK_TYPE_UNKNOWN;
> +}
> +
> +static inline bool unwind_error(struct unwind_state *state)
> +{
> +	return state->error;
> +}
> +
> +#endif /* _ASM_UNWIND_H */
> diff --git a/arch/loongarch/kernel/Makefile b/arch/loongarch/kernel/Makefile
> index 940de9173542..c5fa4adb23b6 100644
> --- a/arch/loongarch/kernel/Makefile
> +++ b/arch/loongarch/kernel/Makefile
> @@ -22,4 +22,6 @@ obj-$(CONFIG_SMP)		+= smp.o
>
>  obj-$(CONFIG_NUMA)		+= numa.o
>
> +obj-$(CONFIG_UNWINDER_GUESS)	+= unwind_guess.o
> +
>  CPPFLAGS_vmlinux.lds		:= $(KBUILD_CFLAGS)
> diff --git a/arch/loongarch/kernel/process.c b/arch/loongarch/kernel/process.c
> index bfa0dfe8b7d7..709b7a1664f8 100644
> --- a/arch/loongarch/kernel/process.c
> +++ b/arch/loongarch/kernel/process.c
> @@ -44,6 +44,7 @@
>  #include <asm/pgtable.h>
>  #include <asm/processor.h>
>  #include <asm/reg.h>
> +#include <asm/unwind.h>
>  #include <asm/vdso.h>
>
>  /*
> @@ -183,6 +184,66 @@ unsigned long __get_wchan(struct task_struct *task)
>  	return 0;
>  }
>
> +bool in_task_stack(unsigned long stack, struct task_struct *task,
> +			struct stack_info *info)
> +{
> +	unsigned long begin = (unsigned long)task_stack_page(task);
> +	unsigned long end = begin + THREAD_SIZE - 32;
> +
> +	if (stack < begin || stack >= end)
> +		return false;
> +
> +	info->type = STACK_TYPE_TASK;
> +	info->begin = begin;
> +	info->end = end;
> +	info->next_sp = 0;
> +
> +	return true;
> +}
> +
> +bool in_irq_stack(unsigned long stack, struct stack_info *info)
> +{
> +	unsigned long nextsp;
> +	unsigned long begin = (unsigned long)this_cpu_read(irq_stack);
> +	unsigned long end = begin + IRQ_STACK_START;
> +
> +	if (stack < begin || stack >= end)
> +		return false;
> +
> +	nextsp = *(unsigned long *)end;
> +	if (nextsp & (SZREG - 1))
> +		return false;
> +
> +	info->type = STACK_TYPE_IRQ;
> +	info->begin = begin;
> +	info->end = end;
> +	info->next_sp = nextsp;
> +
> +	return true;
> +}
> +
> +int get_stack_info(unsigned long stack, struct task_struct *task,
> +		   struct stack_info *info)
> +{
> +	task = task ? : current;
> +
> +	if (!stack || stack & (SZREG - 1))
> +		goto unknown;
> +
> +	if (in_task_stack(stack, task, info))
> +		return 0;
> +
> +	if (task != current)
> +		goto unknown;
> +
> +	if (in_irq_stack(stack, info))
> +		return 0;
> +
> +unknown:
> +	info->type = STACK_TYPE_UNKNOWN;
> +	return -EINVAL;
> +}
> +
>  unsigned long stack_top(void)
>  {
>  	unsigned long top = TASK_SIZE & PAGE_MASK;
> diff --git a/arch/loongarch/kernel/traps.c b/arch/loongarch/kernel/traps.c
> index 1bf58c65e2bf..ef2c3aeb1dab 100644
> --- a/arch/loongarch/kernel/traps.c
> +++ b/arch/loongarch/kernel/traps.c
> @@ -43,6 +43,7 @@
>  #include <asm/stacktrace.h>
>  #include <asm/tlb.h>
>  #include <asm/types.h>
> +#include <asm/unwind.h>
>
>  #include "access-helper.h"
>
> @@ -64,19 +65,18 @@ static void show_backtrace(struct task_struct *task, const struct pt_regs *regs,
>  			   const char *loglvl, bool user)
>  {
>  	unsigned long addr;
> -	unsigned long *sp = (unsigned long *)(regs->regs[3] & ~3);
> +	struct unwind_state state;
> +	struct pt_regs *pregs = (struct pt_regs *)regs;
> +
> +	if (!task)
> +		task = current;
> +
> +	unwind_start(&state, task, pregs);
>
>  	printk("%sCall Trace:", loglvl);
> -#ifdef CONFIG_KALLSYMS
> -	printk("%s\n", loglvl);
> -#endif
> -	while (!kstack_end(sp)) {
> -		if (__get_addr(&addr, sp++, user)) {
> -			printk("%s (Bad stack address)", loglvl);
> -			break;
> -		}
> -		if (__kernel_text_address(addr))
> -			print_ip_sym(loglvl, addr);
> +	for (; !unwind_done(&state); unwind_next_frame(&state)) {
> +		addr = unwind_get_return_address(&state);
> +		print_ip_sym(loglvl, addr);
>  	}
>  	printk("%s\n", loglvl);
>  }
> diff --git a/arch/loongarch/kernel/unwind_guess.c b/arch/loongarch/kernel/unwind_guess.c
> new file mode 100644
> index 000000000000..7eeb3e1a989d
> --- /dev/null
> +++ b/arch/loongarch/kernel/unwind_guess.c
> @@ -0,0 +1,65 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Copyright (C) 2022 Loongson Technology Corporation Limited
> + */
> +#include <linux/kernel.h>
> +
> +#include <asm/unwind.h>
> +
> +unsigned long unwind_get_return_address(struct unwind_state *state)
> +{
> +	if (unwind_done(state))
> +		return 0;
This judgment can be removed, because unwind_done() has been judged
before entering this function, and unwind_get_return_address will not
be called if it is true.

> +	else if (state->first)
> +		return state->pc;
> +
> +	return *(unsigned long *)(state->sp);
> +}
> +EXPORT_SYMBOL_GPL(unwind_get_return_address);
> +
> +bool unwind_next_frame(struct unwind_state *state)
> +{
> +	struct stack_info *info = &state->stack_info;
> +	unsigned long addr;
> +
> +	if (unwind_done(state))
> +		return false;
> +
Can be removed as above.

Thanks,
Youling
> +	if (state->first)
> +		state->first = false;
> +
> +	do {
> +		for (state->sp += sizeof(unsigned long);
> +		     state->sp < info->end;
> +		     state->sp += sizeof(unsigned long)) {
> +			addr = *(unsigned long *)(state->sp);
> +
> +			if (__kernel_text_address(addr))
> +				return true;
> +		}
> +
> +		state->sp = info->next_sp;
> +
> +	} while (!get_stack_info(state->sp, state->task, info));
> +
> +	return false;
> +}
> +EXPORT_SYMBOL_GPL(unwind_next_frame);
> +
> +void unwind_start(struct unwind_state *state, struct task_struct *task,
> +		    struct pt_regs *regs)
> +{
> +	memset(state, 0, sizeof(*state));
> +
> +	state->task = task;
> +
> +	state->sp = regs->regs[3];
> +	state->pc = regs->csr_era;
> +	state->first = true;
> +
> +	get_stack_info(state->sp, state->task, &state->stack_info);
> +
> +	if (!unwind_done(state) && !__kernel_text_address(state->pc))
> +		unwind_next_frame(state);
> +}
> +EXPORT_SYMBOL_GPL(unwind_start);
>


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 2/3] LoongArch: Add prologue unwinder support
  2022-07-28 14:05 ` [PATCH 2/3] LoongArch: Add prologue " Qing Zhang
@ 2022-07-29  2:03   ` Youling Tang
  2022-07-29  5:38     ` zhangqing
  2022-07-29  2:14   ` Jinyang He
  1 sibling, 1 reply; 15+ messages in thread
From: Youling Tang @ 2022-07-29  2:03 UTC (permalink / raw)
  To: Qing Zhang, Huacai Chen
  Cc: WANG Xuerui, loongarch, linux-kernel, Jiaxun Yang, hejinyang



On 07/28/2022 10:05 PM, Qing Zhang wrote:
> It unwind the stack frame based on prologue code analyze.
> CONFIG_KALLSYMS is needed, at least the address and length
> of each function.
>
> Three stages when we do unwind,
>   (1)unwind_start(), the prapare of unwinding, fill unwind_state.
>   (2)unwind_done(), judge whether the unwind process is finished or not.
>   (3)unwind_next_frame(), unwind the next frame.
>
> Dividing unwinder helps to add new unwinders in the future, eg:
> unwind_frame, unwind_orc .etc
>
> Signed-off-by: Qing Zhang <zhangqing@loongson.cn>
>
> diff --git a/arch/loongarch/Kconfig.debug b/arch/loongarch/Kconfig.debug
> index 68634d4fa27b..57cdbe0cfd98 100644
> --- a/arch/loongarch/Kconfig.debug
> +++ b/arch/loongarch/Kconfig.debug
> @@ -1,3 +1,11 @@
> +choice
> +	prompt "Choose kernel unwinder"
> +	default UNWINDER_PROLOGUE if KALLSYMS
> +	help
> +	  This determines which method will be used for unwinding kernel stack
> +	  traces for panics, oopses, bugs, warnings, perf, /proc/<pid>/stack,
> +	  lockdep, and more.
> +
>  config UNWINDER_GUESS
>  	bool "Guess unwinder"
>  	help
> @@ -7,3 +15,14 @@ config UNWINDER_GUESS
>
>  	  While this option often produces false positives, it can still be
>  	  useful in many cases.
> +
> +config UNWINDER_PROLOGUE
> +	bool "Prologue unwinder"
> +	depends on KALLSYMS
> +	help
> +	  This option enables the "prologue" unwinder for unwinding kernel stack
> +	  traces.  It unwind the stack frame based on prologue code analyze.  Symbol
> +	  information is needed, at least the address and length of each function.
> +	  Some of the addresses it reports may be incorrect.
> +
> +endchoice
> diff --git a/arch/loongarch/include/asm/inst.h b/arch/loongarch/include/asm/inst.h
> index 575d1bb66ffb..bd684cff4008 100644
> --- a/arch/loongarch/include/asm/inst.h
> +++ b/arch/loongarch/include/asm/inst.h
> @@ -23,12 +23,33 @@ enum reg1i20_op {
>  	lu32id_op	= 0x0b,
>  };
>
> +enum reg1i21_op {
> +	beqz_op		= 0x10,
> +	bnez_op		= 0x11,
> +};
> +
>  enum reg2i12_op {
> +	addiw_op	= 0x0a,
> +	addid_op	= 0x0b,
>  	lu52id_op	= 0x0c,
> +	ldb_op		= 0xa0,
> +	ldh_op		= 0xa1,
> +	ldw_op		= 0xa2,
> +	ldd_op		= 0xa3,
> +	stb_op		= 0xa4,
> +	sth_op		= 0xa5,
> +	stw_op		= 0xa6,
> +	std_op		= 0xa7,
>  };
>
>  enum reg2i16_op {
>  	jirl_op		= 0x13,
> +	beq_op		= 0x16,
> +	bne_op		= 0x17,
> +	blt_op		= 0x18,
> +	bge_op		= 0x19,
> +	bltu_op		= 0x1a,
> +	bgeu_op		= 0x1b,
>  };
>
>  struct reg0i26_format {
> @@ -110,6 +131,29 @@ enum loongarch_gpr {
>  	LOONGARCH_GPR_MAX
>  };
>
> +static inline bool is_stack_alloc_ins(union loongarch_instruction *ip)
> +{
> +	/* addi.d $sp, $sp, -imm */
> +	return ip->reg2i12_format.opcode == addid_op &&
> +		ip->reg2i12_format.rj == LOONGARCH_GPR_SP &&
> +		ip->reg2i12_format.rd == LOONGARCH_GPR_SP &&
> +		ip->reg2i12_format.immediate & (1 << 11);
> +}
> +
> +static inline bool is_ra_save_ins(union loongarch_instruction *ip)
> +{
> +	/* st.d $ra, $sp, offset */
> +	return ip->reg2i12_format.opcode == std_op &&
> +		ip->reg2i12_format.rj == LOONGARCH_GPR_SP &&
> +		ip->reg2i12_format.rd == LOONGARCH_GPR_RA;
> +}
> +
> +static inline bool is_branch_insn(union loongarch_instruction insn)
> +{
> +	return insn.reg1i21_format.opcode >= beqz_op &&
> +			insn.reg1i21_format.opcode <= bgeu_op;
> +}
> +
>  u32 larch_insn_gen_lu32id(enum loongarch_gpr rd, int imm);
>  u32 larch_insn_gen_lu52id(enum loongarch_gpr rd, enum loongarch_gpr rj, int imm);
>  u32 larch_insn_gen_jirl(enum loongarch_gpr rd, enum loongarch_gpr rj, unsigned long pc, unsigned long dest);
> diff --git a/arch/loongarch/include/asm/unwind.h b/arch/loongarch/include/asm/unwind.h
> index 243330b39d0d..09394e536ea9 100644
> --- a/arch/loongarch/include/asm/unwind.h
> +++ b/arch/loongarch/include/asm/unwind.h
> @@ -14,6 +14,10 @@
>  struct unwind_state {
>  	struct stack_info stack_info;
>  	struct task_struct *task;
> +#if defined(CONFIG_UNWINDER_PROLOGUE)
> +	unsigned long ra;
> +	bool enable;
> +#endif
>  	unsigned long sp, pc;
>  	bool first;
>  	bool error;
> diff --git a/arch/loongarch/kernel/Makefile b/arch/loongarch/kernel/Makefile
> index c5fa4adb23b6..918600e7b30f 100644
> --- a/arch/loongarch/kernel/Makefile
> +++ b/arch/loongarch/kernel/Makefile
> @@ -23,5 +23,6 @@ obj-$(CONFIG_SMP)		+= smp.o
>  obj-$(CONFIG_NUMA)		+= numa.o
>
>  obj-$(CONFIG_UNWINDER_GUESS)	+= unwind_guess.o
> +obj-$(CONFIG_UNWINDER_PROLOGUE) += unwind_prologue.o
>
>  CPPFLAGS_vmlinux.lds		:= $(KBUILD_CFLAGS)
> diff --git a/arch/loongarch/kernel/traps.c b/arch/loongarch/kernel/traps.c
> index ef2c3aeb1dab..3e904fa12d48 100644
> --- a/arch/loongarch/kernel/traps.c
> +++ b/arch/loongarch/kernel/traps.c
> @@ -73,6 +73,11 @@ static void show_backtrace(struct task_struct *task, const struct pt_regs *regs,
>
>  	unwind_start(&state, task, pregs);
>
> +#ifdef CONFIG_UNWINDER_PROLOGUE
> +	if (user_mode(regs))
> +		state.enable = false;
> +#endif
> +
>  	printk("%sCall Trace:", loglvl);
>  	for (; !unwind_done(&state); unwind_next_frame(&state)) {
>  		addr = unwind_get_return_address(&state);
> diff --git a/arch/loongarch/kernel/unwind_prologue.c b/arch/loongarch/kernel/unwind_prologue.c
> new file mode 100644
> index 000000000000..6539c9e98364
> --- /dev/null
> +++ b/arch/loongarch/kernel/unwind_prologue.c
> @@ -0,0 +1,174 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Copyright (C) 2022 Loongson Technology Corporation Limited
> + */
> +#include <linux/kallsyms.h>
> +
> +#include <asm/inst.h>
> +#include <asm/ptrace.h>
> +#include <asm/unwind.h>
> +
> +unsigned long unwind_get_return_address(struct unwind_state *state)
> +{
> +
> +	if (unwind_done(state))
> +		return 0;
This judgment can be removed, because unwind_done() has been judged
before entering this function, and unwind_get_return_address will not
be called if it is true.

> +
> +	if (state->enable)
> +		return state->pc;
> +	else if (state->first)
> +		return state->pc;
> +
> +	return *(unsigned long *)(state->sp);
> +
> +}
> +EXPORT_SYMBOL_GPL(unwind_get_return_address);
> +
> +static bool unwind_by_prologue(struct unwind_state *state)
> +{
> +	struct stack_info *info = &state->stack_info;
> +	union loongarch_instruction *ip, *ip_end;
> +	unsigned long frame_size = 0, frame_ra = -1;
> +	unsigned long size, offset, pc = state->pc;
> +
> +	if (state->sp >= info->end || state->sp < info->begin)
> +		return false;
> +
> +	if (!kallsyms_lookup_size_offset(pc, &size, &offset))
> +		return false;
> +
> +	ip = (union loongarch_instruction *)(pc - offset);
> +	ip_end = (union loongarch_instruction *)pc;
> +
> +	while (ip < ip_end) {
> +		if (is_stack_alloc_ins(ip)) {
> +			frame_size = (1 << 12) - ip->reg2i12_format.immediate;
> +			ip++;
> +			break;
> +		}
> +		ip++;
> +	}
> +
> +	if (!frame_size) {
> +		if (state->first)
> +			goto first;
> +
> +		return false;
> +	}
> +
> +	while (ip < ip_end) {
> +		if (is_ra_save_ins(ip)) {
> +			frame_ra = ip->reg2i12_format.immediate;
Because the immediate member in struct reg2i12_format is defined as an
unsigned type, the value obtained by frame_ra here can only be a
positive number.

> +			break;
> +		}
> +		if (is_branch_insn(*ip))
> +			break;
> +		ip++;
> +	}
> +
> +	if (frame_ra < 0) {
In addition to judging whether the initial value of frame_ra is
negative, we also want to judge whether the previously assigned
frame_ra is negative.

Save the ra value to the stack in the prologue, offset must be a
positive number, so we can add another judgment to is_ra_save_ins, the
code is as follows:
+static inline bool is_ra_save_ins(union loongarch_instruction *ip)
+{
+	/* st.d $ra, $sp, offset */
+	return ip->reg2i12_format.opcode == std_op &&
+		ip->reg2i12_format.rj == LOONGARCH_GPR_SP &&
+		ip->reg2i12_format.rd == LOONGARCH_GPR_RA &&
+		!(ip->reg2i12_format.immediate & (1 << 11));
+}
> +		if (state->first) {
> +			state->sp = state->sp + frame_size;
> +			goto first;
> +		}
> +		return false;
> +	}

> +
> +	if (state->first)
> +		state->first = false;
> +
> +	state->pc = *(unsigned long *)(state->sp + frame_ra);
> +	state->sp = state->sp + frame_size;
> +	return !!__kernel_text_address(state->pc);
> +
> +first:
> +	state->first = false;
> +	if (state->pc == state->ra)
> +		return false;
> +
> +	state->pc = state->ra;
> +
> +	return !!__kernel_text_address(state->ra);
> +}
> +
> +static bool unwind_by_guess(struct unwind_state *state)
> +{
> +	struct stack_info *info = &state->stack_info;
> +	unsigned long addr;
> +
> +	for (state->sp += sizeof(unsigned long);
> +	     state->sp < info->end;
> +	     state->sp += sizeof(unsigned long)) {
> +		addr = *(unsigned long *)(state->sp);
> +		if (__kernel_text_address(addr))
> +			return true;
> +	}
> +
> +	return false;
> +}
> +
> +bool unwind_next_frame(struct unwind_state *state)
> +{
> +	struct stack_info *info = &state->stack_info;
> +	struct pt_regs *regs;
> +	unsigned long pc;
> +
> +	if (unwind_done(state))
> +		return false;
Can be removed as above.

Thanks,
Youling
> +
> +	do {
> +		if (state->enable) {
> +			if (unwind_by_prologue(state))
> +				return true;
> +
> +			if (info->type == STACK_TYPE_IRQ &&
> +				info->end == state->sp) {
> +				regs = (struct pt_regs *)info->next_sp;
> +				pc = regs->csr_era;
> +				if (user_mode(regs) || !__kernel_text_address(pc))
> +					return false;
> +
> +				state->pc = pc;
> +				state->sp = regs->regs[3];
> +				state->ra = regs->regs[1];
> +				state->first = true;
> +				get_stack_info(state->sp, state->task, info);
> +
> +				return true;
> +			}
> +		} else {
> +			if (state->first)
> +				state->first = false;
> +
> +			if (unwind_by_guess(state))
> +				return true;
> +		}
> +
> +		state->sp = info->next_sp;
> +
> +	} while (!get_stack_info(state->sp, state->task, info));
> +
> +	return false;
> +}
> +EXPORT_SYMBOL_GPL(unwind_next_frame);
> +
> +void unwind_start(struct unwind_state *state, struct task_struct *task,
> +		    struct pt_regs *regs)
> +{
> +	memset(state, 0, sizeof(*state));
> +
> +	if (__kernel_text_address(regs->csr_era))
> +		state->enable = true;
> +
> +	state->task = task;
> +	state->pc = regs->csr_era;
> +	state->sp = regs->regs[3];
> +	state->ra = regs->regs[1];
> +	state->first = true;
> +
> +	get_stack_info(state->sp, state->task, &state->stack_info);
> +
> +	if (!unwind_done(state) && !__kernel_text_address(state->pc))
> +		unwind_next_frame(state);
> +}
> +EXPORT_SYMBOL_GPL(unwind_start);
>


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 3/3] LoongArch: Add stacktrace support
  2022-07-28 14:05 ` [PATCH 3/3] LoongArch: Add stacktrace support Qing Zhang
@ 2022-07-29  2:13   ` Youling Tang
  2022-07-31 12:17   ` kernel test robot
                     ` (3 subsequent siblings)
  4 siblings, 0 replies; 15+ messages in thread
From: Youling Tang @ 2022-07-29  2:13 UTC (permalink / raw)
  To: Qing Zhang
  Cc: Huacai Chen, WANG Xuerui, loongarch, linux-kernel, Jiaxun Yang,
	hejinyang



On 07/28/2022 10:05 PM, Qing Zhang wrote:
> Use common arch_stack_walk infrastructure to avoid duplicated code and
> avoid taking care of the stack storage and filtering.
> Add sra (means __schedule return address) and scfa (means __schedule call
> frame address) to thread_info and store it in switch_to().
>
> Now we can print the process stack by cat /proc/*/stack and can better
> support ftrace.
>
> Signed-off-by: Qing Zhang <zhangqing@loongson.cn>
>
> diff --git a/arch/loongarch/Kconfig b/arch/loongarch/Kconfig
> index b57daee98b89..1bd656285674 100644
> --- a/arch/loongarch/Kconfig
> +++ b/arch/loongarch/Kconfig
> @@ -38,6 +38,7 @@ config LOONGARCH
>  	select ARCH_INLINE_SPIN_UNLOCK_IRQRESTORE if !PREEMPTION
>  	select ARCH_MIGHT_HAVE_PC_PARPORT
>  	select ARCH_MIGHT_HAVE_PC_SERIO
> +	select ARCH_STACKWALK
>  	select ARCH_SPARSEMEM_ENABLE
>  	select ARCH_SUPPORTS_ACPI
>  	select ARCH_SUPPORTS_ATOMIC_RMW
> @@ -141,6 +142,10 @@ config LOCKDEP_SUPPORT
>  	bool
>  	default y
>
> +config STACKTRACE_SUPPORT
> +	bool
> +	default y
> +
>  # MACH_LOONGSON32 and MACH_LOONGSON64 are delibrately carried over from the
>  # MIPS Loongson code, to preserve Loongson-specific code paths in drivers that
>  # are shared between architectures, and specifically expecting the symbols.
> diff --git a/arch/loongarch/include/asm/processor.h b/arch/loongarch/include/asm/processor.h
> index 57ec45aa078e..1c4b4308378d 100644
> --- a/arch/loongarch/include/asm/processor.h
> +++ b/arch/loongarch/include/asm/processor.h
> @@ -101,6 +101,10 @@ struct thread_struct {
>  	unsigned long reg23, reg24, reg25, reg26; /* s0-s3 */
>  	unsigned long reg27, reg28, reg29, reg30, reg31; /* s4-s8 */
>
> +	/* __schedule() return address / call frame address */
> +	unsigned long sched_ra;
> +	unsigned long sched_cfa;
> +
>  	/* CSR registers */
>  	unsigned long csr_prmd;
>  	unsigned long csr_crmd;
> @@ -129,6 +133,9 @@ struct thread_struct {
>  	struct loongarch_fpu fpu FPU_ALIGN;
>  };
>
> +#define thread_saved_ra(tsk)	(tsk->thread.sched_ra)
> +#define thread_saved_fp(tsk)	(tsk->thread.sched_cfa)
> +
>  #define INIT_THREAD  {						\
>  	/*							\
>  	 * Main processor registers				\
> @@ -145,6 +152,8 @@ struct thread_struct {
>  	.reg29			= 0,				\
>  	.reg30			= 0,				\
>  	.reg31			= 0,				\
> +	.sched_ra		= 0,				\
> +	.sched_cfa		= 0,				\
>  	.csr_crmd		= 0,				\
>  	.csr_prmd		= 0,				\
>  	.csr_euen		= 0,				\
> diff --git a/arch/loongarch/include/asm/switch_to.h b/arch/loongarch/include/asm/switch_to.h
> index 2a8d04375574..836cfcc19498 100644
> --- a/arch/loongarch/include/asm/switch_to.h
> +++ b/arch/loongarch/include/asm/switch_to.h
> @@ -15,12 +15,15 @@ struct task_struct;
>   * @prev:	The task previously executed.
>   * @next:	The task to begin executing.
>   * @next_ti:	task_thread_info(next).
> + * @sched_ra:	__schedule return address.
> + * @sched_cfa:	__schedule call frame address.
>   *
>   * This function is used whilst scheduling to save the context of prev & load
>   * the context of next. Returns prev.
>   */
>  extern asmlinkage struct task_struct *__switch_to(struct task_struct *prev,
> -			struct task_struct *next, struct thread_info *next_ti);
> +			struct task_struct *next, struct thread_info *next_ti,
> +			void *sched_ra, void *sched_cfa);
>
>  /*
>   * For newly created kernel threads switch_to() will return to
> @@ -31,7 +34,8 @@ extern asmlinkage struct task_struct *__switch_to(struct task_struct *prev,
>  #define switch_to(prev, next, last)					\
>  do {									\
>  	lose_fpu_inatomic(1, prev);					\
> -	(last) = __switch_to(prev, next, task_thread_info(next));	\
> +	(last) = __switch_to(prev, next, task_thread_info(next),	\
> +		 __builtin_return_address(0), __builtin_frame_address(0)); \
'\' format alignment.

Thanks,
Youling


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 2/3] LoongArch: Add prologue unwinder support
  2022-07-28 14:05 ` [PATCH 2/3] LoongArch: Add prologue " Qing Zhang
  2022-07-29  2:03   ` Youling Tang
@ 2022-07-29  2:14   ` Jinyang He
  2022-07-29  5:39     ` zhangqing
  1 sibling, 1 reply; 15+ messages in thread
From: Jinyang He @ 2022-07-29  2:14 UTC (permalink / raw)
  To: Qing Zhang, Huacai Chen, WANG Xuerui; +Cc: loongarch, linux-kernel, Jiaxun Yang

Hi, Qing,


On 07/28/2022 10:05 PM, Qing Zhang wrote:
> It unwind the stack frame based on prologue code analyze.
> CONFIG_KALLSYMS is needed, at least the address and length
> of each function.
>
> Three stages when we do unwind,
>    (1)unwind_start(), the prapare of unwinding, fill unwind_state.
>    (2)unwind_done(), judge whether the unwind process is finished or not.
>    (3)unwind_next_frame(), unwind the next frame.
>
> Dividing unwinder helps to add new unwinders in the future, eg:
> unwind_frame, unwind_orc .etc
>
> Signed-off-by: Qing Zhang <zhangqing@loongson.cn>
>
>   
> +static inline bool is_stack_alloc_ins(union loongarch_instruction *ip)
> +{
> +	/* addi.d $sp, $sp, -imm */
> +	return ip->reg2i12_format.opcode == addid_op &&
> +		ip->reg2i12_format.rj == LOONGARCH_GPR_SP &&
> +		ip->reg2i12_format.rd == LOONGARCH_GPR_SP &&
> +		ip->reg2i12_format.immediate & (1 << 11);
Checking the sign bit can be used in other place.
> +}
> +
> +static inline bool is_ra_save_ins(union loongarch_instruction *ip)
> +{
> +	/* st.d $ra, $sp, offset */
> +	return ip->reg2i12_format.opcode == std_op &&
> +		ip->reg2i12_format.rj == LOONGARCH_GPR_SP &&
> +		ip->reg2i12_format.rd == LOONGARCH_GPR_RA;
> +}
> +
> +static inline bool is_branch_insn(union loongarch_instruction insn)
Does it by using pointer parameter as above functions do.
> +{
> +	return insn.reg1i21_format.opcode >= beqz_op &&
> +			insn.reg1i21_format.opcode <= bgeu_op;
> +}
> +
>   u32 larch_insn_gen_lu32id(enum loongarch_gpr rd, int imm);
>   u32 larch_insn_gen_lu52id(enum loongarch_gpr rd, enum loongarch_gpr rj, int imm);
>   u32 larch_insn_gen_jirl(enum loongarch_gpr rd, enum loongarch_gpr rj, unsigned long pc, unsigned long dest);
> diff --git a/arch/loongarch/include/asm/unwind.h b/arch/loongarch/include/asm/unwind.h
> index 243330b39d0d..09394e536ea9 100644
> --- a/arch/loongarch/include/asm/unwind.h
> +++ b/arch/loongarch/include/asm/unwind.h
> @@ -14,6 +14,10 @@
>   struct unwind_state {
>   	struct stack_info stack_info;
>   	struct task_struct *task;
> +#if defined(CONFIG_UNWINDER_PROLOGUE)
> +	unsigned long ra;
> +	bool enable;
Annotating here is appreciating. Enable is the way of prologue analysis
while !enable is the way of guess.
> +#endif
>   	unsigned long sp, pc;
>   	bool first;
>   	bool error;
[...]
> +
> +unsigned long unwind_get_return_address(struct unwind_state *state)
> +{
> +
> +	if (unwind_done(state))
> +		return 0;
> +
> +	if (state->enable)
> +		return state->pc;
> +	else if (state->first)
> +		return state->pc;
Combine conditions.
> +
> +	return *(unsigned long *)(state->sp);
> +
> +}
> +EXPORT_SYMBOL_GPL(unwind_get_return_address);
> +
> +static bool unwind_by_prologue(struct unwind_state *state)
> +{
> +	struct stack_info *info = &state->stack_info;
> +	union loongarch_instruction *ip, *ip_end;
> +	unsigned long frame_size = 0, frame_ra = -1;
> +	unsigned long size, offset, pc = state->pc;
> +
> +	if (state->sp >= info->end || state->sp < info->begin)
> +		return false;
> +
> +	if (!kallsyms_lookup_size_offset(pc, &size, &offset))
> +		return false;
> +
> +	ip = (union loongarch_instruction *)(pc - offset);
> +	ip_end = (union loongarch_instruction *)pc;
> +
> +	while (ip < ip_end) {
> +		if (is_stack_alloc_ins(ip)) {
> +			frame_size = (1 << 12) - ip->reg2i12_format.immediate;
Due to there will be other place convert unsigned to signed, we have
a chance that create a inline function in inst.h. Do it as same as
checking the sign bit.

> +			ip++;
> +			break;
> +		}
> +		ip++;
> +	}
> +
[...]
> +
> +	do {
> +		if (state->enable) {
> +			if (unwind_by_prologue(state))
> +				return true;
> +
> +			if (info->type == STACK_TYPE_IRQ &&
> +				info->end == state->sp) {
> +				regs = (struct pt_regs *)info->next_sp;
> +				pc = regs->csr_era;
> +				if (user_mode(regs) || !__kernel_text_address(pc))
> +					return false;
> +
> +				state->pc = pc;
> +				state->sp = regs->regs[3];
> +				state->ra = regs->regs[1];
> +				state->first = true;
> +				get_stack_info(state->sp, state->task, info);
> +
> +				return true;
> +			}
> +		} else {
> +			if (state->first)
> +				state->first = false;
> +
> +			if (unwind_by_guess(state))
> +				return true;
> +		}
I'd prefer separate the block of 'if...else...' into two inline
functions, that makes codes clear.

Thanks,
Jinyang


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 1/3] LoongArch: Add guess unwinder support
  2022-07-29  2:01 ` [PATCH 1/3] LoongArch: Add guess unwinder support Youling Tang
@ 2022-07-29  2:28   ` Jinyang He
  2022-07-29  2:56     ` Youling Tang
  0 siblings, 1 reply; 15+ messages in thread
From: Jinyang He @ 2022-07-29  2:28 UTC (permalink / raw)
  To: Youling Tang, Qing Zhang, Huacai Chen
  Cc: WANG Xuerui, loongarch, linux-kernel, Jiaxun Yang

Hi, Youling,

[...]
>> +unsigned long unwind_get_return_address(struct unwind_state *state)
>> +{
>> +    if (unwind_done(state))
>> +        return 0;
> This judgment can be removed, because unwind_done() has been judged
> before entering this function, and unwind_get_return_address will not
> be called if it is true.
These unwinder functions are exported by "EXPORT_SYMBOL_GPL".
What's more, new ways to use them will be added in the future possible.
Assuming has judged unwind_done is not reliable.

Thanks,
Jinyang


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 1/3] LoongArch: Add guess unwinder support
  2022-07-29  2:28   ` Jinyang He
@ 2022-07-29  2:56     ` Youling Tang
  0 siblings, 0 replies; 15+ messages in thread
From: Youling Tang @ 2022-07-29  2:56 UTC (permalink / raw)
  To: Jinyang He, Qing Zhang, Huacai Chen
  Cc: WANG Xuerui, loongarch, linux-kernel, Jiaxun Yang

Hi, Jinyang

On 07/29/2022 10:28 AM, Jinyang He wrote:
> Hi, Youling,
>
> [...]
>>> +unsigned long unwind_get_return_address(struct unwind_state *state)
>>> +{
>>> +    if (unwind_done(state))
>>> +        return 0;
>> This judgment can be removed, because unwind_done() has been judged
>> before entering this function, and unwind_get_return_address will not
>> be called if it is true.
> These unwinder functions are exported by "EXPORT_SYMBOL_GPL".
> What's more, new ways to use them will be added in the future possible.
> Assuming has judged unwind_done is not reliable.
In this case, most of the code will be checked twice by unwind_done(),
which feels a bit redundant.

Thanks,
Youling


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 2/3] LoongArch: Add prologue unwinder support
  2022-07-29  2:03   ` Youling Tang
@ 2022-07-29  5:38     ` zhangqing
  0 siblings, 0 replies; 15+ messages in thread
From: zhangqing @ 2022-07-29  5:38 UTC (permalink / raw)
  To: Youling Tang, Huacai Chen
  Cc: WANG Xuerui, loongarch, linux-kernel, Jiaxun Yang, hejinyang



On 2022/7/29 上午10:03, Youling Tang wrote:
> 
> 
> On 07/28/2022 10:05 PM, Qing Zhang wrote:
>> It unwind the stack frame based on prologue code analyze.
>> CONFIG_KALLSYMS is needed, at least the address and length
>> of each function.
>>
>> Three stages when we do unwind,
>>   (1)unwind_start(), the prapare of unwinding, fill unwind_state.
>>   (2)unwind_done(), judge whether the unwind process is finished or not.
>>   (3)unwind_next_frame(), unwind the next frame.
>>
>> Dividing unwinder helps to add new unwinders in the future, eg:
>> unwind_frame, unwind_orc .etc
>>
>> Signed-off-by: Qing Zhang <zhangqing@loongson.cn>
>>
>> +
>> +    while (ip < ip_end) {
>> +        if (is_ra_save_ins(ip)) {
>> +            frame_ra = ip->reg2i12_format.immediate;
> Because the immediate member in struct reg2i12_format is defined as an
> unsigned type, the value obtained by frame_ra here can only be a
> positive number.
> 
>> +            break;
>> +        }
>> +        if (is_branch_insn(*ip))
>> +            break;
>> +        ip++;
>> +    }
>> +
>> +    if (frame_ra < 0) {
> In addition to judging whether the initial value of frame_ra is
> negative, we also want to judge whether the previously assigned
> frame_ra is negative.
> 
> Save the ra value to the stack in the prologue, offset must be a
> positive number, so we can add another judgment to is_ra_save_ins, the
> code is as follows:
> +static inline bool is_ra_save_ins(union loongarch_instruction *ip)
> +{
> +    /* st.d $ra, $sp, offset */
> +    return ip->reg2i12_format.opcode == std_op &&
> +        ip->reg2i12_format.rj == LOONGARCH_GPR_SP &&
> +        ip->reg2i12_format.rd == LOONGARCH_GPR_RA &&
> +        !(ip->reg2i12_format.immediate & (1 << 11));
> +}

Hi,
youling

you are right and I will send v2.

Thanks,
Qing


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 2/3] LoongArch: Add prologue unwinder support
  2022-07-29  2:14   ` Jinyang He
@ 2022-07-29  5:39     ` zhangqing
  0 siblings, 0 replies; 15+ messages in thread
From: zhangqing @ 2022-07-29  5:39 UTC (permalink / raw)
  To: Jinyang He, Huacai Chen, WANG Xuerui; +Cc: loongarch, linux-kernel, Jiaxun Yang



On 2022/7/29 上午10:14, Jinyang He wrote:
> Hi, Qing,
> 
> 
> On 07/28/2022 10:05 PM, Qing Zhang wrote:
>> It unwind the stack frame based on prologue code analyze.
>> CONFIG_KALLSYMS is needed, at least the address and length
>> of each function.
>>
>> Three stages when we do unwind,
>>    (1)unwind_start(), the prapare of unwinding, fill unwind_state.
>>    (2)unwind_done(), judge whether the unwind process is finished or not.
>>    (3)unwind_next_frame(), unwind the next frame.
>>
>> Dividing unwinder helps to add new unwinders in the future, eg:
>> unwind_frame, unwind_orc .etc
>>
>> Signed-off-by: Qing Zhang <zhangqing@loongson.cn>
>>
>> +static inline bool is_stack_alloc_ins(union loongarch_instruction *ip)
>> +{
>> +    /* addi.d $sp, $sp, -imm */
>> +    return ip->reg2i12_format.opcode == addid_op &&
>> +        ip->reg2i12_format.rj == LOONGARCH_GPR_SP &&
>> +        ip->reg2i12_format.rd == LOONGARCH_GPR_SP &&
>> +        ip->reg2i12_format.immediate & (1 << 11);
> Checking the sign bit can be used in other place.
>> +}
>> +
>> +static inline bool is_ra_save_ins(union loongarch_instruction *ip)
>> +{
>> +    /* st.d $ra, $sp, offset */
>> +    return ip->reg2i12_format.opcode == std_op &&
>> +        ip->reg2i12_format.rj == LOONGARCH_GPR_SP &&
>> +        ip->reg2i12_format.rd == LOONGARCH_GPR_RA;
>> +}
>> +
>> +static inline bool is_branch_insn(union loongarch_instruction insn)
> Does it by using pointer parameter as above functions do.
>> +{
>> +    return insn.reg1i21_format.opcode >= beqz_op &&
>> +            insn.reg1i21_format.opcode <= bgeu_op;
>> +}
>> +
>>   u32 larch_insn_gen_lu32id(enum loongarch_gpr rd, int imm);
>>   u32 larch_insn_gen_lu52id(enum loongarch_gpr rd, enum loongarch_gpr 
>> rj, int imm);
>>   u32 larch_insn_gen_jirl(enum loongarch_gpr rd, enum loongarch_gpr 
>> rj, unsigned long pc, unsigned long dest);
>> diff --git a/arch/loongarch/include/asm/unwind.h 
>> b/arch/loongarch/include/asm/unwind.h
>> index 243330b39d0d..09394e536ea9 100644
>> --- a/arch/loongarch/include/asm/unwind.h
>> +++ b/arch/loongarch/include/asm/unwind.h
>> @@ -14,6 +14,10 @@
>>   struct unwind_state {
>>       struct stack_info stack_info;
>>       struct task_struct *task;
>> +#if defined(CONFIG_UNWINDER_PROLOGUE)
>> +    unsigned long ra;
>> +    bool enable;
> Annotating here is appreciating. Enable is the way of prologue analysis
> while !enable is the way of guess.
>> +#endif
>>       unsigned long sp, pc;
>>       bool first;
>>       bool error;
> [...]
>> +
>> +unsigned long unwind_get_return_address(struct unwind_state *state)
>> +{
>> +
>> +    if (unwind_done(state))
>> +        return 0;
>> +
>> +    if (state->enable)
>> +        return state->pc;
>> +    else if (state->first)
>> +        return state->pc;
> Combine conditions.
>> +
>> +    return *(unsigned long *)(state->sp);
>> +
>> +}
>> +EXPORT_SYMBOL_GPL(unwind_get_return_address);
>> +
>> +static bool unwind_by_prologue(struct unwind_state *state)
>> +{
>> +    struct stack_info *info = &state->stack_info;
>> +    union loongarch_instruction *ip, *ip_end;
>> +    unsigned long frame_size = 0, frame_ra = -1;
>> +    unsigned long size, offset, pc = state->pc;
>> +
>> +    if (state->sp >= info->end || state->sp < info->begin)
>> +        return false;
>> +
>> +    if (!kallsyms_lookup_size_offset(pc, &size, &offset))
>> +        return false;
>> +
>> +    ip = (union loongarch_instruction *)(pc - offset);
>> +    ip_end = (union loongarch_instruction *)pc;
>> +
>> +    while (ip < ip_end) {
>> +        if (is_stack_alloc_ins(ip)) {
>> +            frame_size = (1 << 12) - ip->reg2i12_format.immediate;
> Due to there will be other place convert unsigned to signed, we have
> a chance that create a inline function in inst.h. Do it as same as
> checking the sign bit.Hi,
Jinyang

I will fix all in v2.
eg:
#define is_imm12_negative(val)  is_imm_negative(val, 12)
static inline bool is_imm_negative(unsigned long val, unsigned int bit)
{
         return val & (1UL << (bit-1));
}

static inline bool is_stack_alloc_ins(union loongarch_instruction *ip)
{
...
                 ip->reg2i12_format.rd == LOONGARCH_GPR_SP &&
                 is_imm12_negative(ip->reg2i12_format.immediate);
}

static inline bool is_ra_save_ins(union loongarch_instruction *ip)
{
...
                 !is_imm12_negative(ip->reg2i12_format.immediate);
}

Thanks,
Qing
> 
>> +            ip++;
>> +            break;
>> +        }
>> +        ip++;
>> +    }
>> +
> [...]
>> +
>> +    do {
>> +        if (state->enable) {
>> +            if (unwind_by_prologue(state))
>> +                return true;
>> +
>> +            if (info->type == STACK_TYPE_IRQ &&
>> +                info->end == state->sp) {
>> +                regs = (struct pt_regs *)info->next_sp;
>> +                pc = regs->csr_era;
>> +                if (user_mode(regs) || !__kernel_text_address(pc))
>> +                    return false;
>> +
>> +                state->pc = pc;
>> +                state->sp = regs->regs[3];
>> +                state->ra = regs->regs[1];
>> +                state->first = true;
>> +                get_stack_info(state->sp, state->task, info);
>> +
>> +                return true;
>> +            }
>> +        } else {
>> +            if (state->first)
>> +                state->first = false;
>> +
>> +            if (unwind_by_guess(state))
>> +                return true;
>> +        }
> I'd prefer separate the block of 'if...else...' into two inline
> functions, that makes codes clear.
> 
> Thanks,
> Jinyang


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 3/3] LoongArch: Add stacktrace support
  2022-07-28 14:05 ` [PATCH 3/3] LoongArch: Add stacktrace support Qing Zhang
  2022-07-29  2:13   ` Youling Tang
@ 2022-07-31 12:17   ` kernel test robot
  2022-08-02 19:18   ` kernel test robot
                     ` (2 subsequent siblings)
  4 siblings, 0 replies; 15+ messages in thread
From: kernel test robot @ 2022-07-31 12:17 UTC (permalink / raw)
  To: Qing Zhang, Huacai Chen, WANG Xuerui
  Cc: kbuild-all, loongarch, linux-kernel, Jiaxun Yang, hejinyang

Hi Qing,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on linus/master]
[also build test WARNING on v5.19-rc8 next-20220728]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Qing-Zhang/LoongArch-Add-guess-unwinder-support/20220728-220739
base:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 6e7765cb477a9753670d4351d14de93f1e9dbbd4
config: loongarch-randconfig-s041-20220731 (https://download.01.org/0day-ci/archive/20220731/202207312058.P3VcvB4t-lkp@intel.com/config)
compiler: loongarch64-linux-gcc (GCC) 12.1.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # apt-get install sparse
        # sparse version: v0.6.4-39-gce1a6720-dirty
        # https://github.com/intel-lab-lkp/linux/commit/32ef6acf6f5ecfadda21be77cbebb07b1c69e56a
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review Qing-Zhang/LoongArch-Add-guess-unwinder-support/20220728-220739
        git checkout 32ef6acf6f5ecfadda21be77cbebb07b1c69e56a
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=loongarch SHELL=/bin/bash kernel/entry/ kernel/trace/

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>

sparse warnings: (new ones prefixed by >>)
>> kernel/entry/common.c:447:29: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/entry/common.c:447:29: sparse:     expected void *ptr
   kernel/entry/common.c:447:29: sparse:     got int [noderef] __percpu *
>> kernel/entry/common.c:447:29: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/entry/common.c:447:29: sparse:     expected void *ptr
   kernel/entry/common.c:447:29: sparse:     got int [noderef] __percpu *
>> kernel/entry/common.c:447:29: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/entry/common.c:447:29: sparse:     expected void *ptr
   kernel/entry/common.c:447:29: sparse:     got int [noderef] __percpu *
>> kernel/entry/common.c:447:29: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/entry/common.c:447:29: sparse:     expected void *ptr
   kernel/entry/common.c:447:29: sparse:     got int [noderef] __percpu *
   kernel/entry/common.c: note: in included file:
   include/linux/context_tracking.h:98:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int enum ctx_state [noderef] __percpu * @@
   include/linux/context_tracking.h:98:17: sparse:     expected void *ptr
   include/linux/context_tracking.h:98:17: sparse:     got int enum ctx_state [noderef] __percpu *
   include/linux/context_tracking.h:98:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int enum ctx_state [noderef] __percpu * @@
   include/linux/context_tracking.h:98:17: sparse:     expected void *ptr
   include/linux/context_tracking.h:98:17: sparse:     got int enum ctx_state [noderef] __percpu *
   include/linux/context_tracking.h:98:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int enum ctx_state [noderef] __percpu * @@
   include/linux/context_tracking.h:98:17: sparse:     expected void *ptr
   include/linux/context_tracking.h:98:17: sparse:     got int enum ctx_state [noderef] __percpu *
   include/linux/context_tracking.h:98:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int enum ctx_state [noderef] __percpu * @@
   include/linux/context_tracking.h:98:17: sparse:     expected void *ptr
   include/linux/context_tracking.h:98:17: sparse:     got int enum ctx_state [noderef] __percpu *
   include/linux/context_tracking.h:98:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int enum ctx_state [noderef] __percpu * @@
   include/linux/context_tracking.h:98:17: sparse:     expected void *ptr
   include/linux/context_tracking.h:98:17: sparse:     got int enum ctx_state [noderef] __percpu *
   include/linux/context_tracking.h:98:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int enum ctx_state [noderef] __percpu * @@
   include/linux/context_tracking.h:98:17: sparse:     expected void *ptr
   include/linux/context_tracking.h:98:17: sparse:     got int enum ctx_state [noderef] __percpu *
   include/linux/context_tracking.h:98:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int enum ctx_state [noderef] __percpu * @@
   include/linux/context_tracking.h:98:17: sparse:     expected void *ptr
   include/linux/context_tracking.h:98:17: sparse:     got int enum ctx_state [noderef] __percpu *
   include/linux/context_tracking.h:98:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int enum ctx_state [noderef] __percpu * @@
   include/linux/context_tracking.h:98:17: sparse:     expected void *ptr
   include/linux/context_tracking.h:98:17: sparse:     got int enum ctx_state [noderef] __percpu *
   include/linux/context_tracking.h:98:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int enum ctx_state [noderef] __percpu * @@
   include/linux/context_tracking.h:98:17: sparse:     expected void *ptr
   include/linux/context_tracking.h:98:17: sparse:     got int enum ctx_state [noderef] __percpu *
   include/linux/context_tracking.h:98:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int enum ctx_state [noderef] __percpu * @@
   include/linux/context_tracking.h:98:17: sparse:     expected void *ptr
   include/linux/context_tracking.h:98:17: sparse:     got int enum ctx_state [noderef] __percpu *
   include/linux/context_tracking.h:98:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int enum ctx_state [noderef] __percpu * @@
   include/linux/context_tracking.h:98:17: sparse:     expected void *ptr
   include/linux/context_tracking.h:98:17: sparse:     got int enum ctx_state [noderef] __percpu *
   include/linux/context_tracking.h:98:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int enum ctx_state [noderef] __percpu * @@
   include/linux/context_tracking.h:98:17: sparse:     expected void *ptr
   include/linux/context_tracking.h:98:17: sparse:     got int enum ctx_state [noderef] __percpu *
   include/linux/context_tracking.h:98:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int enum ctx_state [noderef] __percpu * @@
   include/linux/context_tracking.h:98:17: sparse:     expected void *ptr
   include/linux/context_tracking.h:98:17: sparse:     got int enum ctx_state [noderef] __percpu *
   include/linux/context_tracking.h:98:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int enum ctx_state [noderef] __percpu * @@
   include/linux/context_tracking.h:98:17: sparse:     expected void *ptr
   include/linux/context_tracking.h:98:17: sparse:     got int enum ctx_state [noderef] __percpu *
   include/linux/context_tracking.h:98:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int enum ctx_state [noderef] __percpu * @@
   include/linux/context_tracking.h:98:17: sparse:     expected void *ptr
   include/linux/context_tracking.h:98:17: sparse:     got int enum ctx_state [noderef] __percpu *
   include/linux/context_tracking.h:98:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int enum ctx_state [noderef] __percpu * @@
   include/linux/context_tracking.h:98:17: sparse:     expected void *ptr
   include/linux/context_tracking.h:98:17: sparse:     got int enum ctx_state [noderef] __percpu *
   include/linux/context_tracking.h:98:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int enum ctx_state [noderef] __percpu * @@
   include/linux/context_tracking.h:98:17: sparse:     expected void *ptr
   include/linux/context_tracking.h:98:17: sparse:     got int enum ctx_state [noderef] __percpu *
   include/linux/context_tracking.h:98:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int enum ctx_state [noderef] __percpu * @@
   include/linux/context_tracking.h:98:17: sparse:     expected void *ptr
   include/linux/context_tracking.h:98:17: sparse:     got int enum ctx_state [noderef] __percpu *
   include/linux/context_tracking.h:98:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int enum ctx_state [noderef] __percpu * @@
   include/linux/context_tracking.h:98:17: sparse:     expected void *ptr
   include/linux/context_tracking.h:98:17: sparse:     got int enum ctx_state [noderef] __percpu *
   include/linux/context_tracking.h:98:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int enum ctx_state [noderef] __percpu * @@
   include/linux/context_tracking.h:98:17: sparse:     expected void *ptr
   include/linux/context_tracking.h:98:17: sparse:     got int enum ctx_state [noderef] __percpu *
--
>> kernel/trace/trace_preemptirq.c:30:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:30:13: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:30:13: sparse:     got int [noderef] __percpu *
>> kernel/trace/trace_preemptirq.c:30:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:30:13: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:30:13: sparse:     got int [noderef] __percpu *
>> kernel/trace/trace_preemptirq.c:30:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:30:13: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:30:13: sparse:     got int [noderef] __percpu *
>> kernel/trace/trace_preemptirq.c:30:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:30:13: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:30:13: sparse:     got int [noderef] __percpu *
   kernel/trace/trace_preemptirq.c:34:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:34:17: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:34:17: sparse:     got int [noderef] __percpu *
   kernel/trace/trace_preemptirq.c:34:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:34:17: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:34:17: sparse:     got int [noderef] __percpu *
   kernel/trace/trace_preemptirq.c:34:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:34:17: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:34:17: sparse:     got int [noderef] __percpu *
   kernel/trace/trace_preemptirq.c:34:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:34:17: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:34:17: sparse:     got int [noderef] __percpu *
   kernel/trace/trace_preemptirq.c:42:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:42:13: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:42:13: sparse:     got int [noderef] __percpu *
   kernel/trace/trace_preemptirq.c:42:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:42:13: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:42:13: sparse:     got int [noderef] __percpu *
   kernel/trace/trace_preemptirq.c:42:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:42:13: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:42:13: sparse:     got int [noderef] __percpu *
   kernel/trace/trace_preemptirq.c:42:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:42:13: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:42:13: sparse:     got int [noderef] __percpu *
   kernel/trace/trace_preemptirq.c:46:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:46:17: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:46:17: sparse:     got int [noderef] __percpu *
   kernel/trace/trace_preemptirq.c:46:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:46:17: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:46:17: sparse:     got int [noderef] __percpu *
   kernel/trace/trace_preemptirq.c:46:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:46:17: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:46:17: sparse:     got int [noderef] __percpu *
   kernel/trace/trace_preemptirq.c:46:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:46:17: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:46:17: sparse:     got int [noderef] __percpu *
   kernel/trace/trace_preemptirq.c:63:14: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:63:14: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:63:14: sparse:     got int [noderef] __percpu *
   kernel/trace/trace_preemptirq.c:63:14: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:63:14: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:63:14: sparse:     got int [noderef] __percpu *
   kernel/trace/trace_preemptirq.c:63:14: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:63:14: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:63:14: sparse:     got int [noderef] __percpu *
   kernel/trace/trace_preemptirq.c:63:14: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:63:14: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:63:14: sparse:     got int [noderef] __percpu *
   kernel/trace/trace_preemptirq.c:64:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:64:17: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:64:17: sparse:     got int [noderef] __percpu *
   kernel/trace/trace_preemptirq.c:64:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:64:17: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:64:17: sparse:     got int [noderef] __percpu *
   kernel/trace/trace_preemptirq.c:64:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:64:17: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:64:17: sparse:     got int [noderef] __percpu *
   kernel/trace/trace_preemptirq.c:64:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:64:17: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:64:17: sparse:     got int [noderef] __percpu *
   kernel/trace/trace_preemptirq.c:78:14: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:78:14: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:78:14: sparse:     got int [noderef] __percpu *
   kernel/trace/trace_preemptirq.c:78:14: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:78:14: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:78:14: sparse:     got int [noderef] __percpu *
   kernel/trace/trace_preemptirq.c:78:14: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:78:14: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:78:14: sparse:     got int [noderef] __percpu *
   kernel/trace/trace_preemptirq.c:78:14: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:78:14: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:78:14: sparse:     got int [noderef] __percpu *
   kernel/trace/trace_preemptirq.c:79:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:79:17: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:79:17: sparse:     got int [noderef] __percpu *
   kernel/trace/trace_preemptirq.c:79:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:79:17: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:79:17: sparse:     got int [noderef] __percpu *
   kernel/trace/trace_preemptirq.c:79:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:79:17: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:79:17: sparse:     got int [noderef] __percpu *
   kernel/trace/trace_preemptirq.c:79:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:79:17: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:79:17: sparse:     got int [noderef] __percpu *
   kernel/trace/trace_preemptirq.c:90:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:90:13: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:90:13: sparse:     got int [noderef] __percpu *
   kernel/trace/trace_preemptirq.c:90:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:90:13: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:90:13: sparse:     got int [noderef] __percpu *
   kernel/trace/trace_preemptirq.c:90:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:90:13: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:90:13: sparse:     got int [noderef] __percpu *
   kernel/trace/trace_preemptirq.c:90:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:90:13: sparse:     expected void *ptr
   kernel/trace/trace_preemptirq.c:90:13: sparse:     got int [noderef] __percpu *
   kernel/trace/trace_preemptirq.c:94:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/trace/trace_preemptirq.c:94:17: sparse:     expected void *ptr
--
   kernel/trace/trace_events_user.c:280:37: sparse: sparse: Using plain integer as NULL pointer
   kernel/trace/trace_events_user.c:461:38: sparse: sparse: Using plain integer as NULL pointer
   kernel/trace/trace_events_user.c:482:40: sparse: sparse: Using plain integer as NULL pointer
   kernel/trace/trace_events_user.c:1181:16: sparse: sparse: incompatible types in comparison expression (different address spaces):
   kernel/trace/trace_events_user.c:1181:16: sparse:    void [noderef] __rcu *
   kernel/trace/trace_events_user.c:1181:16: sparse:    void *
   kernel/trace/trace_events_user.c:1248:13: sparse: sparse: cast removes address space '__user' of expression
   kernel/trace/trace_events_user.c:1248:13: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void [noderef] __user *buf @@     got char * @@
   kernel/trace/trace_events_user.c:1248:13: sparse:     expected void [noderef] __user *buf
   kernel/trace/trace_events_user.c:1248:13: sparse:     got char *
   kernel/trace/trace_events_user.c:1264:16: sparse: sparse: incompatible types in comparison expression (different address spaces):
   kernel/trace/trace_events_user.c:1264:16: sparse:    void [noderef] __rcu *
   kernel/trace/trace_events_user.c:1264:16: sparse:    void *
   kernel/trace/trace_events_user.c:1291:9: sparse: sparse: incompatible types in comparison expression (different address spaces):
   kernel/trace/trace_events_user.c:1291:9: sparse:    void [noderef] __rcu *
   kernel/trace/trace_events_user.c:1291:9: sparse:    void *
   kernel/trace/trace_events_user.c: note: in included file:
>> kernel/trace/trace.h:1338:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got struct ring_buffer_event *[noderef] __percpu * @@
   kernel/trace/trace.h:1338:13: sparse:     expected void *ptr
   kernel/trace/trace.h:1338:13: sparse:     got struct ring_buffer_event *[noderef] __percpu *
>> kernel/trace/trace.h:1338:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got struct ring_buffer_event *[noderef] __percpu * @@
   kernel/trace/trace.h:1338:13: sparse:     expected void *ptr
   kernel/trace/trace.h:1338:13: sparse:     got struct ring_buffer_event *[noderef] __percpu *
>> kernel/trace/trace.h:1338:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got struct ring_buffer_event *[noderef] __percpu * @@
   kernel/trace/trace.h:1338:13: sparse:     expected void *ptr
   kernel/trace/trace.h:1338:13: sparse:     got struct ring_buffer_event *[noderef] __percpu *
>> kernel/trace/trace.h:1338:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got struct ring_buffer_event *[noderef] __percpu * @@
   kernel/trace/trace.h:1338:13: sparse:     expected void *ptr
   kernel/trace/trace.h:1338:13: sparse:     got struct ring_buffer_event *[noderef] __percpu *
   kernel/trace/trace_events_user.c: note: in included file (through include/linux/uaccess.h, include/linux/sched/task.h, include/linux/sched/signal.h, ...):
   arch/loongarch/include/asm/uaccess.h:232:32: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void const *from @@     got void const [noderef] __user *from @@
   arch/loongarch/include/asm/uaccess.h:232:32: sparse:     expected void const *from
   arch/loongarch/include/asm/uaccess.h:232:32: sparse:     got void const [noderef] __user *from
--
>> kernel/trace/trace_events.c:796:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got bool [noderef] __percpu * @@
   kernel/trace/trace_events.c:796:9: sparse:     expected void *ptr
   kernel/trace/trace_events.c:796:9: sparse:     got bool [noderef] __percpu *
>> kernel/trace/trace_events.c:796:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got bool [noderef] __percpu * @@
   kernel/trace/trace_events.c:796:9: sparse:     expected void *ptr
   kernel/trace/trace_events.c:796:9: sparse:     got bool [noderef] __percpu *
>> kernel/trace/trace_events.c:796:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got bool [noderef] __percpu * @@
   kernel/trace/trace_events.c:796:9: sparse:     expected void *ptr
   kernel/trace/trace_events.c:796:9: sparse:     got bool [noderef] __percpu *
>> kernel/trace/trace_events.c:796:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got bool [noderef] __percpu * @@
   kernel/trace/trace_events.c:796:9: sparse:     expected void *ptr
   kernel/trace/trace_events.c:796:9: sparse:     got bool [noderef] __percpu *
   kernel/trace/trace_events.c:814:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got bool [noderef] __percpu * @@
   kernel/trace/trace_events.c:814:9: sparse:     expected void *ptr
   kernel/trace/trace_events.c:814:9: sparse:     got bool [noderef] __percpu *
   kernel/trace/trace_events.c:814:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got bool [noderef] __percpu * @@
   kernel/trace/trace_events.c:814:9: sparse:     expected void *ptr
   kernel/trace/trace_events.c:814:9: sparse:     got bool [noderef] __percpu *
   kernel/trace/trace_events.c:814:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got bool [noderef] __percpu * @@
   kernel/trace/trace_events.c:814:9: sparse:     expected void *ptr
   kernel/trace/trace_events.c:814:9: sparse:     got bool [noderef] __percpu *
   kernel/trace/trace_events.c:814:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got bool [noderef] __percpu * @@
   kernel/trace/trace_events.c:814:9: sparse:     expected void *ptr
   kernel/trace/trace_events.c:814:9: sparse:     got bool [noderef] __percpu *
   kernel/trace/trace_events.c:826:14: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got bool [noderef] __percpu * @@
   kernel/trace/trace_events.c:826:14: sparse:     expected void *ptr
   kernel/trace/trace_events.c:826:14: sparse:     got bool [noderef] __percpu *
   kernel/trace/trace_events.c:826:14: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got bool [noderef] __percpu * @@
   kernel/trace/trace_events.c:826:14: sparse:     expected void *ptr
   kernel/trace/trace_events.c:826:14: sparse:     got bool [noderef] __percpu *
   kernel/trace/trace_events.c:826:14: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got bool [noderef] __percpu * @@
   kernel/trace/trace_events.c:826:14: sparse:     expected void *ptr
   kernel/trace/trace_events.c:826:14: sparse:     got bool [noderef] __percpu *
   kernel/trace/trace_events.c:826:14: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got bool [noderef] __percpu * @@
   kernel/trace/trace_events.c:826:14: sparse:     expected void *ptr
   kernel/trace/trace_events.c:826:14: sparse:     got bool [noderef] __percpu *
   kernel/trace/trace_events.c:832:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got bool [noderef] __percpu * @@
   kernel/trace/trace_events.c:832:9: sparse:     expected void *ptr
   kernel/trace/trace_events.c:832:9: sparse:     got bool [noderef] __percpu *
   kernel/trace/trace_events.c:832:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got bool [noderef] __percpu * @@
   kernel/trace/trace_events.c:832:9: sparse:     expected void *ptr
   kernel/trace/trace_events.c:832:9: sparse:     got bool [noderef] __percpu *
   kernel/trace/trace_events.c:832:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got bool [noderef] __percpu * @@
   kernel/trace/trace_events.c:832:9: sparse:     expected void *ptr
   kernel/trace/trace_events.c:832:9: sparse:     got bool [noderef] __percpu *
   kernel/trace/trace_events.c:832:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got bool [noderef] __percpu * @@
   kernel/trace/trace_events.c:832:9: sparse:     expected void *ptr
   kernel/trace/trace_events.c:832:9: sparse:     got bool [noderef] __percpu *
   kernel/trace/trace_events.c:844:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got bool [noderef] __percpu * @@
   kernel/trace/trace_events.c:844:13: sparse:     expected void *ptr
   kernel/trace/trace_events.c:844:13: sparse:     got bool [noderef] __percpu *
   kernel/trace/trace_events.c:844:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got bool [noderef] __percpu * @@
   kernel/trace/trace_events.c:844:13: sparse:     expected void *ptr
   kernel/trace/trace_events.c:844:13: sparse:     got bool [noderef] __percpu *
   kernel/trace/trace_events.c:844:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got bool [noderef] __percpu * @@
   kernel/trace/trace_events.c:844:13: sparse:     expected void *ptr
   kernel/trace/trace_events.c:844:13: sparse:     got bool [noderef] __percpu *
   kernel/trace/trace_events.c:844:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got bool [noderef] __percpu * @@
   kernel/trace/trace_events.c:844:13: sparse:     expected void *ptr
   kernel/trace/trace_events.c:844:13: sparse:     got bool [noderef] __percpu *
   kernel/trace/trace_events.c:851:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got bool [noderef] __percpu * @@
   kernel/trace/trace_events.c:851:9: sparse:     expected void *ptr
   kernel/trace/trace_events.c:851:9: sparse:     got bool [noderef] __percpu *
   kernel/trace/trace_events.c:851:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got bool [noderef] __percpu * @@
   kernel/trace/trace_events.c:851:9: sparse:     expected void *ptr
   kernel/trace/trace_events.c:851:9: sparse:     got bool [noderef] __percpu *
   kernel/trace/trace_events.c:851:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got bool [noderef] __percpu * @@
   kernel/trace/trace_events.c:851:9: sparse:     expected void *ptr
   kernel/trace/trace_events.c:851:9: sparse:     got bool [noderef] __percpu *
   kernel/trace/trace_events.c:851:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got bool [noderef] __percpu * @@
   kernel/trace/trace_events.c:851:9: sparse:     expected void *ptr
   kernel/trace/trace_events.c:851:9: sparse:     got bool [noderef] __percpu *
   kernel/trace/trace_events.c:999:31: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct event_filter *filter @@     got struct event_filter [noderef] __rcu *filter @@
   kernel/trace/trace_events.c:999:31: sparse:     expected struct event_filter *filter
   kernel/trace/trace_events.c:999:31: sparse:     got struct event_filter [noderef] __rcu *filter
   kernel/trace/trace_events.c:1907:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got bool [noderef] __percpu * @@
   kernel/trace/trace_events.c:1907:9: sparse:     expected void *ptr
   kernel/trace/trace_events.c:1907:9: sparse:     got bool [noderef] __percpu *
   kernel/trace/trace_events.c:1907:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got bool [noderef] __percpu * @@
   kernel/trace/trace_events.c:1907:9: sparse:     expected void *ptr
   kernel/trace/trace_events.c:1907:9: sparse:     got bool [noderef] __percpu *
   kernel/trace/trace_events.c:1907:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got bool [noderef] __percpu * @@
   kernel/trace/trace_events.c:1907:9: sparse:     expected void *ptr
   kernel/trace/trace_events.c:1907:9: sparse:     got bool [noderef] __percpu *
   kernel/trace/trace_events.c:1907:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got bool [noderef] __percpu * @@
   kernel/trace/trace_events.c:1907:9: sparse:     expected void *ptr
   kernel/trace/trace_events.c:1907:9: sparse:     got bool [noderef] __percpu *
--
   kernel/trace/trace.c:406:28: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct trace_export **list @@     got struct trace_export [noderef] __rcu ** @@
   kernel/trace/trace.c:406:28: sparse:     expected struct trace_export **list
   kernel/trace/trace.c:406:28: sparse:     got struct trace_export [noderef] __rcu **
   kernel/trace/trace.c:420:33: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct trace_export **list @@     got struct trace_export [noderef] __rcu ** @@
   kernel/trace/trace.c:420:33: sparse:     expected struct trace_export **list
   kernel/trace/trace.c:420:33: sparse:     got struct trace_export [noderef] __rcu **
   kernel/trace/trace.c:2864:38: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct event_filter *filter @@     got struct event_filter [noderef] __rcu *filter @@
   kernel/trace/trace.c:2864:38: sparse:     expected struct event_filter *filter
   kernel/trace/trace.c:2864:38: sparse:     got struct event_filter [noderef] __rcu *filter
>> kernel/trace/trace.c:7333:20: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got struct ring_buffer_event *[noderef] __percpu * @@
   kernel/trace/trace.c:7333:20: sparse:     expected void *ptr
   kernel/trace/trace.c:7333:20: sparse:     got struct ring_buffer_event *[noderef] __percpu *
>> kernel/trace/trace.c:7333:20: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got struct ring_buffer_event *[noderef] __percpu * @@
   kernel/trace/trace.c:7333:20: sparse:     expected void *ptr
   kernel/trace/trace.c:7333:20: sparse:     got struct ring_buffer_event *[noderef] __percpu *
>> kernel/trace/trace.c:7333:20: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got struct ring_buffer_event *[noderef] __percpu * @@
   kernel/trace/trace.c:7333:20: sparse:     expected void *ptr
   kernel/trace/trace.c:7333:20: sparse:     got struct ring_buffer_event *[noderef] __percpu *
>> kernel/trace/trace.c:7333:20: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got struct ring_buffer_event *[noderef] __percpu * @@
   kernel/trace/trace.c:7333:20: sparse:     expected void *ptr
   kernel/trace/trace.c:7333:20: sparse:     got struct ring_buffer_event *[noderef] __percpu *
   kernel/trace/trace.c:360:9: sparse: sparse: incompatible types in comparison expression (different address spaces):
   kernel/trace/trace.c:360:9: sparse:    struct trace_export [noderef] __rcu *
   kernel/trace/trace.c:360:9: sparse:    struct trace_export *
   kernel/trace/trace.c:375:9: sparse: sparse: incompatible types in comparison expression (different address spaces):
   kernel/trace/trace.c:375:9: sparse:    struct trace_export [noderef] __rcu *
   kernel/trace/trace.c:375:9: sparse:    struct trace_export *

vim +447 kernel/entry/common.c

b6be002bcd1dd1 Thomas Gleixner 2020-11-02  442  
b6be002bcd1dd1 Thomas Gleixner 2020-11-02  443  irqentry_state_t noinstr irqentry_nmi_enter(struct pt_regs *regs)
b6be002bcd1dd1 Thomas Gleixner 2020-11-02  444  {
b6be002bcd1dd1 Thomas Gleixner 2020-11-02  445  	irqentry_state_t irq_state;
b6be002bcd1dd1 Thomas Gleixner 2020-11-02  446  
b6be002bcd1dd1 Thomas Gleixner 2020-11-02 @447  	irq_state.lockdep = lockdep_hardirqs_enabled();
b6be002bcd1dd1 Thomas Gleixner 2020-11-02  448  
b6be002bcd1dd1 Thomas Gleixner 2020-11-02  449  	__nmi_enter();
b6be002bcd1dd1 Thomas Gleixner 2020-11-02  450  	lockdep_hardirqs_off(CALLER_ADDR0);
b6be002bcd1dd1 Thomas Gleixner 2020-11-02  451  	lockdep_hardirq_enter();
b6be002bcd1dd1 Thomas Gleixner 2020-11-02  452  	rcu_nmi_enter();
b6be002bcd1dd1 Thomas Gleixner 2020-11-02  453  
b6be002bcd1dd1 Thomas Gleixner 2020-11-02  454  	instrumentation_begin();
b6be002bcd1dd1 Thomas Gleixner 2020-11-02  455  	trace_hardirqs_off_finish();
b6be002bcd1dd1 Thomas Gleixner 2020-11-02  456  	ftrace_nmi_enter();
b6be002bcd1dd1 Thomas Gleixner 2020-11-02  457  	instrumentation_end();
b6be002bcd1dd1 Thomas Gleixner 2020-11-02  458  
b6be002bcd1dd1 Thomas Gleixner 2020-11-02  459  	return irq_state;
b6be002bcd1dd1 Thomas Gleixner 2020-11-02  460  }
b6be002bcd1dd1 Thomas Gleixner 2020-11-02  461  

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 3/3] LoongArch: Add stacktrace support
  2022-07-28 14:05 ` [PATCH 3/3] LoongArch: Add stacktrace support Qing Zhang
  2022-07-29  2:13   ` Youling Tang
  2022-07-31 12:17   ` kernel test robot
@ 2022-08-02 19:18   ` kernel test robot
  2022-08-05 20:31   ` kernel test robot
  2022-08-10 13:16   ` kernel test robot
  4 siblings, 0 replies; 15+ messages in thread
From: kernel test robot @ 2022-08-02 19:18 UTC (permalink / raw)
  To: Qing Zhang, Huacai Chen, WANG Xuerui
  Cc: kbuild-all, loongarch, linux-kernel, Jiaxun Yang, hejinyang

Hi Qing,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on linus/master]
[also build test WARNING on v5.19 next-20220728]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Qing-Zhang/LoongArch-Add-guess-unwinder-support/20220728-220739
base:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 6e7765cb477a9753670d4351d14de93f1e9dbbd4
config: loongarch-randconfig-s043-20220801 (https://download.01.org/0day-ci/archive/20220803/202208030339.bOMzIpUt-lkp@intel.com/config)
compiler: loongarch64-linux-gcc (GCC) 12.1.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # apt-get install sparse
        # sparse version: v0.6.4-39-gce1a6720-dirty
        # https://github.com/intel-lab-lkp/linux/commit/32ef6acf6f5ecfadda21be77cbebb07b1c69e56a
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review Qing-Zhang/LoongArch-Add-guess-unwinder-support/20220728-220739
        git checkout 32ef6acf6f5ecfadda21be77cbebb07b1c69e56a
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=loongarch SHELL=/bin/bash kernel/locking/

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>

sparse warnings: (new ones prefixed by >>)
   kernel/locking/lockdep.c:110:1: sparse: sparse: symbol '__pcpu_scope_lockdep_recursion' was not declared. Should it be static?
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *
>> kernel/locking/lockdep.c:118:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:118:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:118:13: sparse:     got unsigned int [noderef] __percpu *

vim +118 kernel/locking/lockdep.c

4d004099a668c4 Peter Zijlstra 2020-10-02  112  
0afda3a888dccf Peter Zijlstra 2021-01-06  113  static __always_inline bool lockdep_enabled(void)
4d004099a668c4 Peter Zijlstra 2020-10-02  114  {
4d004099a668c4 Peter Zijlstra 2020-10-02  115  	if (!debug_locks)
4d004099a668c4 Peter Zijlstra 2020-10-02  116  		return false;
4d004099a668c4 Peter Zijlstra 2020-10-02  117  
d48e3850030623 Peter Zijlstra 2020-10-26 @118  	if (this_cpu_read(lockdep_recursion))
4d004099a668c4 Peter Zijlstra 2020-10-02  119  		return false;
4d004099a668c4 Peter Zijlstra 2020-10-02  120  
4d004099a668c4 Peter Zijlstra 2020-10-02  121  	if (current->lockdep_recursion)
4d004099a668c4 Peter Zijlstra 2020-10-02  122  		return false;
4d004099a668c4 Peter Zijlstra 2020-10-02  123  
4d004099a668c4 Peter Zijlstra 2020-10-02  124  	return true;
4d004099a668c4 Peter Zijlstra 2020-10-02  125  }
4d004099a668c4 Peter Zijlstra 2020-10-02  126  

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 3/3] LoongArch: Add stacktrace support
  2022-07-28 14:05 ` [PATCH 3/3] LoongArch: Add stacktrace support Qing Zhang
                     ` (2 preceding siblings ...)
  2022-08-02 19:18   ` kernel test robot
@ 2022-08-05 20:31   ` kernel test robot
  2022-08-10 13:16   ` kernel test robot
  4 siblings, 0 replies; 15+ messages in thread
From: kernel test robot @ 2022-08-05 20:31 UTC (permalink / raw)
  To: Qing Zhang, Huacai Chen, WANG Xuerui
  Cc: kbuild-all, loongarch, linux-kernel, Jiaxun Yang, hejinyang

Hi Qing,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on linus/master]
[also build test WARNING on v5.19 next-20220805]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Qing-Zhang/LoongArch-Add-guess-unwinder-support/20220728-220739
base:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 6e7765cb477a9753670d4351d14de93f1e9dbbd4
config: loongarch-randconfig-s033-20220805 (https://download.01.org/0day-ci/archive/20220806/202208060426.hJL19duk-lkp@intel.com/config)
compiler: loongarch64-linux-gcc (GCC) 12.1.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # apt-get install sparse
        # sparse version: v0.6.4-39-gce1a6720-dirty
        # https://github.com/intel-lab-lkp/linux/commit/32ef6acf6f5ecfadda21be77cbebb07b1c69e56a
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review Qing-Zhang/LoongArch-Add-guess-unwinder-support/20220728-220739
        git checkout 32ef6acf6f5ecfadda21be77cbebb07b1c69e56a
        # save the config file
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=loongarch 

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>

sparse warnings: (new ones prefixed by >>)
>> kernel/irq_work.c:278:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/irq_work.c:278:9: sparse:     expected void *ptr
   kernel/irq_work.c:278:9: sparse:     got unsigned int [noderef] __percpu *
>> kernel/irq_work.c:278:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/irq_work.c:278:9: sparse:     expected void *ptr
   kernel/irq_work.c:278:9: sparse:     got unsigned int [noderef] __percpu *
>> kernel/irq_work.c:278:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/irq_work.c:278:9: sparse:     expected void *ptr
   kernel/irq_work.c:278:9: sparse:     got unsigned int [noderef] __percpu *
>> kernel/irq_work.c:278:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/irq_work.c:278:9: sparse:     expected void *ptr
   kernel/irq_work.c:278:9: sparse:     got unsigned int [noderef] __percpu *
>> kernel/irq_work.c:278:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/irq_work.c:278:9: sparse:     expected void *ptr
   kernel/irq_work.c:278:9: sparse:     got int [noderef] __percpu *
>> kernel/irq_work.c:278:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/irq_work.c:278:9: sparse:     expected void *ptr
   kernel/irq_work.c:278:9: sparse:     got int [noderef] __percpu *
>> kernel/irq_work.c:278:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/irq_work.c:278:9: sparse:     expected void *ptr
   kernel/irq_work.c:278:9: sparse:     got int [noderef] __percpu *
>> kernel/irq_work.c:278:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/irq_work.c:278:9: sparse:     expected void *ptr
   kernel/irq_work.c:278:9: sparse:     got int [noderef] __percpu *
--
   kernel/fork.c:1307:22: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected struct file *[assigned] old_exe_file @@     got struct file [noderef] __rcu *[assigned] __res @@
   kernel/fork.c:1307:22: sparse:     expected struct file *[assigned] old_exe_file
   kernel/fork.c:1307:22: sparse:     got struct file [noderef] __rcu *[assigned] __res
   kernel/fork.c:1638:38: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct refcount_struct [usertype] *r @@     got struct refcount_struct [noderef] __rcu * @@
   kernel/fork.c:1638:38: sparse:     expected struct refcount_struct [usertype] *r
   kernel/fork.c:1638:38: sparse:     got struct refcount_struct [noderef] __rcu *
   kernel/fork.c:1647:31: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   kernel/fork.c:1647:31: sparse:     expected struct spinlock [usertype] *lock
   kernel/fork.c:1647:31: sparse:     got struct spinlock [noderef] __rcu *
   kernel/fork.c:1648:36: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void const * @@     got struct k_sigaction [noderef] __rcu * @@
   kernel/fork.c:1648:36: sparse:     expected void const *
   kernel/fork.c:1648:36: sparse:     got struct k_sigaction [noderef] __rcu *
   kernel/fork.c:1649:33: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   kernel/fork.c:1649:33: sparse:     expected struct spinlock [usertype] *lock
   kernel/fork.c:1649:33: sparse:     got struct spinlock [noderef] __rcu *
   kernel/fork.c:2061:31: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   kernel/fork.c:2061:31: sparse:     expected struct spinlock [usertype] *lock
   kernel/fork.c:2061:31: sparse:     got struct spinlock [noderef] __rcu *
   kernel/fork.c:2065:33: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   kernel/fork.c:2065:33: sparse:     expected struct spinlock [usertype] *lock
   kernel/fork.c:2065:33: sparse:     got struct spinlock [noderef] __rcu *
>> kernel/fork.c:2096:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/fork.c:2096:9: sparse:     expected void *ptr
   kernel/fork.c:2096:9: sparse:     got unsigned int [noderef] __percpu *
>> kernel/fork.c:2096:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/fork.c:2096:9: sparse:     expected void *ptr
   kernel/fork.c:2096:9: sparse:     got unsigned int [noderef] __percpu *
>> kernel/fork.c:2096:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/fork.c:2096:9: sparse:     expected void *ptr
   kernel/fork.c:2096:9: sparse:     got unsigned int [noderef] __percpu *
>> kernel/fork.c:2096:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/fork.c:2096:9: sparse:     expected void *ptr
   kernel/fork.c:2096:9: sparse:     got unsigned int [noderef] __percpu *
>> kernel/fork.c:2096:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/fork.c:2096:9: sparse:     expected void *ptr
   kernel/fork.c:2096:9: sparse:     got int [noderef] __percpu *
>> kernel/fork.c:2096:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/fork.c:2096:9: sparse:     expected void *ptr
   kernel/fork.c:2096:9: sparse:     got int [noderef] __percpu *
>> kernel/fork.c:2096:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/fork.c:2096:9: sparse:     expected void *ptr
   kernel/fork.c:2096:9: sparse:     got int [noderef] __percpu *
>> kernel/fork.c:2096:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/fork.c:2096:9: sparse:     expected void *ptr
   kernel/fork.c:2096:9: sparse:     got int [noderef] __percpu *
   kernel/fork.c:2385:32: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected struct task_struct [noderef] __rcu *real_parent @@     got struct task_struct *task @@
   kernel/fork.c:2385:32: sparse:     expected struct task_struct [noderef] __rcu *real_parent
   kernel/fork.c:2385:32: sparse:     got struct task_struct *task
   kernel/fork.c:2394:27: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   kernel/fork.c:2394:27: sparse:     expected struct spinlock [usertype] *lock
   kernel/fork.c:2394:27: sparse:     got struct spinlock [noderef] __rcu *
   kernel/fork.c:2439:54: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected struct list_head *head @@     got struct list_head [noderef] __rcu * @@
   kernel/fork.c:2439:54: sparse:     expected struct list_head *head
   kernel/fork.c:2439:54: sparse:     got struct list_head [noderef] __rcu *
   kernel/fork.c:2460:29: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   kernel/fork.c:2460:29: sparse:     expected struct spinlock [usertype] *lock
   kernel/fork.c:2460:29: sparse:     got struct spinlock [noderef] __rcu *
   kernel/fork.c:2481:29: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   kernel/fork.c:2481:29: sparse:     expected struct spinlock [usertype] *lock
   kernel/fork.c:2481:29: sparse:     got struct spinlock [noderef] __rcu *
   kernel/fork.c:2508:28: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct sighand_struct *sighand @@     got struct sighand_struct [noderef] __rcu *sighand @@
   kernel/fork.c:2508:28: sparse:     expected struct sighand_struct *sighand
   kernel/fork.c:2508:28: sparse:     got struct sighand_struct [noderef] __rcu *sighand
   kernel/fork.c:2537:31: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   kernel/fork.c:2537:31: sparse:     expected struct spinlock [usertype] *lock
   kernel/fork.c:2537:31: sparse:     got struct spinlock [noderef] __rcu *
   kernel/fork.c:2539:33: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   kernel/fork.c:2539:33: sparse:     expected struct spinlock [usertype] *lock
   kernel/fork.c:2539:33: sparse:     got struct spinlock [noderef] __rcu *
   kernel/fork.c:2975:24: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected struct task_struct *[assigned] parent @@     got struct task_struct [noderef] __rcu *real_parent @@
   kernel/fork.c:2975:24: sparse:     expected struct task_struct *[assigned] parent
   kernel/fork.c:2975:24: sparse:     got struct task_struct [noderef] __rcu *real_parent
   kernel/fork.c:3056:43: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct refcount_struct const [usertype] *r @@     got struct refcount_struct [noderef] __rcu * @@
   kernel/fork.c:3056:43: sparse:     expected struct refcount_struct const [usertype] *r
   kernel/fork.c:3056:43: sparse:     got struct refcount_struct [noderef] __rcu *
   kernel/fork.c:2106:22: sparse: sparse: dereference of noderef expression
   kernel/fork.c: note: in included file (through include/uapi/asm-generic/bpf_perf_event.h, arch/loongarch/include/generated/uapi/asm/bpf_perf_event.h, ...):
   include/linux/ptrace.h:210:45: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected struct task_struct *new_parent @@     got struct task_struct [noderef] __rcu *parent @@
   include/linux/ptrace.h:210:45: sparse:     expected struct task_struct *new_parent
   include/linux/ptrace.h:210:45: sparse:     got struct task_struct [noderef] __rcu *parent
   include/linux/ptrace.h:210:62: sparse: sparse: incorrect type in argument 3 (different address spaces) @@     expected struct cred const *ptracer_cred @@     got struct cred const [noderef] __rcu *ptracer_cred @@
   include/linux/ptrace.h:210:62: sparse:     expected struct cred const *ptracer_cred
   include/linux/ptrace.h:210:62: sparse:     got struct cred const [noderef] __rcu *ptracer_cred
   kernel/fork.c:2437:59: sparse: sparse: dereference of noderef expression
   kernel/fork.c:2438:59: sparse: sparse: dereference of noderef expression
   kernel/fork.c: note: in included file (through include/linux/uaccess.h, include/linux/sched/task.h):
   arch/loongarch/include/asm/uaccess.h:232:32: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void const *from @@     got void const [noderef] __user *from @@
   arch/loongarch/include/asm/uaccess.h:232:32: sparse:     expected void const *from
   arch/loongarch/include/asm/uaccess.h:232:32: sparse:     got void const [noderef] __user *from
   arch/loongarch/include/asm/uaccess.h:232:32: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void const *from @@     got void const [noderef] __user *from @@
   arch/loongarch/include/asm/uaccess.h:232:32: sparse:     expected void const *from
   arch/loongarch/include/asm/uaccess.h:232:32: sparse:     got void const [noderef] __user *from
--
>> kernel/softirq.c:351:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/softirq.c:351:9: sparse:     expected void *ptr
   kernel/softirq.c:351:9: sparse:     got unsigned int [noderef] __percpu *
>> kernel/softirq.c:351:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/softirq.c:351:9: sparse:     expected void *ptr
   kernel/softirq.c:351:9: sparse:     got unsigned int [noderef] __percpu *
>> kernel/softirq.c:351:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/softirq.c:351:9: sparse:     expected void *ptr
   kernel/softirq.c:351:9: sparse:     got unsigned int [noderef] __percpu *
>> kernel/softirq.c:351:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/softirq.c:351:9: sparse:     expected void *ptr
   kernel/softirq.c:351:9: sparse:     got unsigned int [noderef] __percpu *
>> kernel/softirq.c:351:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/softirq.c:351:9: sparse:     expected void *ptr
   kernel/softirq.c:351:9: sparse:     got int [noderef] __percpu *
>> kernel/softirq.c:351:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/softirq.c:351:9: sparse:     expected void *ptr
   kernel/softirq.c:351:9: sparse:     got int [noderef] __percpu *
>> kernel/softirq.c:351:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/softirq.c:351:9: sparse:     expected void *ptr
   kernel/softirq.c:351:9: sparse:     got int [noderef] __percpu *
>> kernel/softirq.c:351:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/softirq.c:351:9: sparse:     expected void *ptr
   kernel/softirq.c:351:9: sparse:     got int [noderef] __percpu *
   kernel/softirq.c:376:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/softirq.c:376:9: sparse:     expected void *ptr
   kernel/softirq.c:376:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/softirq.c:376:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/softirq.c:376:9: sparse:     expected void *ptr
   kernel/softirq.c:376:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/softirq.c:376:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/softirq.c:376:9: sparse:     expected void *ptr
   kernel/softirq.c:376:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/softirq.c:376:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/softirq.c:376:9: sparse:     expected void *ptr
   kernel/softirq.c:376:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/softirq.c:376:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/softirq.c:376:9: sparse:     expected void *ptr
   kernel/softirq.c:376:9: sparse:     got int [noderef] __percpu *
   kernel/softirq.c:376:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/softirq.c:376:9: sparse:     expected void *ptr
   kernel/softirq.c:376:9: sparse:     got int [noderef] __percpu *
   kernel/softirq.c:376:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/softirq.c:376:9: sparse:     expected void *ptr
   kernel/softirq.c:376:9: sparse:     got int [noderef] __percpu *
   kernel/softirq.c:376:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/softirq.c:376:9: sparse:     expected void *ptr
   kernel/softirq.c:376:9: sparse:     got int [noderef] __percpu *
   kernel/softirq.c:711:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/softirq.c:711:9: sparse:     expected void *ptr
   kernel/softirq.c:711:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/softirq.c:711:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/softirq.c:711:9: sparse:     expected void *ptr
   kernel/softirq.c:711:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/softirq.c:711:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/softirq.c:711:9: sparse:     expected void *ptr
   kernel/softirq.c:711:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/softirq.c:711:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/softirq.c:711:9: sparse:     expected void *ptr
   kernel/softirq.c:711:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/softirq.c:711:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/softirq.c:711:9: sparse:     expected void *ptr
   kernel/softirq.c:711:9: sparse:     got int [noderef] __percpu *
   kernel/softirq.c:711:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/softirq.c:711:9: sparse:     expected void *ptr
   kernel/softirq.c:711:9: sparse:     got int [noderef] __percpu *
   kernel/softirq.c:711:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/softirq.c:711:9: sparse:     expected void *ptr
   kernel/softirq.c:711:9: sparse:     got int [noderef] __percpu *
   kernel/softirq.c:711:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/softirq.c:711:9: sparse:     expected void *ptr
   kernel/softirq.c:711:9: sparse:     got int [noderef] __percpu *
--
>> kernel/workqueue.c:1433:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/workqueue.c:1433:9: sparse:     expected void *ptr
   kernel/workqueue.c:1433:9: sparse:     got unsigned int [noderef] __percpu *
>> kernel/workqueue.c:1433:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/workqueue.c:1433:9: sparse:     expected void *ptr
   kernel/workqueue.c:1433:9: sparse:     got unsigned int [noderef] __percpu *
>> kernel/workqueue.c:1433:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/workqueue.c:1433:9: sparse:     expected void *ptr
   kernel/workqueue.c:1433:9: sparse:     got unsigned int [noderef] __percpu *
>> kernel/workqueue.c:1433:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/workqueue.c:1433:9: sparse:     expected void *ptr
   kernel/workqueue.c:1433:9: sparse:     got unsigned int [noderef] __percpu *
>> kernel/workqueue.c:1433:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/workqueue.c:1433:9: sparse:     expected void *ptr
   kernel/workqueue.c:1433:9: sparse:     got int [noderef] __percpu *
>> kernel/workqueue.c:1433:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/workqueue.c:1433:9: sparse:     expected void *ptr
   kernel/workqueue.c:1433:9: sparse:     got int [noderef] __percpu *
>> kernel/workqueue.c:1433:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/workqueue.c:1433:9: sparse:     expected void *ptr
   kernel/workqueue.c:1433:9: sparse:     got int [noderef] __percpu *
>> kernel/workqueue.c:1433:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/workqueue.c:1433:9: sparse:     expected void *ptr
   kernel/workqueue.c:1433:9: sparse:     got int [noderef] __percpu *
   kernel/workqueue.c:3537:13: sparse: sparse: context imbalance in 'wq_manager_inactive' - different lock contexts for basic block
   kernel/workqueue.c:3592:9: sparse: sparse: context imbalance in 'put_unbound_pool' - unexpected unlock
--
>> kernel/locking/lockdep.c:2562:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/locking/lockdep.c:2562:9: sparse:     expected void *ptr
   kernel/locking/lockdep.c:2562:9: sparse:     got int [noderef] __percpu *
>> kernel/locking/lockdep.c:2562:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/locking/lockdep.c:2562:9: sparse:     expected void *ptr
   kernel/locking/lockdep.c:2562:9: sparse:     got int [noderef] __percpu *
>> kernel/locking/lockdep.c:2562:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/locking/lockdep.c:2562:9: sparse:     expected void *ptr
   kernel/locking/lockdep.c:2562:9: sparse:     got int [noderef] __percpu *
>> kernel/locking/lockdep.c:2562:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/locking/lockdep.c:2562:9: sparse:     expected void *ptr
   kernel/locking/lockdep.c:2562:9: sparse:     got int [noderef] __percpu *
   kernel/locking/lockdep.c:3943:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/locking/lockdep.c:3943:9: sparse:     expected void *ptr
   kernel/locking/lockdep.c:3943:9: sparse:     got int [noderef] __percpu *
   kernel/locking/lockdep.c:3943:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/locking/lockdep.c:3943:9: sparse:     expected void *ptr
   kernel/locking/lockdep.c:3943:9: sparse:     got int [noderef] __percpu *
   kernel/locking/lockdep.c:3943:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/locking/lockdep.c:3943:9: sparse:     expected void *ptr
   kernel/locking/lockdep.c:3943:9: sparse:     got int [noderef] __percpu *
   kernel/locking/lockdep.c:3943:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/locking/lockdep.c:3943:9: sparse:     expected void *ptr
   kernel/locking/lockdep.c:3943:9: sparse:     got int [noderef] __percpu *
   kernel/locking/lockdep.c:4282:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:4282:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:4282:13: sparse:     got unsigned int [noderef] __percpu *
   kernel/locking/lockdep.c:4282:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:4282:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:4282:13: sparse:     got unsigned int [noderef] __percpu *
   kernel/locking/lockdep.c:4282:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:4282:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:4282:13: sparse:     got unsigned int [noderef] __percpu *
   kernel/locking/lockdep.c:4282:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:4282:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:4282:13: sparse:     got unsigned int [noderef] __percpu *
   kernel/locking/lockdep.c:4285:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/locking/lockdep.c:4285:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:4285:13: sparse:     got int [noderef] __percpu *
   kernel/locking/lockdep.c:4285:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/locking/lockdep.c:4285:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:4285:13: sparse:     got int [noderef] __percpu *
   kernel/locking/lockdep.c:4285:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/locking/lockdep.c:4285:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:4285:13: sparse:     got int [noderef] __percpu *
   kernel/locking/lockdep.c:4285:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/locking/lockdep.c:4285:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:4285:13: sparse:     got int [noderef] __percpu *
   kernel/locking/lockdep.c:4351:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:4351:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:4351:13: sparse:     got unsigned int [noderef] __percpu *
   kernel/locking/lockdep.c:4351:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:4351:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:4351:13: sparse:     got unsigned int [noderef] __percpu *
   kernel/locking/lockdep.c:4351:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:4351:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:4351:13: sparse:     got unsigned int [noderef] __percpu *
   kernel/locking/lockdep.c:4351:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/locking/lockdep.c:4351:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:4351:13: sparse:     got unsigned int [noderef] __percpu *
   kernel/locking/lockdep.c:4354:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/locking/lockdep.c:4354:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:4354:13: sparse:     got int [noderef] __percpu *
   kernel/locking/lockdep.c:4354:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/locking/lockdep.c:4354:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:4354:13: sparse:     got int [noderef] __percpu *
   kernel/locking/lockdep.c:4354:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/locking/lockdep.c:4354:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:4354:13: sparse:     got int [noderef] __percpu *
   kernel/locking/lockdep.c:4354:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/locking/lockdep.c:4354:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:4354:13: sparse:     got int [noderef] __percpu *
   kernel/locking/lockdep.c:4414:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/locking/lockdep.c:4414:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:4414:13: sparse:     got int [noderef] __percpu *
   kernel/locking/lockdep.c:4414:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/locking/lockdep.c:4414:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:4414:13: sparse:     got int [noderef] __percpu *
   kernel/locking/lockdep.c:4414:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/locking/lockdep.c:4414:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:4414:13: sparse:     got int [noderef] __percpu *
   kernel/locking/lockdep.c:4414:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/locking/lockdep.c:4414:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:4414:13: sparse:     got int [noderef] __percpu *
   kernel/locking/lockdep.c:4465:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/locking/lockdep.c:4465:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:4465:13: sparse:     got int [noderef] __percpu *
   kernel/locking/lockdep.c:4465:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/locking/lockdep.c:4465:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:4465:13: sparse:     got int [noderef] __percpu *
   kernel/locking/lockdep.c:4465:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/locking/lockdep.c:4465:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:4465:13: sparse:     got int [noderef] __percpu *
   kernel/locking/lockdep.c:4465:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/locking/lockdep.c:4465:13: sparse:     expected void *ptr
   kernel/locking/lockdep.c:4465:13: sparse:     got int [noderef] __percpu *
   kernel/locking/lockdep.c:5505:21: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/locking/lockdep.c:5505:21: sparse:     expected void *ptr
   kernel/locking/lockdep.c:5505:21: sparse:     got int [noderef] __percpu *
   kernel/locking/lockdep.c:5505:21: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/locking/lockdep.c:5505:21: sparse:     expected void *ptr
   kernel/locking/lockdep.c:5505:21: sparse:     got int [noderef] __percpu *
   kernel/locking/lockdep.c:5505:21: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/locking/lockdep.c:5505:21: sparse:     expected void *ptr
   kernel/locking/lockdep.c:5505:21: sparse:     got int [noderef] __percpu *
   kernel/locking/lockdep.c:5505:21: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/locking/lockdep.c:5505:21: sparse:     expected void *ptr
   kernel/locking/lockdep.c:5505:21: sparse:     got int [noderef] __percpu *
   kernel/locking/lockdep.c:5509:21: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/locking/lockdep.c:5509:21: sparse:     expected void *ptr
--
>> fs/eventpoll.c:620:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   fs/eventpoll.c:620:9: sparse:     expected void *ptr
   fs/eventpoll.c:620:9: sparse:     got unsigned int [noderef] __percpu *
>> fs/eventpoll.c:620:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   fs/eventpoll.c:620:9: sparse:     expected void *ptr
   fs/eventpoll.c:620:9: sparse:     got unsigned int [noderef] __percpu *
>> fs/eventpoll.c:620:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   fs/eventpoll.c:620:9: sparse:     expected void *ptr
   fs/eventpoll.c:620:9: sparse:     got unsigned int [noderef] __percpu *
>> fs/eventpoll.c:620:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   fs/eventpoll.c:620:9: sparse:     expected void *ptr
   fs/eventpoll.c:620:9: sparse:     got unsigned int [noderef] __percpu *
>> fs/eventpoll.c:620:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   fs/eventpoll.c:620:9: sparse:     expected void *ptr
   fs/eventpoll.c:620:9: sparse:     got int [noderef] __percpu *
>> fs/eventpoll.c:620:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   fs/eventpoll.c:620:9: sparse:     expected void *ptr
   fs/eventpoll.c:620:9: sparse:     got int [noderef] __percpu *
>> fs/eventpoll.c:620:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   fs/eventpoll.c:620:9: sparse:     expected void *ptr
   fs/eventpoll.c:620:9: sparse:     got int [noderef] __percpu *
>> fs/eventpoll.c:620:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   fs/eventpoll.c:620:9: sparse:     expected void *ptr
   fs/eventpoll.c:620:9: sparse:     got int [noderef] __percpu *
   fs/eventpoll.c:692:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   fs/eventpoll.c:692:9: sparse:     expected void *ptr
   fs/eventpoll.c:692:9: sparse:     got unsigned int [noderef] __percpu *
   fs/eventpoll.c:692:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   fs/eventpoll.c:692:9: sparse:     expected void *ptr
   fs/eventpoll.c:692:9: sparse:     got unsigned int [noderef] __percpu *
   fs/eventpoll.c:692:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   fs/eventpoll.c:692:9: sparse:     expected void *ptr
   fs/eventpoll.c:692:9: sparse:     got unsigned int [noderef] __percpu *
   fs/eventpoll.c:692:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   fs/eventpoll.c:692:9: sparse:     expected void *ptr
   fs/eventpoll.c:692:9: sparse:     got unsigned int [noderef] __percpu *
   fs/eventpoll.c:692:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   fs/eventpoll.c:692:9: sparse:     expected void *ptr
   fs/eventpoll.c:692:9: sparse:     got int [noderef] __percpu *
   fs/eventpoll.c:692:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   fs/eventpoll.c:692:9: sparse:     expected void *ptr
   fs/eventpoll.c:692:9: sparse:     got int [noderef] __percpu *
   fs/eventpoll.c:692:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   fs/eventpoll.c:692:9: sparse:     expected void *ptr
   fs/eventpoll.c:692:9: sparse:     got int [noderef] __percpu *
   fs/eventpoll.c:692:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   fs/eventpoll.c:692:9: sparse:     expected void *ptr
   fs/eventpoll.c:692:9: sparse:     got int [noderef] __percpu *
   fs/eventpoll.c:1456:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   fs/eventpoll.c:1456:9: sparse:     expected void *ptr
   fs/eventpoll.c:1456:9: sparse:     got unsigned int [noderef] __percpu *
   fs/eventpoll.c:1456:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   fs/eventpoll.c:1456:9: sparse:     expected void *ptr
   fs/eventpoll.c:1456:9: sparse:     got unsigned int [noderef] __percpu *
   fs/eventpoll.c:1456:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   fs/eventpoll.c:1456:9: sparse:     expected void *ptr
   fs/eventpoll.c:1456:9: sparse:     got unsigned int [noderef] __percpu *
   fs/eventpoll.c:1456:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   fs/eventpoll.c:1456:9: sparse:     expected void *ptr
   fs/eventpoll.c:1456:9: sparse:     got unsigned int [noderef] __percpu *
   fs/eventpoll.c:1456:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   fs/eventpoll.c:1456:9: sparse:     expected void *ptr
   fs/eventpoll.c:1456:9: sparse:     got int [noderef] __percpu *
   fs/eventpoll.c:1456:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   fs/eventpoll.c:1456:9: sparse:     expected void *ptr
   fs/eventpoll.c:1456:9: sparse:     got int [noderef] __percpu *
   fs/eventpoll.c:1456:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   fs/eventpoll.c:1456:9: sparse:     expected void *ptr
   fs/eventpoll.c:1456:9: sparse:     got int [noderef] __percpu *
   fs/eventpoll.c:1456:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   fs/eventpoll.c:1456:9: sparse:     expected void *ptr
   fs/eventpoll.c:1456:9: sparse:     got int [noderef] __percpu *
   fs/eventpoll.c:1571:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   fs/eventpoll.c:1571:9: sparse:     expected void *ptr
   fs/eventpoll.c:1571:9: sparse:     got unsigned int [noderef] __percpu *
   fs/eventpoll.c:1571:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   fs/eventpoll.c:1571:9: sparse:     expected void *ptr
   fs/eventpoll.c:1571:9: sparse:     got unsigned int [noderef] __percpu *
   fs/eventpoll.c:1571:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   fs/eventpoll.c:1571:9: sparse:     expected void *ptr
   fs/eventpoll.c:1571:9: sparse:     got unsigned int [noderef] __percpu *
   fs/eventpoll.c:1571:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   fs/eventpoll.c:1571:9: sparse:     expected void *ptr
   fs/eventpoll.c:1571:9: sparse:     got unsigned int [noderef] __percpu *
   fs/eventpoll.c:1571:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   fs/eventpoll.c:1571:9: sparse:     expected void *ptr
   fs/eventpoll.c:1571:9: sparse:     got int [noderef] __percpu *
   fs/eventpoll.c:1571:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   fs/eventpoll.c:1571:9: sparse:     expected void *ptr
   fs/eventpoll.c:1571:9: sparse:     got int [noderef] __percpu *
   fs/eventpoll.c:1571:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   fs/eventpoll.c:1571:9: sparse:     expected void *ptr
   fs/eventpoll.c:1571:9: sparse:     got int [noderef] __percpu *
   fs/eventpoll.c:1571:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   fs/eventpoll.c:1571:9: sparse:     expected void *ptr
   fs/eventpoll.c:1571:9: sparse:     got int [noderef] __percpu *
   fs/eventpoll.c:1775:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   fs/eventpoll.c:1775:9: sparse:     expected void *ptr
   fs/eventpoll.c:1775:9: sparse:     got unsigned int [noderef] __percpu *
   fs/eventpoll.c:1775:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   fs/eventpoll.c:1775:9: sparse:     expected void *ptr
   fs/eventpoll.c:1775:9: sparse:     got unsigned int [noderef] __percpu *
   fs/eventpoll.c:1775:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   fs/eventpoll.c:1775:9: sparse:     expected void *ptr
   fs/eventpoll.c:1775:9: sparse:     got unsigned int [noderef] __percpu *
   fs/eventpoll.c:1775:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   fs/eventpoll.c:1775:9: sparse:     expected void *ptr
   fs/eventpoll.c:1775:9: sparse:     got unsigned int [noderef] __percpu *
   fs/eventpoll.c:1775:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   fs/eventpoll.c:1775:9: sparse:     expected void *ptr
   fs/eventpoll.c:1775:9: sparse:     got int [noderef] __percpu *
   fs/eventpoll.c:1775:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   fs/eventpoll.c:1775:9: sparse:     expected void *ptr
   fs/eventpoll.c:1775:9: sparse:     got int [noderef] __percpu *
   fs/eventpoll.c:1775:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   fs/eventpoll.c:1775:9: sparse:     expected void *ptr
   fs/eventpoll.c:1775:9: sparse:     got int [noderef] __percpu *
   fs/eventpoll.c:1775:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   fs/eventpoll.c:1775:9: sparse:     expected void *ptr
   fs/eventpoll.c:1775:9: sparse:     got int [noderef] __percpu *
   fs/eventpoll.c: note: in included file (through include/linux/uaccess.h, include/linux/sched/task.h, include/linux/sched/signal.h):
   arch/loongarch/include/asm/uaccess.h:232:32: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void const *from @@     got void const [noderef] __user *from @@
--
   kernel/rcu/update.c: note: in included file:
>> kernel/rcu/tasks.h:256:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/rcu/tasks.h:256:17: sparse:     expected void *ptr
   kernel/rcu/tasks.h:256:17: sparse:     got unsigned int [noderef] __percpu *
>> kernel/rcu/tasks.h:256:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/rcu/tasks.h:256:17: sparse:     expected void *ptr
   kernel/rcu/tasks.h:256:17: sparse:     got unsigned int [noderef] __percpu *
>> kernel/rcu/tasks.h:256:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/rcu/tasks.h:256:17: sparse:     expected void *ptr
   kernel/rcu/tasks.h:256:17: sparse:     got unsigned int [noderef] __percpu *
>> kernel/rcu/tasks.h:256:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/rcu/tasks.h:256:17: sparse:     expected void *ptr
   kernel/rcu/tasks.h:256:17: sparse:     got unsigned int [noderef] __percpu *
>> kernel/rcu/tasks.h:256:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/rcu/tasks.h:256:17: sparse:     expected void *ptr
   kernel/rcu/tasks.h:256:17: sparse:     got int [noderef] __percpu *
>> kernel/rcu/tasks.h:256:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/rcu/tasks.h:256:17: sparse:     expected void *ptr
   kernel/rcu/tasks.h:256:17: sparse:     got int [noderef] __percpu *
>> kernel/rcu/tasks.h:256:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/rcu/tasks.h:256:17: sparse:     expected void *ptr
   kernel/rcu/tasks.h:256:17: sparse:     got int [noderef] __percpu *
>> kernel/rcu/tasks.h:256:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/rcu/tasks.h:256:17: sparse:     expected void *ptr
   kernel/rcu/tasks.h:256:17: sparse:     got int [noderef] __percpu *
   kernel/rcu/tasks.h:303:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/rcu/tasks.h:303:17: sparse:     expected void *ptr
   kernel/rcu/tasks.h:303:17: sparse:     got unsigned int [noderef] __percpu *
   kernel/rcu/tasks.h:303:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/rcu/tasks.h:303:17: sparse:     expected void *ptr
   kernel/rcu/tasks.h:303:17: sparse:     got unsigned int [noderef] __percpu *
   kernel/rcu/tasks.h:303:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/rcu/tasks.h:303:17: sparse:     expected void *ptr
   kernel/rcu/tasks.h:303:17: sparse:     got unsigned int [noderef] __percpu *
   kernel/rcu/tasks.h:303:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/rcu/tasks.h:303:17: sparse:     expected void *ptr
   kernel/rcu/tasks.h:303:17: sparse:     got unsigned int [noderef] __percpu *
   kernel/rcu/tasks.h:303:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/rcu/tasks.h:303:17: sparse:     expected void *ptr
   kernel/rcu/tasks.h:303:17: sparse:     got int [noderef] __percpu *
   kernel/rcu/tasks.h:303:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/rcu/tasks.h:303:17: sparse:     expected void *ptr
   kernel/rcu/tasks.h:303:17: sparse:     got int [noderef] __percpu *
   kernel/rcu/tasks.h:303:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/rcu/tasks.h:303:17: sparse:     expected void *ptr
   kernel/rcu/tasks.h:303:17: sparse:     got int [noderef] __percpu *
   kernel/rcu/tasks.h:303:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/rcu/tasks.h:303:17: sparse:     expected void *ptr
   kernel/rcu/tasks.h:303:17: sparse:     got int [noderef] __percpu *
   kernel/rcu/tasks.h:309:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/rcu/tasks.h:309:9: sparse:     expected void *ptr
   kernel/rcu/tasks.h:309:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/rcu/tasks.h:309:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/rcu/tasks.h:309:9: sparse:     expected void *ptr
   kernel/rcu/tasks.h:309:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/rcu/tasks.h:309:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/rcu/tasks.h:309:9: sparse:     expected void *ptr
   kernel/rcu/tasks.h:309:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/rcu/tasks.h:309:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/rcu/tasks.h:309:9: sparse:     expected void *ptr
   kernel/rcu/tasks.h:309:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/rcu/tasks.h:309:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/rcu/tasks.h:309:9: sparse:     expected void *ptr
   kernel/rcu/tasks.h:309:9: sparse:     got int [noderef] __percpu *
   kernel/rcu/tasks.h:309:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/rcu/tasks.h:309:9: sparse:     expected void *ptr
   kernel/rcu/tasks.h:309:9: sparse:     got int [noderef] __percpu *
   kernel/rcu/tasks.h:309:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/rcu/tasks.h:309:9: sparse:     expected void *ptr
   kernel/rcu/tasks.h:309:9: sparse:     got int [noderef] __percpu *
   kernel/rcu/tasks.h:309:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/rcu/tasks.h:309:9: sparse:     expected void *ptr
   kernel/rcu/tasks.h:309:9: sparse:     got int [noderef] __percpu *
   kernel/rcu/tasks.h:375:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/rcu/tasks.h:375:17: sparse:     expected void *ptr
   kernel/rcu/tasks.h:375:17: sparse:     got unsigned int [noderef] __percpu *
   kernel/rcu/tasks.h:375:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/rcu/tasks.h:375:17: sparse:     expected void *ptr
   kernel/rcu/tasks.h:375:17: sparse:     got unsigned int [noderef] __percpu *
   kernel/rcu/tasks.h:375:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/rcu/tasks.h:375:17: sparse:     expected void *ptr
   kernel/rcu/tasks.h:375:17: sparse:     got unsigned int [noderef] __percpu *
   kernel/rcu/tasks.h:375:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/rcu/tasks.h:375:17: sparse:     expected void *ptr
   kernel/rcu/tasks.h:375:17: sparse:     got unsigned int [noderef] __percpu *
   kernel/rcu/tasks.h:375:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/rcu/tasks.h:375:17: sparse:     expected void *ptr
   kernel/rcu/tasks.h:375:17: sparse:     got int [noderef] __percpu *
   kernel/rcu/tasks.h:375:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/rcu/tasks.h:375:17: sparse:     expected void *ptr
   kernel/rcu/tasks.h:375:17: sparse:     got int [noderef] __percpu *
   kernel/rcu/tasks.h:375:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/rcu/tasks.h:375:17: sparse:     expected void *ptr
   kernel/rcu/tasks.h:375:17: sparse:     got int [noderef] __percpu *
   kernel/rcu/tasks.h:375:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/rcu/tasks.h:375:17: sparse:     expected void *ptr
   kernel/rcu/tasks.h:375:17: sparse:     got int [noderef] __percpu *
   kernel/rcu/tasks.h:415:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/rcu/tasks.h:415:17: sparse:     expected void *ptr
   kernel/rcu/tasks.h:415:17: sparse:     got unsigned int [noderef] __percpu *
   kernel/rcu/tasks.h:415:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/rcu/tasks.h:415:17: sparse:     expected void *ptr
   kernel/rcu/tasks.h:415:17: sparse:     got unsigned int [noderef] __percpu *
   kernel/rcu/tasks.h:415:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/rcu/tasks.h:415:17: sparse:     expected void *ptr
   kernel/rcu/tasks.h:415:17: sparse:     got unsigned int [noderef] __percpu *
   kernel/rcu/tasks.h:415:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/rcu/tasks.h:415:17: sparse:     expected void *ptr
   kernel/rcu/tasks.h:415:17: sparse:     got unsigned int [noderef] __percpu *
   kernel/rcu/tasks.h:415:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/rcu/tasks.h:415:17: sparse:     expected void *ptr
   kernel/rcu/tasks.h:415:17: sparse:     got int [noderef] __percpu *
   kernel/rcu/tasks.h:415:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/rcu/tasks.h:415:17: sparse:     expected void *ptr
   kernel/rcu/tasks.h:415:17: sparse:     got int [noderef] __percpu *
   kernel/rcu/tasks.h:415:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/rcu/tasks.h:415:17: sparse:     expected void *ptr
   kernel/rcu/tasks.h:415:17: sparse:     got int [noderef] __percpu *
   kernel/rcu/tasks.h:415:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/rcu/tasks.h:415:17: sparse:     expected void *ptr
   kernel/rcu/tasks.h:415:17: sparse:     got int [noderef] __percpu *
   kernel/rcu/tasks.h:476:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/rcu/tasks.h:476:9: sparse:     expected void *ptr
--
>> kernel/entry/common.c:195:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/entry/common.c:195:9: sparse:     expected void *ptr
   kernel/entry/common.c:195:9: sparse:     got unsigned int [noderef] __percpu *
>> kernel/entry/common.c:195:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/entry/common.c:195:9: sparse:     expected void *ptr
   kernel/entry/common.c:195:9: sparse:     got unsigned int [noderef] __percpu *
>> kernel/entry/common.c:195:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/entry/common.c:195:9: sparse:     expected void *ptr
   kernel/entry/common.c:195:9: sparse:     got unsigned int [noderef] __percpu *
>> kernel/entry/common.c:195:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/entry/common.c:195:9: sparse:     expected void *ptr
   kernel/entry/common.c:195:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/entry/common.c:195:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/entry/common.c:195:9: sparse:     expected void *ptr
   kernel/entry/common.c:195:9: sparse:     got int [noderef] __percpu *
   kernel/entry/common.c:195:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/entry/common.c:195:9: sparse:     expected void *ptr
   kernel/entry/common.c:195:9: sparse:     got int [noderef] __percpu *
   kernel/entry/common.c:195:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/entry/common.c:195:9: sparse:     expected void *ptr
   kernel/entry/common.c:195:9: sparse:     got int [noderef] __percpu *
   kernel/entry/common.c:195:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/entry/common.c:195:9: sparse:     expected void *ptr
   kernel/entry/common.c:195:9: sparse:     got int [noderef] __percpu *
   kernel/entry/common.c:208:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/entry/common.c:208:9: sparse:     expected void *ptr
   kernel/entry/common.c:208:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/entry/common.c:208:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/entry/common.c:208:9: sparse:     expected void *ptr
   kernel/entry/common.c:208:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/entry/common.c:208:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/entry/common.c:208:9: sparse:     expected void *ptr
   kernel/entry/common.c:208:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/entry/common.c:208:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/entry/common.c:208:9: sparse:     expected void *ptr
   kernel/entry/common.c:208:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/entry/common.c:208:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/entry/common.c:208:9: sparse:     expected void *ptr
   kernel/entry/common.c:208:9: sparse:     got int [noderef] __percpu *
   kernel/entry/common.c:208:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/entry/common.c:208:9: sparse:     expected void *ptr
   kernel/entry/common.c:208:9: sparse:     got int [noderef] __percpu *
   kernel/entry/common.c:208:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/entry/common.c:208:9: sparse:     expected void *ptr
   kernel/entry/common.c:208:9: sparse:     got int [noderef] __percpu *
   kernel/entry/common.c:208:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/entry/common.c:208:9: sparse:     expected void *ptr
   kernel/entry/common.c:208:9: sparse:     got int [noderef] __percpu *
   kernel/entry/common.c:404:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/entry/common.c:404:9: sparse:     expected void *ptr
   kernel/entry/common.c:404:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/entry/common.c:404:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/entry/common.c:404:9: sparse:     expected void *ptr
   kernel/entry/common.c:404:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/entry/common.c:404:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/entry/common.c:404:9: sparse:     expected void *ptr
   kernel/entry/common.c:404:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/entry/common.c:404:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/entry/common.c:404:9: sparse:     expected void *ptr
   kernel/entry/common.c:404:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/entry/common.c:404:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/entry/common.c:404:9: sparse:     expected void *ptr
   kernel/entry/common.c:404:9: sparse:     got int [noderef] __percpu *
   kernel/entry/common.c:404:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/entry/common.c:404:9: sparse:     expected void *ptr
   kernel/entry/common.c:404:9: sparse:     got int [noderef] __percpu *
   kernel/entry/common.c:404:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/entry/common.c:404:9: sparse:     expected void *ptr
   kernel/entry/common.c:404:9: sparse:     got int [noderef] __percpu *
   kernel/entry/common.c:404:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/entry/common.c:404:9: sparse:     expected void *ptr
   kernel/entry/common.c:404:9: sparse:     got int [noderef] __percpu *
   kernel/entry/common.c:447:29: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/entry/common.c:447:29: sparse:     expected void *ptr
   kernel/entry/common.c:447:29: sparse:     got int [noderef] __percpu *
   kernel/entry/common.c:447:29: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/entry/common.c:447:29: sparse:     expected void *ptr
   kernel/entry/common.c:447:29: sparse:     got int [noderef] __percpu *
   kernel/entry/common.c:447:29: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/entry/common.c:447:29: sparse:     expected void *ptr
   kernel/entry/common.c:447:29: sparse:     got int [noderef] __percpu *
   kernel/entry/common.c:447:29: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/entry/common.c:447:29: sparse:     expected void *ptr
   kernel/entry/common.c:447:29: sparse:     got int [noderef] __percpu *
--
>> kernel/time/hrtimer.c:1006:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/time/hrtimer.c:1006:9: sparse:     expected void *ptr
   kernel/time/hrtimer.c:1006:9: sparse:     got unsigned int [noderef] __percpu *
>> kernel/time/hrtimer.c:1006:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/time/hrtimer.c:1006:9: sparse:     expected void *ptr
   kernel/time/hrtimer.c:1006:9: sparse:     got unsigned int [noderef] __percpu *
>> kernel/time/hrtimer.c:1006:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/time/hrtimer.c:1006:9: sparse:     expected void *ptr
   kernel/time/hrtimer.c:1006:9: sparse:     got unsigned int [noderef] __percpu *
>> kernel/time/hrtimer.c:1006:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/time/hrtimer.c:1006:9: sparse:     expected void *ptr
   kernel/time/hrtimer.c:1006:9: sparse:     got unsigned int [noderef] __percpu *
>> kernel/time/hrtimer.c:1006:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/time/hrtimer.c:1006:9: sparse:     expected void *ptr
   kernel/time/hrtimer.c:1006:9: sparse:     got int [noderef] __percpu *
>> kernel/time/hrtimer.c:1006:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/time/hrtimer.c:1006:9: sparse:     expected void *ptr
   kernel/time/hrtimer.c:1006:9: sparse:     got int [noderef] __percpu *
>> kernel/time/hrtimer.c:1006:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/time/hrtimer.c:1006:9: sparse:     expected void *ptr
   kernel/time/hrtimer.c:1006:9: sparse:     got int [noderef] __percpu *
>> kernel/time/hrtimer.c:1006:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/time/hrtimer.c:1006:9: sparse:     expected void *ptr
   kernel/time/hrtimer.c:1006:9: sparse:     got int [noderef] __percpu *
--
>> kernel/time/posix-cpu-timers.c:1380:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/time/posix-cpu-timers.c:1380:9: sparse:     expected void *ptr
   kernel/time/posix-cpu-timers.c:1380:9: sparse:     got unsigned int [noderef] __percpu *
>> kernel/time/posix-cpu-timers.c:1380:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/time/posix-cpu-timers.c:1380:9: sparse:     expected void *ptr
   kernel/time/posix-cpu-timers.c:1380:9: sparse:     got unsigned int [noderef] __percpu *
>> kernel/time/posix-cpu-timers.c:1380:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/time/posix-cpu-timers.c:1380:9: sparse:     expected void *ptr
   kernel/time/posix-cpu-timers.c:1380:9: sparse:     got unsigned int [noderef] __percpu *
>> kernel/time/posix-cpu-timers.c:1380:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/time/posix-cpu-timers.c:1380:9: sparse:     expected void *ptr
   kernel/time/posix-cpu-timers.c:1380:9: sparse:     got unsigned int [noderef] __percpu *
>> kernel/time/posix-cpu-timers.c:1380:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/time/posix-cpu-timers.c:1380:9: sparse:     expected void *ptr
   kernel/time/posix-cpu-timers.c:1380:9: sparse:     got int [noderef] __percpu *
>> kernel/time/posix-cpu-timers.c:1380:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/time/posix-cpu-timers.c:1380:9: sparse:     expected void *ptr
   kernel/time/posix-cpu-timers.c:1380:9: sparse:     got int [noderef] __percpu *
>> kernel/time/posix-cpu-timers.c:1380:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/time/posix-cpu-timers.c:1380:9: sparse:     expected void *ptr
   kernel/time/posix-cpu-timers.c:1380:9: sparse:     got int [noderef] __percpu *
>> kernel/time/posix-cpu-timers.c:1380:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/time/posix-cpu-timers.c:1380:9: sparse:     expected void *ptr
   kernel/time/posix-cpu-timers.c:1380:9: sparse:     got int [noderef] __percpu *
   kernel/time/posix-cpu-timers.c: note: in included file:
   include/linux/sched/signal.h:752:37: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   include/linux/sched/signal.h:752:37: sparse:     expected struct spinlock [usertype] *lock
   include/linux/sched/signal.h:752:37: sparse:     got struct spinlock [noderef] __rcu *
   kernel/time/posix-cpu-timers.c:42:5: sparse: sparse: context imbalance in 'update_rlimit_cpu' - different lock contexts for basic block
   include/linux/sched/signal.h:752:37: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   include/linux/sched/signal.h:752:37: sparse:     expected struct spinlock [usertype] *lock
   include/linux/sched/signal.h:752:37: sparse:     got struct spinlock [noderef] __rcu *
   include/linux/sched/signal.h:752:37: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   include/linux/sched/signal.h:752:37: sparse:     expected struct spinlock [usertype] *lock
   include/linux/sched/signal.h:752:37: sparse:     got struct spinlock [noderef] __rcu *
   include/linux/sched/signal.h:752:37: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   include/linux/sched/signal.h:752:37: sparse:     expected struct spinlock [usertype] *lock
   include/linux/sched/signal.h:752:37: sparse:     got struct spinlock [noderef] __rcu *
   include/linux/sched/signal.h:752:37: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   include/linux/sched/signal.h:752:37: sparse:     expected struct spinlock [usertype] *lock
   include/linux/sched/signal.h:752:37: sparse:     got struct spinlock [noderef] __rcu *
   include/linux/sched/signal.h:752:37: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   include/linux/sched/signal.h:752:37: sparse:     expected struct spinlock [usertype] *lock
   include/linux/sched/signal.h:752:37: sparse:     got struct spinlock [noderef] __rcu *
   include/linux/sched/signal.h:752:37: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct spinlock [usertype] *lock @@     got struct spinlock [noderef] __rcu * @@
   include/linux/sched/signal.h:752:37: sparse:     expected struct spinlock [usertype] *lock
   include/linux/sched/signal.h:752:37: sparse:     got struct spinlock [noderef] __rcu *
--
   lib/flex_proportions.c: note: in included file (through include/linux/mmzone.h, include/linux/gfp.h, include/linux/percpu_counter.h, ...):
>> include/linux/seqlock.h:269:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   include/linux/seqlock.h:269:9: sparse:     expected void *ptr
   include/linux/seqlock.h:269:9: sparse:     got unsigned int [noderef] __percpu *
>> include/linux/seqlock.h:269:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   include/linux/seqlock.h:269:9: sparse:     expected void *ptr
   include/linux/seqlock.h:269:9: sparse:     got unsigned int [noderef] __percpu *
>> include/linux/seqlock.h:269:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   include/linux/seqlock.h:269:9: sparse:     expected void *ptr
   include/linux/seqlock.h:269:9: sparse:     got unsigned int [noderef] __percpu *
>> include/linux/seqlock.h:269:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   include/linux/seqlock.h:269:9: sparse:     expected void *ptr
   include/linux/seqlock.h:269:9: sparse:     got unsigned int [noderef] __percpu *
>> include/linux/seqlock.h:269:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   include/linux/seqlock.h:269:9: sparse:     expected void *ptr
   include/linux/seqlock.h:269:9: sparse:     got int [noderef] __percpu *
>> include/linux/seqlock.h:269:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   include/linux/seqlock.h:269:9: sparse:     expected void *ptr
   include/linux/seqlock.h:269:9: sparse:     got int [noderef] __percpu *
>> include/linux/seqlock.h:269:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   include/linux/seqlock.h:269:9: sparse:     expected void *ptr
   include/linux/seqlock.h:269:9: sparse:     got int [noderef] __percpu *
>> include/linux/seqlock.h:269:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   include/linux/seqlock.h:269:9: sparse:     expected void *ptr
   include/linux/seqlock.h:269:9: sparse:     got int [noderef] __percpu *

vim +278 kernel/irq_work.c

76a33061b9323b Frederic Weisbecker       2014-08-16  271  
e360adbe29241a Peter Zijlstra            2010-10-14  272  /*
e360adbe29241a Peter Zijlstra            2010-10-14  273   * Synchronize against the irq_work @entry, ensures the entry is not
e360adbe29241a Peter Zijlstra            2010-10-14  274   * currently in use.
e360adbe29241a Peter Zijlstra            2010-10-14  275   */
38aaf8090d34b6 Huang Ying                2011-09-08  276  void irq_work_sync(struct irq_work *work)
e360adbe29241a Peter Zijlstra            2010-10-14  277  {
3c7169a3bf8216 Frederic Weisbecker       2017-11-06 @278  	lockdep_assert_irqs_enabled();
810979682ccc98 Sebastian Andrzej Siewior 2021-10-06  279  	might_sleep();
810979682ccc98 Sebastian Andrzej Siewior 2021-10-06  280  
09089db79859cb Sebastian Andrzej Siewior 2021-10-06  281  	if ((IS_ENABLED(CONFIG_PREEMPT_RT) && !irq_work_is_hard(work)) ||
09089db79859cb Sebastian Andrzej Siewior 2021-10-06  282  	    !arch_irq_work_has_interrupt()) {
810979682ccc98 Sebastian Andrzej Siewior 2021-10-06  283  		rcuwait_wait_event(&work->irqwait, !irq_work_is_busy(work),
810979682ccc98 Sebastian Andrzej Siewior 2021-10-06  284  				   TASK_UNINTERRUPTIBLE);
810979682ccc98 Sebastian Andrzej Siewior 2021-10-06  285  		return;
810979682ccc98 Sebastian Andrzej Siewior 2021-10-06  286  	}
e360adbe29241a Peter Zijlstra            2010-10-14  287  
7a9f50a05843fe Peter Zijlstra            2020-06-15  288  	while (irq_work_is_busy(work))
e360adbe29241a Peter Zijlstra            2010-10-14  289  		cpu_relax();
e360adbe29241a Peter Zijlstra            2010-10-14  290  }
e360adbe29241a Peter Zijlstra            2010-10-14  291  EXPORT_SYMBOL_GPL(irq_work_sync);
b4c6f86ec2f648 Sebastian Andrzej Siewior 2021-10-07  292  

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH 3/3] LoongArch: Add stacktrace support
  2022-07-28 14:05 ` [PATCH 3/3] LoongArch: Add stacktrace support Qing Zhang
                     ` (3 preceding siblings ...)
  2022-08-05 20:31   ` kernel test robot
@ 2022-08-10 13:16   ` kernel test robot
  4 siblings, 0 replies; 15+ messages in thread
From: kernel test robot @ 2022-08-10 13:16 UTC (permalink / raw)
  To: Qing Zhang, Huacai Chen, WANG Xuerui
  Cc: kbuild-all, loongarch, linux-kernel, Jiaxun Yang, hejinyang

Hi Qing,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on linus/master]
[also build test WARNING on v5.19]
[cannot apply to next-20220810]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Qing-Zhang/LoongArch-Add-guess-unwinder-support/20220728-220739
base:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 6e7765cb477a9753670d4351d14de93f1e9dbbd4
config: loongarch-randconfig-s042-20220810 (https://download.01.org/0day-ci/archive/20220810/202208102109.mnxcQi3g-lkp@intel.com/config)
compiler: loongarch64-linux-gcc (GCC) 12.1.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # apt-get install sparse
        # sparse version: v0.6.4-39-gce1a6720-dirty
        # https://github.com/intel-lab-lkp/linux/commit/32ef6acf6f5ecfadda21be77cbebb07b1c69e56a
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review Qing-Zhang/LoongArch-Add-guess-unwinder-support/20220728-220739
        git checkout 32ef6acf6f5ecfadda21be77cbebb07b1c69e56a
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=loongarch SHELL=/bin/bash

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>

sparse warnings: (new ones prefixed by >>)
>> kernel/events/core.c:223:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/events/core.c:223:9: sparse:     expected void *ptr
   kernel/events/core.c:223:9: sparse:     got unsigned int [noderef] __percpu *
>> kernel/events/core.c:223:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/events/core.c:223:9: sparse:     expected void *ptr
   kernel/events/core.c:223:9: sparse:     got unsigned int [noderef] __percpu *
>> kernel/events/core.c:223:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/events/core.c:223:9: sparse:     expected void *ptr
   kernel/events/core.c:223:9: sparse:     got unsigned int [noderef] __percpu *
>> kernel/events/core.c:223:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/events/core.c:223:9: sparse:     expected void *ptr
   kernel/events/core.c:223:9: sparse:     got unsigned int [noderef] __percpu *
>> kernel/events/core.c:223:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/events/core.c:223:9: sparse:     expected void *ptr
   kernel/events/core.c:223:9: sparse:     got int [noderef] __percpu *
>> kernel/events/core.c:223:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/events/core.c:223:9: sparse:     expected void *ptr
   kernel/events/core.c:223:9: sparse:     got int [noderef] __percpu *
>> kernel/events/core.c:223:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/events/core.c:223:9: sparse:     expected void *ptr
   kernel/events/core.c:223:9: sparse:     got int [noderef] __percpu *
>> kernel/events/core.c:223:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/events/core.c:223:9: sparse:     expected void *ptr
   kernel/events/core.c:223:9: sparse:     got int [noderef] __percpu *
   kernel/events/core.c:320:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/events/core.c:320:9: sparse:     expected void *ptr
   kernel/events/core.c:320:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/events/core.c:320:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/events/core.c:320:9: sparse:     expected void *ptr
   kernel/events/core.c:320:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/events/core.c:320:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/events/core.c:320:9: sparse:     expected void *ptr
   kernel/events/core.c:320:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/events/core.c:320:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/events/core.c:320:9: sparse:     expected void *ptr
   kernel/events/core.c:320:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/events/core.c:320:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/events/core.c:320:9: sparse:     expected void *ptr
   kernel/events/core.c:320:9: sparse:     got int [noderef] __percpu *
   kernel/events/core.c:320:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/events/core.c:320:9: sparse:     expected void *ptr
   kernel/events/core.c:320:9: sparse:     got int [noderef] __percpu *
   kernel/events/core.c:320:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/events/core.c:320:9: sparse:     expected void *ptr
   kernel/events/core.c:320:9: sparse:     got int [noderef] __percpu *
   kernel/events/core.c:320:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/events/core.c:320:9: sparse:     expected void *ptr
   kernel/events/core.c:320:9: sparse:     got int [noderef] __percpu *
   kernel/events/core.c:1074:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/events/core.c:1074:9: sparse:     expected void *ptr
   kernel/events/core.c:1074:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/events/core.c:1074:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/events/core.c:1074:9: sparse:     expected void *ptr
   kernel/events/core.c:1074:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/events/core.c:1074:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/events/core.c:1074:9: sparse:     expected void *ptr
   kernel/events/core.c:1074:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/events/core.c:1074:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/events/core.c:1074:9: sparse:     expected void *ptr
   kernel/events/core.c:1074:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/events/core.c:1074:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/events/core.c:1074:9: sparse:     expected void *ptr
   kernel/events/core.c:1074:9: sparse:     got int [noderef] __percpu *
   kernel/events/core.c:1074:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/events/core.c:1074:9: sparse:     expected void *ptr
   kernel/events/core.c:1074:9: sparse:     got int [noderef] __percpu *
   kernel/events/core.c:1074:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/events/core.c:1074:9: sparse:     expected void *ptr
   kernel/events/core.c:1074:9: sparse:     got int [noderef] __percpu *
   kernel/events/core.c:1074:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/events/core.c:1074:9: sparse:     expected void *ptr
   kernel/events/core.c:1074:9: sparse:     got int [noderef] __percpu *
   kernel/events/core.c:1161:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/events/core.c:1161:9: sparse:     expected void *ptr
   kernel/events/core.c:1161:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/events/core.c:1161:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/events/core.c:1161:9: sparse:     expected void *ptr
   kernel/events/core.c:1161:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/events/core.c:1161:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/events/core.c:1161:9: sparse:     expected void *ptr
   kernel/events/core.c:1161:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/events/core.c:1161:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/events/core.c:1161:9: sparse:     expected void *ptr
   kernel/events/core.c:1161:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/events/core.c:1161:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/events/core.c:1161:9: sparse:     expected void *ptr
   kernel/events/core.c:1161:9: sparse:     got int [noderef] __percpu *
   kernel/events/core.c:1161:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/events/core.c:1161:9: sparse:     expected void *ptr
   kernel/events/core.c:1161:9: sparse:     got int [noderef] __percpu *
   kernel/events/core.c:1161:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/events/core.c:1161:9: sparse:     expected void *ptr
   kernel/events/core.c:1161:9: sparse:     got int [noderef] __percpu *
   kernel/events/core.c:1161:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/events/core.c:1161:9: sparse:     expected void *ptr
   kernel/events/core.c:1161:9: sparse:     got int [noderef] __percpu *
   kernel/events/core.c:1170:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/events/core.c:1170:9: sparse:     expected void *ptr
   kernel/events/core.c:1170:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/events/core.c:1170:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/events/core.c:1170:9: sparse:     expected void *ptr
   kernel/events/core.c:1170:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/events/core.c:1170:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/events/core.c:1170:9: sparse:     expected void *ptr
   kernel/events/core.c:1170:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/events/core.c:1170:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   kernel/events/core.c:1170:9: sparse:     expected void *ptr
   kernel/events/core.c:1170:9: sparse:     got unsigned int [noderef] __percpu *
   kernel/events/core.c:1170:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/events/core.c:1170:9: sparse:     expected void *ptr
   kernel/events/core.c:1170:9: sparse:     got int [noderef] __percpu *
   kernel/events/core.c:1170:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/events/core.c:1170:9: sparse:     expected void *ptr
   kernel/events/core.c:1170:9: sparse:     got int [noderef] __percpu *
   kernel/events/core.c:1170:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/events/core.c:1170:9: sparse:     expected void *ptr
   kernel/events/core.c:1170:9: sparse:     got int [noderef] __percpu *
   kernel/events/core.c:1170:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got int [noderef] __percpu * @@
   kernel/events/core.c:1170:9: sparse:     expected void *ptr
   kernel/events/core.c:1170:9: sparse:     got int [noderef] __percpu *
   kernel/events/core.c:1402:15: sparse: sparse: incompatible types in comparison expression (different address spaces):
   kernel/events/core.c:1402:15: sparse:    struct perf_event_context [noderef] __rcu *
--
>> crypto/crypto_engine.c:56:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   crypto/crypto_engine.c:56:9: sparse:     expected void *ptr
   crypto/crypto_engine.c:56:9: sparse:     got unsigned int [noderef] __percpu *
>> crypto/crypto_engine.c:56:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   crypto/crypto_engine.c:56:9: sparse:     expected void *ptr
   crypto/crypto_engine.c:56:9: sparse:     got unsigned int [noderef] __percpu *
>> crypto/crypto_engine.c:56:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   crypto/crypto_engine.c:56:9: sparse:     expected void *ptr
   crypto/crypto_engine.c:56:9: sparse:     got unsigned int [noderef] __percpu *
>> crypto/crypto_engine.c:56:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *ptr @@     got unsigned int [noderef] __percpu * @@
   crypto/crypto_engine.c:56:9: sparse:     expected void *ptr
   crypto/crypto_engine.c:56:9: sparse:     got unsigned int [noderef] __percpu *

vim +223 kernel/events/core.c

fae3fde65138b60 Peter Zijlstra      2016-01-11  213  
fae3fde65138b60 Peter Zijlstra      2016-01-11  214  static int event_function(void *info)
fae3fde65138b60 Peter Zijlstra      2016-01-11  215  {
fae3fde65138b60 Peter Zijlstra      2016-01-11  216  	struct event_function_struct *efs = info;
fae3fde65138b60 Peter Zijlstra      2016-01-11  217  	struct perf_event *event = efs->event;
fae3fde65138b60 Peter Zijlstra      2016-01-11  218  	struct perf_event_context *ctx = event->ctx;
fae3fde65138b60 Peter Zijlstra      2016-01-11  219  	struct perf_cpu_context *cpuctx = __get_cpu_context(ctx);
fae3fde65138b60 Peter Zijlstra      2016-01-11  220  	struct perf_event_context *task_ctx = cpuctx->task_ctx;
63b6da39bb38e8f Peter Zijlstra      2016-01-14  221  	int ret = 0;
fae3fde65138b60 Peter Zijlstra      2016-01-11  222  
164446455a5d3f1 Frederic Weisbecker 2017-11-06 @223  	lockdep_assert_irqs_disabled();
fae3fde65138b60 Peter Zijlstra      2016-01-11  224  
63b6da39bb38e8f Peter Zijlstra      2016-01-14  225  	perf_ctx_lock(cpuctx, task_ctx);
fae3fde65138b60 Peter Zijlstra      2016-01-11  226  	/*
fae3fde65138b60 Peter Zijlstra      2016-01-11  227  	 * Since we do the IPI call without holding ctx->lock things can have
fae3fde65138b60 Peter Zijlstra      2016-01-11  228  	 * changed, double check we hit the task we set out to hit.
fae3fde65138b60 Peter Zijlstra      2016-01-11  229  	 */
fae3fde65138b60 Peter Zijlstra      2016-01-11  230  	if (ctx->task) {
63b6da39bb38e8f Peter Zijlstra      2016-01-14  231  		if (ctx->task != current) {
0da4cf3e0a68c97 Peter Zijlstra      2016-02-24  232  			ret = -ESRCH;
63b6da39bb38e8f Peter Zijlstra      2016-01-14  233  			goto unlock;
fae3fde65138b60 Peter Zijlstra      2016-01-11  234  		}
fae3fde65138b60 Peter Zijlstra      2016-01-11  235  
fae3fde65138b60 Peter Zijlstra      2016-01-11  236  		/*
fae3fde65138b60 Peter Zijlstra      2016-01-11  237  		 * We only use event_function_call() on established contexts,
fae3fde65138b60 Peter Zijlstra      2016-01-11  238  		 * and event_function() is only ever called when active (or
fae3fde65138b60 Peter Zijlstra      2016-01-11  239  		 * rather, we'll have bailed in task_function_call() or the
fae3fde65138b60 Peter Zijlstra      2016-01-11  240  		 * above ctx->task != current test), therefore we must have
fae3fde65138b60 Peter Zijlstra      2016-01-11  241  		 * ctx->is_active here.
fae3fde65138b60 Peter Zijlstra      2016-01-11  242  		 */
fae3fde65138b60 Peter Zijlstra      2016-01-11  243  		WARN_ON_ONCE(!ctx->is_active);
fae3fde65138b60 Peter Zijlstra      2016-01-11  244  		/*
fae3fde65138b60 Peter Zijlstra      2016-01-11  245  		 * And since we have ctx->is_active, cpuctx->task_ctx must
fae3fde65138b60 Peter Zijlstra      2016-01-11  246  		 * match.
fae3fde65138b60 Peter Zijlstra      2016-01-11  247  		 */
63b6da39bb38e8f Peter Zijlstra      2016-01-14  248  		WARN_ON_ONCE(task_ctx != ctx);
63b6da39bb38e8f Peter Zijlstra      2016-01-14  249  	} else {
63b6da39bb38e8f Peter Zijlstra      2016-01-14  250  		WARN_ON_ONCE(&cpuctx->ctx != ctx);
fae3fde65138b60 Peter Zijlstra      2016-01-11  251  	}
63b6da39bb38e8f Peter Zijlstra      2016-01-14  252  
fae3fde65138b60 Peter Zijlstra      2016-01-11  253  	efs->func(event, cpuctx, ctx, efs->data);
63b6da39bb38e8f Peter Zijlstra      2016-01-14  254  unlock:
fae3fde65138b60 Peter Zijlstra      2016-01-11  255  	perf_ctx_unlock(cpuctx, task_ctx);
fae3fde65138b60 Peter Zijlstra      2016-01-11  256  
63b6da39bb38e8f Peter Zijlstra      2016-01-14  257  	return ret;
fae3fde65138b60 Peter Zijlstra      2016-01-11  258  }
fae3fde65138b60 Peter Zijlstra      2016-01-11  259  

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2022-08-10 13:16 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-28 14:05 [PATCH 1/3] LoongArch: Add guess unwinder support Qing Zhang
2022-07-28 14:05 ` [PATCH 2/3] LoongArch: Add prologue " Qing Zhang
2022-07-29  2:03   ` Youling Tang
2022-07-29  5:38     ` zhangqing
2022-07-29  2:14   ` Jinyang He
2022-07-29  5:39     ` zhangqing
2022-07-28 14:05 ` [PATCH 3/3] LoongArch: Add stacktrace support Qing Zhang
2022-07-29  2:13   ` Youling Tang
2022-07-31 12:17   ` kernel test robot
2022-08-02 19:18   ` kernel test robot
2022-08-05 20:31   ` kernel test robot
2022-08-10 13:16   ` kernel test robot
2022-07-29  2:01 ` [PATCH 1/3] LoongArch: Add guess unwinder support Youling Tang
2022-07-29  2:28   ` Jinyang He
2022-07-29  2:56     ` Youling Tang

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.