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>
---
arch/loongarch/Kconfig | 5 ++++
arch/loongarch/include/asm/processor.h | 9 +++++++
arch/loongarch/include/asm/switch_to.h | 14 ++++++----
arch/loongarch/include/asm/uaccess.h | 4 +--
arch/loongarch/kernel/Makefile | 1 +
arch/loongarch/kernel/asm-offsets.c | 2 ++
arch/loongarch/kernel/process.c | 3 +++
arch/loongarch/kernel/stacktrace.c | 37 ++++++++++++++++++++++++++
arch/loongarch/kernel/switch.S | 2 ++
9 files changed, 70 insertions(+), 7 deletions(-)
create mode 100644 arch/loongarch/kernel/stacktrace.c
diff --git a/arch/loongarch/Kconfig b/arch/loongarch/Kconfig
index 62b5b07fa4e1..85d0fa3147cd 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
@@ -140,6 +141,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..43a5ab162d38 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
@@ -28,10 +31,11 @@ extern asmlinkage struct task_struct *__switch_to(struct task_struct *prev,
* That is, everything following __switch_to() will be skipped for new threads.
* So everything that matters to new threads should be placed before __switch_to().
*/
-#define switch_to(prev, next, last) \
-do { \
- lose_fpu_inatomic(1, prev); \
- (last) = __switch_to(prev, next, task_thread_info(next)); \
+#define switch_to(prev, next, last) \
+do { \
+ lose_fpu_inatomic(1, prev); \
+ (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/include/asm/uaccess.h b/arch/loongarch/include/asm/uaccess.h
index 2b44edc604a2..a8ae2af4025a 100644
--- a/arch/loongarch/include/asm/uaccess.h
+++ b/arch/loongarch/include/asm/uaccess.h
@@ -229,13 +229,13 @@ extern unsigned long __copy_user(void *to, const void *from, __kernel_size_t n);
static inline unsigned long __must_check
raw_copy_from_user(void *to, const void __user *from, unsigned long n)
{
- return __copy_user(to, from, n);
+ return __copy_user(to, (__force const void *)from, n);
}
static inline unsigned long __must_check
raw_copy_to_user(void __user *to, const void *from, unsigned long n)
{
- return __copy_user(to, from, n);
+ return __copy_user((__force void *)to, from, n);
}
#define INLINE_COPY_FROM_USER
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 37e84ac8ffc2..43ebbc3990f7 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
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-20220812]
[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-unwinder-support/20220801-204020
base: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 3d7cb6b04c3f3115719235cc6866b10326de34cd
config: loongarch-randconfig-s033-20220814 (https://download.01.org/0day-ci/archive/20220814/202208141339.jCYoEcIL-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/102a43b57dafc9c0058a458a62d4133eb8020cbc
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Qing-Zhang/LoongArch-Add-unwinder-support/20220801-204020
git checkout 102a43b57dafc9c0058a458a62d4133eb8020cbc
# 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/smp.c:571:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/smp.c:571:9: sparse: expected void *ptr
kernel/smp.c:571:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/smp.c:571:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/smp.c:571:9: sparse: expected void *ptr
kernel/smp.c:571:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/smp.c:571:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/smp.c:571:9: sparse: expected void *ptr
kernel/smp.c:571:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/smp.c:571:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/smp.c:571:9: sparse: expected void *ptr
kernel/smp.c:571:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/smp.c:571:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/smp.c:571:9: sparse: expected void *ptr
kernel/smp.c:571:9: sparse: got int [noderef] __percpu *
>> kernel/smp.c:571:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/smp.c:571:9: sparse: expected void *ptr
kernel/smp.c:571:9: sparse: got int [noderef] __percpu *
>> kernel/smp.c:571:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/smp.c:571:9: sparse: expected void *ptr
kernel/smp.c:571:9: sparse: got int [noderef] __percpu *
>> kernel/smp.c:571:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/smp.c:571:9: sparse: expected void *ptr
kernel/smp.c:571:9: sparse: got int [noderef] __percpu *
kernel/smp.c:895:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/smp.c:895:9: sparse: expected void *ptr
kernel/smp.c:895:9: sparse: got unsigned int [noderef] __percpu *
kernel/smp.c:895:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/smp.c:895:9: sparse: expected void *ptr
kernel/smp.c:895:9: sparse: got unsigned int [noderef] __percpu *
kernel/smp.c:895:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/smp.c:895:9: sparse: expected void *ptr
kernel/smp.c:895:9: sparse: got unsigned int [noderef] __percpu *
kernel/smp.c:895:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/smp.c:895:9: sparse: expected void *ptr
kernel/smp.c:895:9: sparse: got unsigned int [noderef] __percpu *
kernel/smp.c:895:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/smp.c:895:9: sparse: expected void *ptr
kernel/smp.c:895:9: sparse: got int [noderef] __percpu *
kernel/smp.c:895:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/smp.c:895:9: sparse: expected void *ptr
kernel/smp.c:895:9: sparse: got int [noderef] __percpu *
kernel/smp.c:895:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/smp.c:895:9: sparse: expected void *ptr
kernel/smp.c:895:9: sparse: got int [noderef] __percpu *
kernel/smp.c:895:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/smp.c:895:9: sparse: expected void *ptr
kernel/smp.c:895:9: sparse: got int [noderef] __percpu *
kernel/smp.c:905:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/smp.c:905:17: sparse: expected void *ptr
kernel/smp.c:905:17: sparse: got unsigned int [noderef] __percpu *
kernel/smp.c:905:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/smp.c:905:17: sparse: expected void *ptr
kernel/smp.c:905:17: sparse: got unsigned int [noderef] __percpu *
kernel/smp.c:905:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/smp.c:905:17: sparse: expected void *ptr
kernel/smp.c:905:17: sparse: got unsigned int [noderef] __percpu *
kernel/smp.c:905:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/smp.c:905:17: sparse: expected void *ptr
kernel/smp.c:905:17: sparse: got unsigned int [noderef] __percpu *
kernel/smp.c:905:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/smp.c:905:17: sparse: expected void *ptr
kernel/smp.c:905:17: sparse: got int [noderef] __percpu *
kernel/smp.c:905:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/smp.c:905:17: sparse: expected void *ptr
kernel/smp.c:905:17: sparse: got int [noderef] __percpu *
kernel/smp.c:905:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/smp.c:905:17: sparse: expected void *ptr
kernel/smp.c:905:17: sparse: got int [noderef] __percpu *
kernel/smp.c:905:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/smp.c:905:17: sparse: expected void *ptr
kernel/smp.c:905:17: sparse: got int [noderef] __percpu *
--
>> kernel/sched/fair.c:6475:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/sched/fair.c:6475:9: sparse: expected void *ptr
kernel/sched/fair.c:6475:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/sched/fair.c:6475:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/sched/fair.c:6475:9: sparse: expected void *ptr
kernel/sched/fair.c:6475:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/sched/fair.c:6475:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/sched/fair.c:6475:9: sparse: expected void *ptr
kernel/sched/fair.c:6475:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/sched/fair.c:6475:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/sched/fair.c:6475:9: sparse: expected void *ptr
kernel/sched/fair.c:6475:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/sched/fair.c:6475:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/sched/fair.c:6475:9: sparse: expected void *ptr
kernel/sched/fair.c:6475:9: sparse: got int [noderef] __percpu *
>> kernel/sched/fair.c:6475:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/sched/fair.c:6475:9: sparse: expected void *ptr
kernel/sched/fair.c:6475:9: sparse: got int [noderef] __percpu *
>> kernel/sched/fair.c:6475:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/sched/fair.c:6475:9: sparse: expected void *ptr
kernel/sched/fair.c:6475:9: sparse: got int [noderef] __percpu *
>> kernel/sched/fair.c:6475:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/sched/fair.c:6475:9: sparse: expected void *ptr
kernel/sched/fair.c:6475:9: sparse: got int [noderef] __percpu *
kernel/sched/fair.c:930:34: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct sched_entity *se @@ got struct sched_entity [noderef] __rcu * @@
kernel/sched/fair.c:930:34: sparse: expected struct sched_entity *se
kernel/sched/fair.c:930:34: sparse: got struct sched_entity [noderef] __rcu *
kernel/sched/fair.c:10928:9: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sched_domain *[assigned] sd @@ got struct sched_domain [noderef] __rcu *parent @@
kernel/sched/fair.c:10928:9: sparse: expected struct sched_domain *[assigned] sd
kernel/sched/fair.c:10928:9: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/fair.c:5591:38: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct task_struct *curr @@ got struct task_struct [noderef] __rcu *curr @@
kernel/sched/fair.c:5591:38: sparse: expected struct task_struct *curr
kernel/sched/fair.c:5591:38: sparse: got struct task_struct [noderef] __rcu *curr
kernel/sched/fair.c:5846:1: sparse: sparse: symbol '__pcpu_scope_load_balance_mask' was not declared. Should it be static?
kernel/sched/fair.c:5847:1: sparse: sparse: symbol '__pcpu_scope_select_idle_mask' was not declared. Should it be static?
kernel/sched/fair.c:6774:20: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sched_domain *[assigned] sd @@ got struct sched_domain [noderef] __rcu *parent @@
kernel/sched/fair.c:6774:20: sparse: expected struct sched_domain *[assigned] sd
kernel/sched/fair.c:6774:20: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/fair.c:6908:9: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sched_domain *[assigned] tmp @@ got struct sched_domain [noderef] __rcu *parent @@
kernel/sched/fair.c:6908:9: sparse: expected struct sched_domain *[assigned] tmp
kernel/sched/fair.c:6908:9: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/fair.c:7106:38: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct task_struct *curr @@ got struct task_struct [noderef] __rcu *curr @@
kernel/sched/fair.c:7106:38: sparse: expected struct task_struct *curr
kernel/sched/fair.c:7106:38: sparse: got struct task_struct [noderef] __rcu *curr
kernel/sched/fair.c:7404:38: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct task_struct *curr @@ got struct task_struct [noderef] __rcu *curr @@
kernel/sched/fair.c:7404:38: sparse: expected struct task_struct *curr
kernel/sched/fair.c:7404:38: sparse: got struct task_struct [noderef] __rcu *curr
kernel/sched/fair.c:8389:40: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct sched_domain *child @@ got struct sched_domain [noderef] __rcu *child @@
kernel/sched/fair.c:8389:40: sparse: expected struct sched_domain *child
kernel/sched/fair.c:8389:40: sparse: got struct sched_domain [noderef] __rcu *child
kernel/sched/fair.c:8933:22: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/fair.c:8933:22: sparse: struct task_struct [noderef] __rcu *
kernel/sched/fair.c:8933:22: sparse: struct task_struct *
kernel/sched/fair.c:10203:9: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sched_domain *[assigned] sd @@ got struct sched_domain [noderef] __rcu *parent @@
kernel/sched/fair.c:10203:9: sparse: expected struct sched_domain *[assigned] sd
kernel/sched/fair.c:10203:9: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/fair.c:9863:44: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct sched_domain *sd_parent @@ got struct sched_domain [noderef] __rcu *parent @@
kernel/sched/fair.c:9863:44: sparse: expected struct sched_domain *sd_parent
kernel/sched/fair.c:9863:44: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/fair.c:10299:9: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sched_domain *[assigned] sd @@ got struct sched_domain [noderef] __rcu *parent @@
kernel/sched/fair.c:10299:9: sparse: expected struct sched_domain *[assigned] sd
kernel/sched/fair.c:10299:9: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/fair.c:5520:35: sparse: sparse: marked inline, but without a definition
kernel/sched/fair.c: note: in included file:
kernel/sched/sched.h:2018:25: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2018:25: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2018:25: sparse: struct task_struct *
kernel/sched/sched.h:2176:9: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2176:9: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2176:9: sparse: struct task_struct *
kernel/sched/sched.h:2018:25: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2018:25: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2018:25: sparse: struct task_struct *
kernel/sched/sched.h:2018:25: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2018:25: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2018:25: sparse: struct task_struct *
--
>> kernel/sched/core.c:597:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/sched/core.c:597:9: sparse: expected void *ptr
kernel/sched/core.c:597:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/sched/core.c:597:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/sched/core.c:597:9: sparse: expected void *ptr
kernel/sched/core.c:597:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/sched/core.c:597:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/sched/core.c:597:9: sparse: expected void *ptr
kernel/sched/core.c:597:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/sched/core.c:597:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/sched/core.c:597:9: sparse: expected void *ptr
kernel/sched/core.c:597:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/sched/core.c:597:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/sched/core.c:597:9: sparse: expected void *ptr
kernel/sched/core.c:597:9: sparse: got int [noderef] __percpu *
>> kernel/sched/core.c:597:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/sched/core.c:597:9: sparse: expected void *ptr
kernel/sched/core.c:597:9: sparse: got int [noderef] __percpu *
>> kernel/sched/core.c:597:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/sched/core.c:597:9: sparse: expected void *ptr
kernel/sched/core.c:597:9: sparse: got int [noderef] __percpu *
>> kernel/sched/core.c:597:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/sched/core.c:597:9: sparse: expected void *ptr
kernel/sched/core.c:597:9: sparse: got int [noderef] __percpu *
kernel/sched/core.c:780:48: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected struct task_struct *p @@ got struct task_struct [noderef] __rcu *curr @@
kernel/sched/core.c:780:48: sparse: expected struct task_struct *p
kernel/sched/core.c:780:48: sparse: got struct task_struct [noderef] __rcu *curr
kernel/sched/core.c:1033:38: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct task_struct *curr @@ got struct task_struct [noderef] __rcu *curr @@
kernel/sched/core.c:1033:38: sparse: expected struct task_struct *curr
kernel/sched/core.c:1033:38: sparse: got struct task_struct [noderef] __rcu *curr
kernel/sched/core.c:1091:9: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sched_domain *[assigned] sd @@ got struct sched_domain [noderef] __rcu *parent @@
kernel/sched/core.c:1091:9: sparse: expected struct sched_domain *[assigned] sd
kernel/sched/core.c:1091:9: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/core.c:2197:33: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct task_struct *p @@ got struct task_struct [noderef] __rcu *curr @@
kernel/sched/core.c:2197:33: sparse: expected struct task_struct *p
kernel/sched/core.c:2197:33: sparse: got struct task_struct [noderef] __rcu *curr
kernel/sched/core.c:2197:68: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct task_struct *tsk @@ got struct task_struct [noderef] __rcu *curr @@
kernel/sched/core.c:2197:68: sparse: expected struct task_struct *tsk
kernel/sched/core.c:2197:68: sparse: got struct task_struct [noderef] __rcu *curr
kernel/sched/core.c:3597:17: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct sched_domain *[assigned] sd @@ got struct sched_domain [noderef] __rcu *parent @@
kernel/sched/core.c:3597:17: sparse: expected struct sched_domain *[assigned] sd
kernel/sched/core.c:3597:17: sparse: got struct sched_domain [noderef] __rcu *parent
kernel/sched/core.c:3794:28: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct task_struct const *p @@ got struct task_struct [noderef] __rcu *curr @@
kernel/sched/core.c:3794:28: sparse: expected struct task_struct const *p
kernel/sched/core.c:3794:28: sparse: got struct task_struct [noderef] __rcu *curr
kernel/sched/core.c:9084:43: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct task_struct *push_task @@ got struct task_struct [noderef] __rcu *curr @@
kernel/sched/core.c:9084:43: sparse: expected struct task_struct *push_task
kernel/sched/core.c:9084:43: sparse: got struct task_struct [noderef] __rcu *curr
kernel/sched/core.c:5404:38: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected struct task_struct *curr @@ got struct task_struct [noderef] __rcu *curr @@
kernel/sched/core.c:5404:38: sparse: expected struct task_struct *curr
kernel/sched/core.c:5404:38: sparse: got struct task_struct [noderef] __rcu *curr
kernel/sched/core.c:5495:14: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct task_struct *curr @@ got struct task_struct [noderef] __rcu *curr @@
kernel/sched/core.c:5495:14: sparse: expected struct task_struct *curr
kernel/sched/core.c:5495:14: sparse: got struct task_struct [noderef] __rcu *curr
kernel/sched/core.c:6350:14: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct task_struct *prev @@ got struct task_struct [noderef] __rcu *curr @@
kernel/sched/core.c:6350:14: sparse: expected struct task_struct *prev
kernel/sched/core.c:6350:14: sparse: got struct task_struct [noderef] __rcu *curr
kernel/sched/core.c:6872:17: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/core.c:6872:17: sparse: struct task_struct *
kernel/sched/core.c:6872:17: sparse: struct task_struct [noderef] __rcu *
kernel/sched/core.c:7076:22: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/core.c:7076:22: sparse: struct task_struct [noderef] __rcu *
kernel/sched/core.c:7076:22: sparse: struct task_struct *
kernel/sched/core.c:11116:25: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct task_struct *p @@ got struct task_struct [noderef] __rcu *curr @@
kernel/sched/core.c:11116:25: sparse: expected struct task_struct *p
kernel/sched/core.c:11116:25: sparse: got struct task_struct [noderef] __rcu *curr
kernel/sched/core.c:537:6: sparse: sparse: context imbalance in 'raw_spin_rq_lock_nested' - wrong count at exit
kernel/sched/core.c:562:6: sparse: sparse: context imbalance in 'raw_spin_rq_trylock' - wrong count at exit
kernel/sched/core.c:586:6: sparse: sparse: context imbalance in 'raw_spin_rq_unlock' - unexpected unlock
kernel/sched/core.c:624:36: sparse: sparse: context imbalance in '__task_rq_lock' - wrong count at exit
kernel/sched/core.c:665:36: sparse: sparse: context imbalance in 'task_rq_lock' - wrong count at exit
kernel/sched/core.c: note: in included file:
kernel/sched/pelt.h:78:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected struct task_struct const *p @@ got struct task_struct [noderef] __rcu *curr @@
kernel/sched/pelt.h:78:13: sparse: expected struct task_struct const *p
kernel/sched/pelt.h:78:13: sparse: got struct task_struct [noderef] __rcu *curr
kernel/sched/core.c:780:11: sparse: sparse: dereference of noderef expression
kernel/sched/core.c:2188:33: sparse: sparse: dereference of noderef expression
kernel/sched/core.c:2189:19: sparse: sparse: dereference of noderef expression
kernel/sched/core.c:2190:18: sparse: sparse: dereference of noderef expression
kernel/sched/core.c: note: in included file:
kernel/sched/sched.h:2018:25: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2018:25: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2018:25: sparse: struct task_struct *
kernel/sched/sched.h:2176:9: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2176:9: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2176:9: sparse: struct task_struct *
kernel/sched/core.c:2163:38: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/core.c:2163:38: sparse: struct task_struct [noderef] __rcu *
kernel/sched/core.c:2163:38: sparse: struct task_struct const *
kernel/sched/sched.h:2018:25: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2018:25: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2018:25: sparse: struct task_struct *
kernel/sched/sched.h:2176:9: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2176:9: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2176:9: sparse: struct task_struct *
kernel/sched/sched.h:2176:9: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2176:9: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2176:9: sparse: struct task_struct *
kernel/sched/core.c: note: in included file (through arch/loongarch/include/asm/cpu-info.h, arch/loongarch/include/asm/processor.h, ...):
arch/loongarch/include/asm/loongarch.h:242:9: sparse: sparse: undefined identifier '__builtin_loongarch_csrwr_w'
arch/loongarch/include/asm/loongarch.h:242:9: sparse: sparse: cast from unknown type
arch/loongarch/include/asm/loongarch.h:247:9: sparse: sparse: undefined identifier '__builtin_loongarch_csrwr_d'
arch/loongarch/include/asm/loongarch.h:247:9: sparse: sparse: cast from unknown type
arch/loongarch/include/asm/loongarch.h:247:9: sparse: sparse: cast from unknown type
arch/loongarch/include/asm/loongarch.h:232:16: sparse: sparse: undefined identifier '__builtin_loongarch_csrrd_w'
arch/loongarch/include/asm/loongarch.h:232:16: sparse: sparse: cast from unknown type
arch/loongarch/include/asm/loongarch.h:242:9: sparse: sparse: cast from unknown type
kernel/sched/core.c: note: in included file:
kernel/sched/sched.h:2018:25: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2018:25: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2018:25: sparse: struct task_struct *
kernel/sched/sched.h:2176:9: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2176:9: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2176:9: sparse: struct task_struct *
kernel/sched/sched.h:2018:25: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2018:25: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2018:25: sparse: struct task_struct *
kernel/sched/sched.h:2176:9: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2176:9: sparse: struct task_struct [noderef] __rcu *
kernel/sched/sched.h:2176:9: sparse: struct task_struct *
kernel/sched/sched.h:2018:25: sparse: sparse: incompatible types in comparison expression (different address spaces):
kernel/sched/sched.h:2018:25: sparse: struct task_struct [noderef] __rcu *
--
>> kernel/locking/mutex.c:357:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/locking/mutex.c:357:9: sparse: expected void *ptr
kernel/locking/mutex.c:357:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/locking/mutex.c:357:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/locking/mutex.c:357:9: sparse: expected void *ptr
kernel/locking/mutex.c:357:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/locking/mutex.c:357:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/locking/mutex.c:357:9: sparse: expected void *ptr
kernel/locking/mutex.c:357:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/locking/mutex.c:357:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/locking/mutex.c:357:9: sparse: expected void *ptr
kernel/locking/mutex.c:357:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/locking/mutex.c:357:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/locking/mutex.c:357:9: sparse: expected void *ptr
kernel/locking/mutex.c:357:9: sparse: got int [noderef] __percpu *
>> kernel/locking/mutex.c:357:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/locking/mutex.c:357:9: sparse: expected void *ptr
kernel/locking/mutex.c:357:9: sparse: got int [noderef] __percpu *
>> kernel/locking/mutex.c:357:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/locking/mutex.c:357:9: sparse: expected void *ptr
kernel/locking/mutex.c:357:9: sparse: got int [noderef] __percpu *
>> kernel/locking/mutex.c:357:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/locking/mutex.c:357:9: sparse: expected void *ptr
kernel/locking/mutex.c:357:9: sparse: got int [noderef] __percpu *
kernel/locking/mutex.c:397:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/locking/mutex.c:397:9: sparse: expected void *ptr
kernel/locking/mutex.c:397:9: sparse: got unsigned int [noderef] __percpu *
kernel/locking/mutex.c:397:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/locking/mutex.c:397:9: sparse: expected void *ptr
kernel/locking/mutex.c:397:9: sparse: got unsigned int [noderef] __percpu *
kernel/locking/mutex.c:397:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/locking/mutex.c:397:9: sparse: expected void *ptr
kernel/locking/mutex.c:397:9: sparse: got unsigned int [noderef] __percpu *
kernel/locking/mutex.c:397:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/locking/mutex.c:397:9: sparse: expected void *ptr
kernel/locking/mutex.c:397:9: sparse: got unsigned int [noderef] __percpu *
kernel/locking/mutex.c:397:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/locking/mutex.c:397:9: sparse: expected void *ptr
kernel/locking/mutex.c:397:9: sparse: got int [noderef] __percpu *
kernel/locking/mutex.c:397:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/locking/mutex.c:397:9: sparse: expected void *ptr
kernel/locking/mutex.c:397:9: sparse: got int [noderef] __percpu *
kernel/locking/mutex.c:397:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/locking/mutex.c:397:9: sparse: expected void *ptr
kernel/locking/mutex.c:397:9: sparse: got int [noderef] __percpu *
kernel/locking/mutex.c:397:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/locking/mutex.c:397:9: sparse: expected void *ptr
kernel/locking/mutex.c:397:9: sparse: got int [noderef] __percpu *
kernel/locking/mutex.c:397:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/locking/mutex.c:397:9: sparse: expected void *ptr
kernel/locking/mutex.c:397:9: sparse: got unsigned int [noderef] __percpu *
kernel/locking/mutex.c:397:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/locking/mutex.c:397:9: sparse: expected void *ptr
kernel/locking/mutex.c:397:9: sparse: got unsigned int [noderef] __percpu *
kernel/locking/mutex.c:397:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/locking/mutex.c:397:9: sparse: expected void *ptr
kernel/locking/mutex.c:397:9: sparse: got unsigned int [noderef] __percpu *
kernel/locking/mutex.c:397:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/locking/mutex.c:397:9: sparse: expected void *ptr
kernel/locking/mutex.c:397:9: sparse: got unsigned int [noderef] __percpu *
kernel/locking/mutex.c:397:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/locking/mutex.c:397:9: sparse: expected void *ptr
kernel/locking/mutex.c:397:9: sparse: got int [noderef] __percpu *
kernel/locking/mutex.c:397:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/locking/mutex.c:397:9: sparse: expected void *ptr
kernel/locking/mutex.c:397:9: sparse: got int [noderef] __percpu *
kernel/locking/mutex.c:397:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/locking/mutex.c:397:9: sparse: expected void *ptr
kernel/locking/mutex.c:397:9: sparse: got int [noderef] __percpu *
kernel/locking/mutex.c:397:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/locking/mutex.c:397:9: sparse: expected void *ptr
kernel/locking/mutex.c:397:9: sparse: got int [noderef] __percpu *
kernel/locking/mutex.c:397:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/locking/mutex.c:397:9: sparse: expected void *ptr
kernel/locking/mutex.c:397:9: sparse: got unsigned int [noderef] __percpu *
kernel/locking/mutex.c:397:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/locking/mutex.c:397:9: sparse: expected void *ptr
kernel/locking/mutex.c:397:9: sparse: got unsigned int [noderef] __percpu *
kernel/locking/mutex.c:397:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/locking/mutex.c:397:9: sparse: expected void *ptr
kernel/locking/mutex.c:397:9: sparse: got unsigned int [noderef] __percpu *
kernel/locking/mutex.c:397:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/locking/mutex.c:397:9: sparse: expected void *ptr
kernel/locking/mutex.c:397:9: sparse: got unsigned int [noderef] __percpu *
kernel/locking/mutex.c:397:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/locking/mutex.c:397:9: sparse: expected void *ptr
kernel/locking/mutex.c:397:9: sparse: got int [noderef] __percpu *
kernel/locking/mutex.c:397:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/locking/mutex.c:397:9: sparse: expected void *ptr
kernel/locking/mutex.c:397:9: sparse: got int [noderef] __percpu *
kernel/locking/mutex.c:397:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/locking/mutex.c:397:9: sparse: expected void *ptr
kernel/locking/mutex.c:397:9: sparse: got int [noderef] __percpu *
kernel/locking/mutex.c:397:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/locking/mutex.c:397:9: sparse: expected void *ptr
kernel/locking/mutex.c:397:9: sparse: got int [noderef] __percpu *
kernel/locking/mutex.c:397:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/locking/mutex.c:397:9: sparse: expected void *ptr
kernel/locking/mutex.c:397:9: sparse: got unsigned int [noderef] __percpu *
kernel/locking/mutex.c:397:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/locking/mutex.c:397:9: sparse: expected void *ptr
kernel/locking/mutex.c:397:9: sparse: got unsigned int [noderef] __percpu *
kernel/locking/mutex.c:397:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/locking/mutex.c:397:9: sparse: expected void *ptr
kernel/locking/mutex.c:397:9: sparse: got unsigned int [noderef] __percpu *
kernel/locking/mutex.c:397:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/locking/mutex.c:397:9: sparse: expected void *ptr
kernel/locking/mutex.c:397:9: sparse: got unsigned int [noderef] __percpu *
kernel/locking/mutex.c:397:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/locking/mutex.c:397:9: sparse: expected void *ptr
kernel/locking/mutex.c:397:9: sparse: got int [noderef] __percpu *
kernel/locking/mutex.c:397:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/locking/mutex.c:397:9: sparse: expected void *ptr
kernel/locking/mutex.c:397:9: sparse: got int [noderef] __percpu *
kernel/locking/mutex.c:397:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/locking/mutex.c:397:9: sparse: expected void *ptr
kernel/locking/mutex.c:397:9: sparse: got int [noderef] __percpu *
kernel/locking/mutex.c:397:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/locking/mutex.c:397:9: sparse: expected void *ptr
kernel/locking/mutex.c:397:9: sparse: got int [noderef] __percpu *
kernel/locking/mutex.c:397:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/locking/mutex.c:397:9: sparse: expected void *ptr
--
>> kernel/locking/rwsem.c:751:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/locking/rwsem.c:751:9: sparse: expected void *ptr
kernel/locking/rwsem.c:751:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/locking/rwsem.c:751:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/locking/rwsem.c:751:9: sparse: expected void *ptr
kernel/locking/rwsem.c:751:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/locking/rwsem.c:751:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/locking/rwsem.c:751:9: sparse: expected void *ptr
kernel/locking/rwsem.c:751:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/locking/rwsem.c:751:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/locking/rwsem.c:751:9: sparse: expected void *ptr
kernel/locking/rwsem.c:751:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/locking/rwsem.c:751:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/locking/rwsem.c:751:9: sparse: expected void *ptr
kernel/locking/rwsem.c:751:9: sparse: got int [noderef] __percpu *
>> kernel/locking/rwsem.c:751:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/locking/rwsem.c:751:9: sparse: expected void *ptr
kernel/locking/rwsem.c:751:9: sparse: got int [noderef] __percpu *
>> kernel/locking/rwsem.c:751:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/locking/rwsem.c:751:9: sparse: expected void *ptr
kernel/locking/rwsem.c:751:9: sparse: got int [noderef] __percpu *
>> kernel/locking/rwsem.c:751:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/locking/rwsem.c:751:9: sparse: expected void *ptr
kernel/locking/rwsem.c:751:9: sparse: got int [noderef] __percpu *
--
kernel/rcu/tree.c: note: in included file:
>> kernel/rcu/tree_exp.h:807:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_exp.h:807:9: sparse: expected void *ptr
kernel/rcu/tree_exp.h:807:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/rcu/tree_exp.h:807:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_exp.h:807:9: sparse: expected void *ptr
kernel/rcu/tree_exp.h:807:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/rcu/tree_exp.h:807:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_exp.h:807:9: sparse: expected void *ptr
kernel/rcu/tree_exp.h:807:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/rcu/tree_exp.h:807:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_exp.h:807:9: sparse: expected void *ptr
kernel/rcu/tree_exp.h:807:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/rcu/tree_exp.h:807:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_exp.h:807:9: sparse: expected void *ptr
kernel/rcu/tree_exp.h:807:9: sparse: got int [noderef] __percpu *
>> kernel/rcu/tree_exp.h:807:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_exp.h:807:9: sparse: expected void *ptr
kernel/rcu/tree_exp.h:807:9: sparse: got int [noderef] __percpu *
>> kernel/rcu/tree_exp.h:807:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_exp.h:807:9: sparse: expected void *ptr
kernel/rcu/tree_exp.h:807:9: sparse: got int [noderef] __percpu *
>> kernel/rcu/tree_exp.h:807:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_exp.h:807:9: sparse: expected void *ptr
kernel/rcu/tree_exp.h:807:9: sparse: got int [noderef] __percpu *
kernel/rcu/tree.c: note: in included file:
>> kernel/rcu/tree_plugin.h:720:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_plugin.h:720:9: sparse: expected void *ptr
kernel/rcu/tree_plugin.h:720:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/rcu/tree_plugin.h:720:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_plugin.h:720:9: sparse: expected void *ptr
kernel/rcu/tree_plugin.h:720:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/rcu/tree_plugin.h:720:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_plugin.h:720:9: sparse: expected void *ptr
kernel/rcu/tree_plugin.h:720:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/rcu/tree_plugin.h:720:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_plugin.h:720:9: sparse: expected void *ptr
kernel/rcu/tree_plugin.h:720:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/rcu/tree_plugin.h:720:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_plugin.h:720:9: sparse: expected void *ptr
kernel/rcu/tree_plugin.h:720:9: sparse: got int [noderef] __percpu *
>> kernel/rcu/tree_plugin.h:720:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_plugin.h:720:9: sparse: expected void *ptr
kernel/rcu/tree_plugin.h:720:9: sparse: got int [noderef] __percpu *
>> kernel/rcu/tree_plugin.h:720:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_plugin.h:720:9: sparse: expected void *ptr
kernel/rcu/tree_plugin.h:720:9: sparse: got int [noderef] __percpu *
>> kernel/rcu/tree_plugin.h:720:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_plugin.h:720:9: sparse: expected void *ptr
kernel/rcu/tree_plugin.h:720:9: sparse: got int [noderef] __percpu *
kernel/rcu/tree_plugin.h:1242:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_plugin.h:1242:9: sparse: expected void *ptr
kernel/rcu/tree_plugin.h:1242:9: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_plugin.h:1242:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_plugin.h:1242:9: sparse: expected void *ptr
kernel/rcu/tree_plugin.h:1242:9: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_plugin.h:1242:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_plugin.h:1242:9: sparse: expected void *ptr
kernel/rcu/tree_plugin.h:1242:9: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_plugin.h:1242:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_plugin.h:1242:9: sparse: expected void *ptr
kernel/rcu/tree_plugin.h:1242:9: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_plugin.h:1242:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_plugin.h:1242:9: sparse: expected void *ptr
kernel/rcu/tree_plugin.h:1242:9: sparse: got int [noderef] __percpu *
kernel/rcu/tree_plugin.h:1242:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_plugin.h:1242:9: sparse: expected void *ptr
kernel/rcu/tree_plugin.h:1242:9: sparse: got int [noderef] __percpu *
kernel/rcu/tree_plugin.h:1242:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_plugin.h:1242:9: sparse: expected void *ptr
kernel/rcu/tree_plugin.h:1242:9: sparse: got int [noderef] __percpu *
kernel/rcu/tree_plugin.h:1242:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_plugin.h:1242:9: sparse: expected void *ptr
kernel/rcu/tree_plugin.h:1242:9: sparse: got int [noderef] __percpu *
kernel/rcu/tree.c: note: in included file:
>> kernel/rcu/tree_nocb.h:377:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:377:9: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:377:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/rcu/tree_nocb.h:377:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:377:9: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:377:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/rcu/tree_nocb.h:377:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:377:9: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:377:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/rcu/tree_nocb.h:377:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:377:9: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:377:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/rcu/tree_nocb.h:377:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:377:9: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:377:9: sparse: got int [noderef] __percpu *
>> kernel/rcu/tree_nocb.h:377:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:377:9: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:377:9: sparse: got int [noderef] __percpu *
>> kernel/rcu/tree_nocb.h:377:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:377:9: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:377:9: sparse: got int [noderef] __percpu *
>> kernel/rcu/tree_nocb.h:377:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:377:9: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:377:9: sparse: got int [noderef] __percpu *
kernel/rcu/tree_nocb.h:154:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:154:9: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:154:9: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_nocb.h:154:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:154:9: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:154:9: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_nocb.h:154:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:154:9: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:154:9: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_nocb.h:154:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:154:9: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:154:9: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_nocb.h:154:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:154:9: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:154:9: sparse: got int [noderef] __percpu *
kernel/rcu/tree_nocb.h:154:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:154:9: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:154:9: sparse: got int [noderef] __percpu *
kernel/rcu/tree_nocb.h:154:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:154:9: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:154:9: sparse: got int [noderef] __percpu *
kernel/rcu/tree_nocb.h:154:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:154:9: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:154:9: sparse: got int [noderef] __percpu *
kernel/rcu/tree_nocb.h:167:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:167:17: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:167:17: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_nocb.h:167:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:167:17: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:167:17: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_nocb.h:167:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:167:17: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:167:17: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_nocb.h:167:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:167:17: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:167:17: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_nocb.h:167:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:167:17: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:167:17: sparse: got int [noderef] __percpu *
kernel/rcu/tree_nocb.h:167:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:167:17: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:167:17: sparse: got int [noderef] __percpu *
kernel/rcu/tree_nocb.h:167:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:167:17: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:167:17: sparse: got int [noderef] __percpu *
kernel/rcu/tree_nocb.h:167:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:167:17: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:167:17: sparse: got int [noderef] __percpu *
kernel/rcu/tree_nocb.h:180:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:180:17: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:180:17: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_nocb.h:180:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:180:17: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:180:17: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_nocb.h:180:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:180:17: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:180:17: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_nocb.h:180:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:180:17: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:180:17: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_nocb.h:180:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:180:17: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:180:17: sparse: got int [noderef] __percpu *
kernel/rcu/tree_nocb.h:180:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:180:17: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:180:17: sparse: got int [noderef] __percpu *
kernel/rcu/tree_nocb.h:180:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:180:17: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:180:17: sparse: got int [noderef] __percpu *
kernel/rcu/tree_nocb.h:180:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:180:17: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:180:17: sparse: got int [noderef] __percpu *
kernel/rcu/tree_nocb.h:190:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:190:9: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:190:9: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_nocb.h:190:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:190:9: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:190:9: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_nocb.h:190:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:190:9: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:190:9: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_nocb.h:190:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:190:9: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:190:9: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_nocb.h:190:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:190:9: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:190:9: sparse: got int [noderef] __percpu *
kernel/rcu/tree_nocb.h:190:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:190:9: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:190:9: sparse: got int [noderef] __percpu *
kernel/rcu/tree_nocb.h:190:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:190:9: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:190:9: sparse: got int [noderef] __percpu *
kernel/rcu/tree_nocb.h:190:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_nocb.h:190:9: sparse: expected void *ptr
kernel/rcu/tree_nocb.h:190:9: sparse: got int [noderef] __percpu *
kernel/rcu/tree.c: note: in included file:
>> kernel/rcu/tree_stall.h:224:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:224:9: sparse: expected void *ptr
kernel/rcu/tree_stall.h:224:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/rcu/tree_stall.h:224:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:224:9: sparse: expected void *ptr
kernel/rcu/tree_stall.h:224:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/rcu/tree_stall.h:224:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:224:9: sparse: expected void *ptr
kernel/rcu/tree_stall.h:224:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/rcu/tree_stall.h:224:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:224:9: sparse: expected void *ptr
kernel/rcu/tree_stall.h:224:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/rcu/tree_stall.h:224:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:224:9: sparse: expected void *ptr
kernel/rcu/tree_stall.h:224:9: sparse: got int [noderef] __percpu *
>> kernel/rcu/tree_stall.h:224:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:224:9: sparse: expected void *ptr
kernel/rcu/tree_stall.h:224:9: sparse: got int [noderef] __percpu *
>> kernel/rcu/tree_stall.h:224:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:224:9: sparse: expected void *ptr
kernel/rcu/tree_stall.h:224:9: sparse: got int [noderef] __percpu *
>> kernel/rcu/tree_stall.h:224:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:224:9: sparse: expected void *ptr
kernel/rcu/tree_stall.h:224:9: sparse: got int [noderef] __percpu *
kernel/rcu/tree_stall.h:700:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:700:9: sparse: expected void *ptr
kernel/rcu/tree_stall.h:700:9: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_stall.h:700:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:700:9: sparse: expected void *ptr
kernel/rcu/tree_stall.h:700:9: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_stall.h:700:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:700:9: sparse: expected void *ptr
kernel/rcu/tree_stall.h:700:9: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_stall.h:700:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:700:9: sparse: expected void *ptr
kernel/rcu/tree_stall.h:700:9: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_stall.h:700:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:700:9: sparse: expected void *ptr
kernel/rcu/tree_stall.h:700:9: sparse: got int [noderef] __percpu *
kernel/rcu/tree_stall.h:700:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:700:9: sparse: expected void *ptr
kernel/rcu/tree_stall.h:700:9: sparse: got int [noderef] __percpu *
kernel/rcu/tree_stall.h:700:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:700:9: sparse: expected void *ptr
kernel/rcu/tree_stall.h:700:9: sparse: got int [noderef] __percpu *
kernel/rcu/tree_stall.h:700:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:700:9: sparse: expected void *ptr
kernel/rcu/tree_stall.h:700:9: sparse: got int [noderef] __percpu *
kernel/rcu/tree_stall.h:941:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:941:17: sparse: expected void *ptr
kernel/rcu/tree_stall.h:941:17: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_stall.h:941:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:941:17: sparse: expected void *ptr
kernel/rcu/tree_stall.h:941:17: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_stall.h:941:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:941:17: sparse: expected void *ptr
kernel/rcu/tree_stall.h:941:17: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_stall.h:941:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:941:17: sparse: expected void *ptr
kernel/rcu/tree_stall.h:941:17: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_stall.h:941:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:941:17: sparse: expected void *ptr
kernel/rcu/tree_stall.h:941:17: sparse: got int [noderef] __percpu *
kernel/rcu/tree_stall.h:941:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:941:17: sparse: expected void *ptr
kernel/rcu/tree_stall.h:941:17: sparse: got int [noderef] __percpu *
kernel/rcu/tree_stall.h:941:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:941:17: sparse: expected void *ptr
kernel/rcu/tree_stall.h:941:17: sparse: got int [noderef] __percpu *
kernel/rcu/tree_stall.h:941:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:941:17: sparse: expected void *ptr
kernel/rcu/tree_stall.h:941:17: sparse: got int [noderef] __percpu *
kernel/rcu/tree_stall.h:957:25: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:957:25: sparse: expected void *ptr
kernel/rcu/tree_stall.h:957:25: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_stall.h:957:25: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:957:25: sparse: expected void *ptr
kernel/rcu/tree_stall.h:957:25: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_stall.h:957:25: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:957:25: sparse: expected void *ptr
kernel/rcu/tree_stall.h:957:25: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_stall.h:957:25: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:957:25: sparse: expected void *ptr
kernel/rcu/tree_stall.h:957:25: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_stall.h:957:25: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:957:25: sparse: expected void *ptr
kernel/rcu/tree_stall.h:957:25: sparse: got int [noderef] __percpu *
kernel/rcu/tree_stall.h:957:25: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:957:25: sparse: expected void *ptr
kernel/rcu/tree_stall.h:957:25: sparse: got int [noderef] __percpu *
kernel/rcu/tree_stall.h:957:25: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:957:25: sparse: expected void *ptr
kernel/rcu/tree_stall.h:957:25: sparse: got int [noderef] __percpu *
kernel/rcu/tree_stall.h:957:25: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:957:25: sparse: expected void *ptr
kernel/rcu/tree_stall.h:957:25: sparse: got int [noderef] __percpu *
kernel/rcu/tree_stall.h:958:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:958:17: sparse: expected void *ptr
kernel/rcu/tree_stall.h:958:17: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_stall.h:958:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:958:17: sparse: expected void *ptr
kernel/rcu/tree_stall.h:958:17: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_stall.h:958:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/rcu/tree_stall.h:958:17: sparse: expected void *ptr
kernel/rcu/tree_stall.h:958:17: sparse: got unsigned int [noderef] __percpu *
kernel/rcu/tree_stall.h:958:17: sparse: sparse: too many warnings
--
>> kernel/time/timer.c:1432:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/time/timer.c:1432:17: sparse: expected void *ptr
kernel/time/timer.c:1432:17: sparse: got unsigned int [noderef] __percpu *
>> kernel/time/timer.c:1432:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/time/timer.c:1432:17: sparse: expected void *ptr
kernel/time/timer.c:1432:17: sparse: got unsigned int [noderef] __percpu *
>> kernel/time/timer.c:1432:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/time/timer.c:1432:17: sparse: expected void *ptr
kernel/time/timer.c:1432:17: sparse: got unsigned int [noderef] __percpu *
>> kernel/time/timer.c:1432:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/time/timer.c:1432:17: sparse: expected void *ptr
kernel/time/timer.c:1432:17: sparse: got unsigned int [noderef] __percpu *
>> kernel/time/timer.c:1432:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/time/timer.c:1432:17: sparse: expected void *ptr
kernel/time/timer.c:1432:17: sparse: got int [noderef] __percpu *
>> kernel/time/timer.c:1432:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/time/timer.c:1432:17: sparse: expected void *ptr
kernel/time/timer.c:1432:17: sparse: got int [noderef] __percpu *
>> kernel/time/timer.c:1432:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/time/timer.c:1432:17: sparse: expected void *ptr
kernel/time/timer.c:1432:17: sparse: got int [noderef] __percpu *
>> kernel/time/timer.c:1432:17: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/time/timer.c:1432:17: sparse: expected void *ptr
kernel/time/timer.c:1432:17: sparse: got int [noderef] __percpu *
vim +571 kernel/smp.c
8d056c48e48624 Srivatsa S. Bhat 2014-06-23 549
8d056c48e48624 Srivatsa S. Bhat 2014-06-23 550 /**
16bf5a5e1ec564 Thomas Gleixner 2022-04-13 551 * __flush_smp_call_function_queue - Flush pending smp-call-function callbacks
8d056c48e48624 Srivatsa S. Bhat 2014-06-23 552 *
8d056c48e48624 Srivatsa S. Bhat 2014-06-23 553 * @warn_cpu_offline: If set to 'true', warn if callbacks were queued on an
8d056c48e48624 Srivatsa S. Bhat 2014-06-23 554 * offline CPU. Skip this check if set to 'false'.
8d056c48e48624 Srivatsa S. Bhat 2014-06-23 555 *
8d056c48e48624 Srivatsa S. Bhat 2014-06-23 556 * Flush any pending smp-call-function callbacks queued on this CPU. This is
8d056c48e48624 Srivatsa S. Bhat 2014-06-23 557 * invoked by the generic IPI handler, as well as by a CPU about to go offline,
8d056c48e48624 Srivatsa S. Bhat 2014-06-23 558 * to ensure that all pending IPI callbacks are run before it goes completely
8d056c48e48624 Srivatsa S. Bhat 2014-06-23 559 * offline.
8d056c48e48624 Srivatsa S. Bhat 2014-06-23 560 *
8d056c48e48624 Srivatsa S. Bhat 2014-06-23 561 * Loop through the call_single_queue and run all the queued callbacks.
8d056c48e48624 Srivatsa S. Bhat 2014-06-23 562 * Must be called with interrupts disabled.
8d056c48e48624 Srivatsa S. Bhat 2014-06-23 563 */
16bf5a5e1ec564 Thomas Gleixner 2022-04-13 564 static void __flush_smp_call_function_queue(bool warn_cpu_offline)
8d056c48e48624 Srivatsa S. Bhat 2014-06-23 565 {
966a967116e699 Ying Huang 2017-08-08 566 call_single_data_t *csd, *csd_next;
52103be07d8b08 Peter Zijlstra 2020-05-26 567 struct llist_node *entry, *prev;
52103be07d8b08 Peter Zijlstra 2020-05-26 568 struct llist_head *head;
a219ccf4637396 Srivatsa S. Bhat 2014-06-06 569 static bool warned;
a219ccf4637396 Srivatsa S. Bhat 2014-06-06 570
83efcbd028ad3a Frederic Weisbecker 2017-11-06 @571 lockdep_assert_irqs_disabled();
8d056c48e48624 Srivatsa S. Bhat 2014-06-23 572
bb964a92ce70ac Christoph Lameter 2014-08-17 573 head = this_cpu_ptr(&call_single_queue);
a5aabace5fb8ab Juergen Gross 2021-03-01 574 cfd_seq_store(this_cpu_ptr(&cfd_seq_local)->handle, CFD_SEQ_NOCPU,
a5aabace5fb8ab Juergen Gross 2021-03-01 575 smp_processor_id(), CFD_SEQ_HANDLE);
8d056c48e48624 Srivatsa S. Bhat 2014-06-23 576 entry = llist_del_all(head);
a5aabace5fb8ab Juergen Gross 2021-03-01 577 cfd_seq_store(this_cpu_ptr(&cfd_seq_local)->dequeue,
a5aabace5fb8ab Juergen Gross 2021-03-01 578 /* Special meaning of source cpu: 0 == queue empty */
a5aabace5fb8ab Juergen Gross 2021-03-01 579 entry ? CFD_SEQ_NOCPU : 0,
a5aabace5fb8ab Juergen Gross 2021-03-01 580 smp_processor_id(), CFD_SEQ_DEQUEUE);
a219ccf4637396 Srivatsa S. Bhat 2014-06-06 581 entry = llist_reverse_order(entry);
3d4422332711ef Jens Axboe 2008-06-26 582
8d056c48e48624 Srivatsa S. Bhat 2014-06-23 583 /* There shouldn't be any pending callbacks on an offline CPU. */
8d056c48e48624 Srivatsa S. Bhat 2014-06-23 584 if (unlikely(warn_cpu_offline && !cpu_online(smp_processor_id()) &&
9e949a3886356f Nadav Amit 2022-03-19 585 !warned && entry != NULL)) {
a219ccf4637396 Srivatsa S. Bhat 2014-06-06 586 warned = true;
a219ccf4637396 Srivatsa S. Bhat 2014-06-06 587 WARN(1, "IPI on offline CPU %d\n", smp_processor_id());
269c861baa2fe7 Suresh Siddha 2009-08-19 588
a219ccf4637396 Srivatsa S. Bhat 2014-06-06 589 /*
a219ccf4637396 Srivatsa S. Bhat 2014-06-06 590 * We don't have to use the _safe() variant here
a219ccf4637396 Srivatsa S. Bhat 2014-06-06 591 * because we are not invoking the IPI handlers yet.
a219ccf4637396 Srivatsa S. Bhat 2014-06-06 592 */
545b8c8df41f9e Peter Zijlstra 2020-06-15 593 llist_for_each_entry(csd, entry, node.llist) {
4b44a21dd640b6 Peter Zijlstra 2020-05-26 594 switch (CSD_TYPE(csd)) {
4b44a21dd640b6 Peter Zijlstra 2020-05-26 595 case CSD_TYPE_ASYNC:
4b44a21dd640b6 Peter Zijlstra 2020-05-26 596 case CSD_TYPE_SYNC:
4b44a21dd640b6 Peter Zijlstra 2020-05-26 597 case CSD_TYPE_IRQ_WORK:
a219ccf4637396 Srivatsa S. Bhat 2014-06-06 598 pr_warn("IPI callback %pS sent to offline CPU\n",
a219ccf4637396 Srivatsa S. Bhat 2014-06-06 599 csd->func);
4b44a21dd640b6 Peter Zijlstra 2020-05-26 600 break;
4b44a21dd640b6 Peter Zijlstra 2020-05-26 601
a148866489fbe2 Peter Zijlstra 2020-05-26 602 case CSD_TYPE_TTWU:
a148866489fbe2 Peter Zijlstra 2020-05-26 603 pr_warn("IPI task-wakeup sent to offline CPU\n");
a148866489fbe2 Peter Zijlstra 2020-05-26 604 break;
a148866489fbe2 Peter Zijlstra 2020-05-26 605
4b44a21dd640b6 Peter Zijlstra 2020-05-26 606 default:
4b44a21dd640b6 Peter Zijlstra 2020-05-26 607 pr_warn("IPI callback, unknown type %d, sent to offline CPU\n",
4b44a21dd640b6 Peter Zijlstra 2020-05-26 608 CSD_TYPE(csd));
4b44a21dd640b6 Peter Zijlstra 2020-05-26 609 break;
4b44a21dd640b6 Peter Zijlstra 2020-05-26 610 }
4b44a21dd640b6 Peter Zijlstra 2020-05-26 611 }
a219ccf4637396 Srivatsa S. Bhat 2014-06-06 612 }
3d4422332711ef Jens Axboe 2008-06-26 613
52103be07d8b08 Peter Zijlstra 2020-05-26 614 /*
52103be07d8b08 Peter Zijlstra 2020-05-26 615 * First; run all SYNC callbacks, people are waiting for us.
52103be07d8b08 Peter Zijlstra 2020-05-26 616 */
52103be07d8b08 Peter Zijlstra 2020-05-26 617 prev = NULL;
545b8c8df41f9e Peter Zijlstra 2020-06-15 618 llist_for_each_entry_safe(csd, csd_next, entry, node.llist) {
4b44a21dd640b6 Peter Zijlstra 2020-05-26 619 /* Do we wait until *after* callback? */
4b44a21dd640b6 Peter Zijlstra 2020-05-26 620 if (CSD_TYPE(csd) == CSD_TYPE_SYNC) {
8053871d0f7f67 Linus Torvalds 2015-02-11 621 smp_call_func_t func = csd->func;
8053871d0f7f67 Linus Torvalds 2015-02-11 622 void *info = csd->info;
8053871d0f7f67 Linus Torvalds 2015-02-11 623
52103be07d8b08 Peter Zijlstra 2020-05-26 624 if (prev) {
545b8c8df41f9e Peter Zijlstra 2020-06-15 625 prev->next = &csd_next->node.llist;
52103be07d8b08 Peter Zijlstra 2020-05-26 626 } else {
545b8c8df41f9e Peter Zijlstra 2020-06-15 627 entry = &csd_next->node.llist;
52103be07d8b08 Peter Zijlstra 2020-05-26 628 }
4b44a21dd640b6 Peter Zijlstra 2020-05-26 629
35feb60474bf4f Paul E. McKenney 2020-06-30 630 csd_lock_record(csd);
8053871d0f7f67 Linus Torvalds 2015-02-11 631 func(info);
8053871d0f7f67 Linus Torvalds 2015-02-11 632 csd_unlock(csd);
35feb60474bf4f Paul E. McKenney 2020-06-30 633 csd_lock_record(NULL);
8053871d0f7f67 Linus Torvalds 2015-02-11 634 } else {
545b8c8df41f9e Peter Zijlstra 2020-06-15 635 prev = &csd->node.llist;
52103be07d8b08 Peter Zijlstra 2020-05-26 636 }
52103be07d8b08 Peter Zijlstra 2020-05-26 637 }
52103be07d8b08 Peter Zijlstra 2020-05-26 638
a5aabace5fb8ab Juergen Gross 2021-03-01 639 if (!entry) {
a5aabace5fb8ab Juergen Gross 2021-03-01 640 cfd_seq_store(this_cpu_ptr(&cfd_seq_local)->hdlend,
a5aabace5fb8ab Juergen Gross 2021-03-01 641 0, smp_processor_id(),
a5aabace5fb8ab Juergen Gross 2021-03-01 642 CFD_SEQ_HDLEND);
a148866489fbe2 Peter Zijlstra 2020-05-26 643 return;
a5aabace5fb8ab Juergen Gross 2021-03-01 644 }
a148866489fbe2 Peter Zijlstra 2020-05-26 645
52103be07d8b08 Peter Zijlstra 2020-05-26 646 /*
52103be07d8b08 Peter Zijlstra 2020-05-26 647 * Second; run all !SYNC callbacks.
52103be07d8b08 Peter Zijlstra 2020-05-26 648 */
a148866489fbe2 Peter Zijlstra 2020-05-26 649 prev = NULL;
545b8c8df41f9e Peter Zijlstra 2020-06-15 650 llist_for_each_entry_safe(csd, csd_next, entry, node.llist) {
4b44a21dd640b6 Peter Zijlstra 2020-05-26 651 int type = CSD_TYPE(csd);
4b44a21dd640b6 Peter Zijlstra 2020-05-26 652
a148866489fbe2 Peter Zijlstra 2020-05-26 653 if (type != CSD_TYPE_TTWU) {
a148866489fbe2 Peter Zijlstra 2020-05-26 654 if (prev) {
545b8c8df41f9e Peter Zijlstra 2020-06-15 655 prev->next = &csd_next->node.llist;
a148866489fbe2 Peter Zijlstra 2020-05-26 656 } else {
545b8c8df41f9e Peter Zijlstra 2020-06-15 657 entry = &csd_next->node.llist;
a148866489fbe2 Peter Zijlstra 2020-05-26 658 }
a148866489fbe2 Peter Zijlstra 2020-05-26 659
4b44a21dd640b6 Peter Zijlstra 2020-05-26 660 if (type == CSD_TYPE_ASYNC) {
52103be07d8b08 Peter Zijlstra 2020-05-26 661 smp_call_func_t func = csd->func;
52103be07d8b08 Peter Zijlstra 2020-05-26 662 void *info = csd->info;
52103be07d8b08 Peter Zijlstra 2020-05-26 663
35feb60474bf4f Paul E. McKenney 2020-06-30 664 csd_lock_record(csd);
e1d12f327037a5 Andrew Morton 2013-04-30 665 csd_unlock(csd);
8053871d0f7f67 Linus Torvalds 2015-02-11 666 func(info);
35feb60474bf4f Paul E. McKenney 2020-06-30 667 csd_lock_record(NULL);
4b44a21dd640b6 Peter Zijlstra 2020-05-26 668 } else if (type == CSD_TYPE_IRQ_WORK) {
4b44a21dd640b6 Peter Zijlstra 2020-05-26 669 irq_work_single(csd);
4b44a21dd640b6 Peter Zijlstra 2020-05-26 670 }
a148866489fbe2 Peter Zijlstra 2020-05-26 671
a148866489fbe2 Peter Zijlstra 2020-05-26 672 } else {
545b8c8df41f9e Peter Zijlstra 2020-06-15 673 prev = &csd->node.llist;
8053871d0f7f67 Linus Torvalds 2015-02-11 674 }
3d4422332711ef Jens Axboe 2008-06-26 675 }
478850160636c4 Frederic Weisbecker 2014-05-08 676
478850160636c4 Frederic Weisbecker 2014-05-08 677 /*
a148866489fbe2 Peter Zijlstra 2020-05-26 678 * Third; only CSD_TYPE_TTWU is left, issue those.
478850160636c4 Frederic Weisbecker 2014-05-08 679 */
a148866489fbe2 Peter Zijlstra 2020-05-26 680 if (entry)
a148866489fbe2 Peter Zijlstra 2020-05-26 681 sched_ttwu_pending(entry);
a5aabace5fb8ab Juergen Gross 2021-03-01 682
a5aabace5fb8ab Juergen Gross 2021-03-01 683 cfd_seq_store(this_cpu_ptr(&cfd_seq_local)->hdlend, CFD_SEQ_NOCPU,
a5aabace5fb8ab Juergen Gross 2021-03-01 684 smp_processor_id(), CFD_SEQ_HDLEND);
a148866489fbe2 Peter Zijlstra 2020-05-26 685 }
a148866489fbe2 Peter Zijlstra 2020-05-26 686
--
0-DAY CI Kernel Test Service
https://01.org/lkp
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-20220812]
[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-unwinder-support/20220801-204020
base: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 3d7cb6b04c3f3115719235cc6866b10326de34cd
config: loongarch-randconfig-s041-20220814 (https://download.01.org/0day-ci/archive/20220814/202208140621.UKarxp6n-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/102a43b57dafc9c0058a458a62d4133eb8020cbc
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Qing-Zhang/LoongArch-Add-unwinder-support/20220801-204020
git checkout 102a43b57dafc9c0058a458a62d4133eb8020cbc
# 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/time/
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/time/tick-sched.c:1151:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/time/tick-sched.c:1151:9: sparse: expected void *ptr
kernel/time/tick-sched.c:1151:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/time/tick-sched.c:1151:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/time/tick-sched.c:1151:9: sparse: expected void *ptr
kernel/time/tick-sched.c:1151:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/time/tick-sched.c:1151:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/time/tick-sched.c:1151:9: sparse: expected void *ptr
kernel/time/tick-sched.c:1151:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/time/tick-sched.c:1151:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got unsigned int [noderef] __percpu * @@
kernel/time/tick-sched.c:1151:9: sparse: expected void *ptr
kernel/time/tick-sched.c:1151:9: sparse: got unsigned int [noderef] __percpu *
>> kernel/time/tick-sched.c:1151:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/time/tick-sched.c:1151:9: sparse: expected void *ptr
kernel/time/tick-sched.c:1151:9: sparse: got int [noderef] __percpu *
>> kernel/time/tick-sched.c:1151:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/time/tick-sched.c:1151:9: sparse: expected void *ptr
kernel/time/tick-sched.c:1151:9: sparse: got int [noderef] __percpu *
>> kernel/time/tick-sched.c:1151:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/time/tick-sched.c:1151:9: sparse: expected void *ptr
kernel/time/tick-sched.c:1151:9: sparse: got int [noderef] __percpu *
>> kernel/time/tick-sched.c:1151:9: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void *ptr @@ got int [noderef] __percpu * @@
kernel/time/tick-sched.c:1151:9: sparse: expected void *ptr
kernel/time/tick-sched.c:1151:9: sparse: got int [noderef] __percpu *
vim +1151 kernel/time/tick-sched.c
554c8aa8ecade2 Rafael J. Wysocki 2018-04-03 1141
0e7767687fdabf Rafael J. Wysocki 2018-04-05 1142 /**
0e7767687fdabf Rafael J. Wysocki 2018-04-05 1143 * tick_nohz_idle_enter - prepare for entering idle on the current CPU
2bbb6817c0ac1b Frederic Weisbecker 2011-10-08 1144 *
0e7767687fdabf Rafael J. Wysocki 2018-04-05 1145 * Called when we start the idle loop.
280f06774afedf Frederic Weisbecker 2011-10-07 1146 */
1268fbc746ea1c Frederic Weisbecker 2011-11-17 1147 void tick_nohz_idle_enter(void)
280f06774afedf Frederic Weisbecker 2011-10-07 1148 {
280f06774afedf Frederic Weisbecker 2011-10-07 1149 struct tick_sched *ts;
280f06774afedf Frederic Weisbecker 2011-10-07 1150
ebf3adbad012b8 Frederic Weisbecker 2017-11-06 @1151 lockdep_assert_irqs_enabled();
0db49b72bce263 Linus Torvalds 2012-01-06 1152
1268fbc746ea1c Frederic Weisbecker 2011-11-17 1153 local_irq_disable();
1268fbc746ea1c Frederic Weisbecker 2011-11-17 1154
22127e93c587af Christoph Lameter 2014-08-17 1155 ts = this_cpu_ptr(&tick_cpu_sched);
23a8d888107ce4 Rafael J. Wysocki 2018-04-05 1156
23a8d888107ce4 Rafael J. Wysocki 2018-04-05 1157 WARN_ON_ONCE(ts->timer_expires_base);
23a8d888107ce4 Rafael J. Wysocki 2018-04-05 1158
280f06774afedf Frederic Weisbecker 2011-10-07 1159 ts->inidle = 1;
0e7767687fdabf Rafael J. Wysocki 2018-04-05 1160 tick_nohz_start_idle(ts);
1268fbc746ea1c Frederic Weisbecker 2011-11-17 1161
1268fbc746ea1c Frederic Weisbecker 2011-11-17 1162 local_irq_enable();
280f06774afedf Frederic Weisbecker 2011-10-07 1163 }
280f06774afedf Frederic Weisbecker 2011-10-07 1164
--
0-DAY CI Kernel Test Service
https://01.org/lkp
Hi, Qing,
On Mon, Aug 1, 2022 at 8:17 PM Qing Zhang <zhangqing@loongson.cn> 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>
> ---
> arch/loongarch/Kconfig | 5 ++++
> arch/loongarch/include/asm/processor.h | 9 +++++++
> arch/loongarch/include/asm/switch_to.h | 14 ++++++----
> arch/loongarch/include/asm/uaccess.h | 4 +--
> arch/loongarch/kernel/Makefile | 1 +
> arch/loongarch/kernel/asm-offsets.c | 2 ++
> arch/loongarch/kernel/process.c | 3 +++
> arch/loongarch/kernel/stacktrace.c | 37 ++++++++++++++++++++++++++
> arch/loongarch/kernel/switch.S | 2 ++
> 9 files changed, 70 insertions(+), 7 deletions(-)
> create mode 100644 arch/loongarch/kernel/stacktrace.c
>
> diff --git a/arch/loongarch/Kconfig b/arch/loongarch/Kconfig
> index 62b5b07fa4e1..85d0fa3147cd 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
> @@ -140,6 +141,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..43a5ab162d38 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
> @@ -28,10 +31,11 @@ extern asmlinkage struct task_struct *__switch_to(struct task_struct *prev,
> * That is, everything following __switch_to() will be skipped for new threads.
> * So everything that matters to new threads should be placed before __switch_to().
> */
> -#define switch_to(prev, next, last) \
> -do { \
> - lose_fpu_inatomic(1, prev); \
> - (last) = __switch_to(prev, next, task_thread_info(next)); \
> +#define switch_to(prev, next, last) \
> +do { \
> + lose_fpu_inatomic(1, prev); \
> + (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/include/asm/uaccess.h b/arch/loongarch/include/asm/uaccess.h
> index 2b44edc604a2..a8ae2af4025a 100644
> --- a/arch/loongarch/include/asm/uaccess.h
> +++ b/arch/loongarch/include/asm/uaccess.h
> @@ -229,13 +229,13 @@ extern unsigned long __copy_user(void *to, const void *from, __kernel_size_t n);
> static inline unsigned long __must_check
> raw_copy_from_user(void *to, const void __user *from, unsigned long n)
> {
> - return __copy_user(to, from, n);
> + return __copy_user(to, (__force const void *)from, n);
> }
>
> static inline unsigned long __must_check
> raw_copy_to_user(void __user *to, const void *from, unsigned long n)
> {
> - return __copy_user(to, from, n);
> + return __copy_user((__force void *)to, from, n);
Why this? Does it have something to do with stacktrace?
Huacai
> }
>
> #define INLINE_COPY_FROM_USER
> 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 37e84ac8ffc2..43ebbc3990f7 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
>
On 2022/8/1 下午11:30, Huacai Chen wrote:
> Hi, Qing,
>
> On Mon, Aug 1, 2022 at 8:17 PM Qing Zhang <zhangqing@loongson.cn> 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>
>> ---
>> arch/loongarch/Kconfig | 5 ++++
>> arch/loongarch/include/asm/processor.h | 9 +++++++
>> arch/loongarch/include/asm/switch_to.h | 14 ++++++----
>> arch/loongarch/include/asm/uaccess.h | 4 +--
>> arch/loongarch/kernel/Makefile | 1 +
>> arch/loongarch/kernel/asm-offsets.c | 2 ++
>> arch/loongarch/kernel/process.c | 3 +++
>> arch/loongarch/kernel/stacktrace.c | 37 ++++++++++++++++++++++++++
>> arch/loongarch/kernel/switch.S | 2 ++
>> 9 files changed, 70 insertions(+), 7 deletions(-)
>> create mode 100644 arch/loongarch/kernel/stacktrace.c
>>
>> diff --git a/arch/loongarch/include/asm/uaccess.h b/arch/loongarch/include/asm/uaccess.h
>> index 2b44edc604a2..a8ae2af4025a 100644
>> --- a/arch/loongarch/include/asm/uaccess.h
>> +++ b/arch/loongarch/include/asm/uaccess.h
>> @@ -229,13 +229,13 @@ extern unsigned long __copy_user(void *to, const void *from, __kernel_size_t n);
>> static inline unsigned long __must_check
>> raw_copy_from_user(void *to, const void __user *from, unsigned long n)
>> {
>> - return __copy_user(to, from, n);
>> + return __copy_user(to, (__force const void *)from, n);
>> }
>>
>> static inline unsigned long __must_check
>> raw_copy_to_user(void __user *to, const void *from, unsigned long n)
>> {
>> - return __copy_user(to, from, n);
>> + return __copy_user((__force void *)to, from, n);
> Why this? Does it have something to do with stacktrace?
>
> Huacai
Hi, huacai
This is kernel test robot report sparse warnings:
I reproduced locally and found that other architectures calling
__copy_user also use __force conversion, Is this modification appropriate?
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
Thanks,
-Qing
Hi, Qing,
On Tue, Aug 2, 2022 at 9:20 AM zhangqing <zhangqing@loongson.cn> wrote:
>
>
>
> On 2022/8/1 下午11:30, Huacai Chen wrote:
> > Hi, Qing,
> >
> > On Mon, Aug 1, 2022 at 8:17 PM Qing Zhang <zhangqing@loongson.cn> 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>
> >> ---
> >> arch/loongarch/Kconfig | 5 ++++
> >> arch/loongarch/include/asm/processor.h | 9 +++++++
> >> arch/loongarch/include/asm/switch_to.h | 14 ++++++----
> >> arch/loongarch/include/asm/uaccess.h | 4 +--
> >> arch/loongarch/kernel/Makefile | 1 +
> >> arch/loongarch/kernel/asm-offsets.c | 2 ++
> >> arch/loongarch/kernel/process.c | 3 +++
> >> arch/loongarch/kernel/stacktrace.c | 37 ++++++++++++++++++++++++++
> >> arch/loongarch/kernel/switch.S | 2 ++
> >> 9 files changed, 70 insertions(+), 7 deletions(-)
> >> create mode 100644 arch/loongarch/kernel/stacktrace.c
> >>
> >> diff --git a/arch/loongarch/include/asm/uaccess.h b/arch/loongarch/include/asm/uaccess.h
> >> index 2b44edc604a2..a8ae2af4025a 100644
> >> --- a/arch/loongarch/include/asm/uaccess.h
> >> +++ b/arch/loongarch/include/asm/uaccess.h
> >> @@ -229,13 +229,13 @@ extern unsigned long __copy_user(void *to, const void *from, __kernel_size_t n);
> >> static inline unsigned long __must_check
> >> raw_copy_from_user(void *to, const void __user *from, unsigned long n)
> >> {
> >> - return __copy_user(to, from, n);
> >> + return __copy_user(to, (__force const void *)from, n);
> >> }
> >>
> >> static inline unsigned long __must_check
> >> raw_copy_to_user(void __user *to, const void *from, unsigned long n)
> >> {
> >> - return __copy_user(to, from, n);
> >> + return __copy_user((__force void *)to, from, n);
> > Why this? Does it have something to do with stacktrace?
> >
> > Huacai
>
> Hi, huacai
>
> This is kernel test robot report sparse warnings:
> I reproduced locally and found that other architectures calling
> __copy_user also use __force conversion, Is this modification appropriate?
>
> 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
The modification might be correct, but should it be in this patch?
Huacai
>
> Thanks,
> -Qing
>
>
>
On 2022/8/2 上午9:30, Huacai Chen wrote:
> Hi, Qing,
>
> On Tue, Aug 2, 2022 at 9:20 AM zhangqing <zhangqing@loongson.cn> wrote:
>>
>>
>>
>> On 2022/8/1 下午11:30, Huacai Chen wrote:
>>> Hi, Qing,
>>>
>>> On Mon, Aug 1, 2022 at 8:17 PM Qing Zhang <zhangqing@loongson.cn> 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>
>>>> ---
>>>> arch/loongarch/Kconfig | 5 ++++
>>>> arch/loongarch/include/asm/processor.h | 9 +++++++
>>>> arch/loongarch/include/asm/switch_to.h | 14 ++++++----
>>>> arch/loongarch/include/asm/uaccess.h | 4 +--
>>>> arch/loongarch/kernel/Makefile | 1 +
>>>> arch/loongarch/kernel/asm-offsets.c | 2 ++
>>>> arch/loongarch/kernel/process.c | 3 +++
>>>> arch/loongarch/kernel/stacktrace.c | 37 ++++++++++++++++++++++++++
>>>> arch/loongarch/kernel/switch.S | 2 ++
>>>> 9 files changed, 70 insertions(+), 7 deletions(-)
>>>> create mode 100644 arch/loongarch/kernel/stacktrace.c
>>>>
>>>> diff --git a/arch/loongarch/include/asm/uaccess.h b/arch/loongarch/include/asm/uaccess.h
>>>> index 2b44edc604a2..a8ae2af4025a 100644
>>>> --- a/arch/loongarch/include/asm/uaccess.h
>>>> +++ b/arch/loongarch/include/asm/uaccess.h
>>>> @@ -229,13 +229,13 @@ extern unsigned long __copy_user(void *to, const void *from, __kernel_size_t n);
>>>> static inline unsigned long __must_check
>>>> raw_copy_from_user(void *to, const void __user *from, unsigned long n)
>>>> {
>>>> - return __copy_user(to, from, n);
>>>> + return __copy_user(to, (__force const void *)from, n);
>>>> }
>>>>
>>>> static inline unsigned long __must_check
>>>> raw_copy_to_user(void __user *to, const void *from, unsigned long n)
>>>> {
>>>> - return __copy_user(to, from, n);
>>>> + return __copy_user((__force void *)to, from, n);
>>> Why this? Does it have something to do with stacktrace?
>>>
>>> Huacai
>>
>> Hi, huacai
>>
>> This is kernel test robot report sparse warnings:
>> I reproduced locally and found that other architectures calling
>> __copy_user also use __force conversion, Is this modification appropriate?
>>
>> 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
> The modification might be correct, but should it be in this patch?
>
> Huacai
I will send this patch separately, it has nothing to do with the series
patch.
arch/loongarch/kernel/ptrace.c: note: in included file (through
include/linux/uaccess.h, include/linux/sched/task.h,
include/linux/sched/signal.h, include/linux/ptrace.h, include/linux/audit.h)
-Qing
>>
>> Thanks,
>> -Qing
>>
>>
>>
© 2016 - 2026 Red Hat, Inc.