]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
drop the get_wchan changes from 5.15
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 18 Nov 2021 08:13:04 +0000 (09:13 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 18 Nov 2021 08:13:04 +0000 (09:13 +0100)
queue-5.15/sched-add-wrapper-for-get_wchan-to-keep-task-blocked.patch [deleted file]
queue-5.15/series
queue-5.15/x86-fix-__get_wchan-for-stacktrace.patch [deleted file]
queue-5.15/x86-fix-get_wchan-to-support-the-orc-unwinder.patch [deleted file]

diff --git a/queue-5.15/sched-add-wrapper-for-get_wchan-to-keep-task-blocked.patch b/queue-5.15/sched-add-wrapper-for-get_wchan-to-keep-task-blocked.patch
deleted file mode 100644 (file)
index 4149690..0000000
+++ /dev/null
@@ -1,943 +0,0 @@
-From ac9ca8a06f060318966c312bf9a5bd554dc392fb Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 29 Sep 2021 15:02:14 -0700
-Subject: sched: Add wrapper for get_wchan() to keep task blocked
-
-From: Kees Cook <keescook@chromium.org>
-
-[ Upstream commit 42a20f86dc19f9282d974df0ba4d226c865ab9dd ]
-
-Having a stable wchan means the process must be blocked and for it to
-stay that way while performing stack unwinding.
-
-Suggested-by: Peter Zijlstra <peterz@infradead.org>
-Signed-off-by: Kees Cook <keescook@chromium.org>
-Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
-Acked-by: Geert Uytterhoeven <geert@linux-m68k.org>
-Acked-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk> [arm]
-Tested-by: Mark Rutland <mark.rutland@arm.com> [arm64]
-Link: https://lkml.kernel.org/r/20211008111626.332092234@infradead.org
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- arch/alpha/include/asm/processor.h      |  2 +-
- arch/alpha/kernel/process.c             |  5 ++---
- arch/arc/include/asm/processor.h        |  2 +-
- arch/arc/kernel/stacktrace.c            |  4 ++--
- arch/arm/include/asm/processor.h        |  2 +-
- arch/arm/kernel/process.c               |  4 +---
- arch/arm64/include/asm/processor.h      |  2 +-
- arch/arm64/kernel/process.c             |  4 +---
- arch/csky/include/asm/processor.h       |  2 +-
- arch/csky/kernel/stacktrace.c           |  5 ++---
- arch/h8300/include/asm/processor.h      |  2 +-
- arch/h8300/kernel/process.c             |  5 +----
- arch/hexagon/include/asm/processor.h    |  2 +-
- arch/hexagon/kernel/process.c           |  4 +---
- arch/ia64/include/asm/processor.h       |  2 +-
- arch/ia64/kernel/process.c              |  5 +----
- arch/m68k/include/asm/processor.h       |  2 +-
- arch/m68k/kernel/process.c              |  4 +---
- arch/microblaze/include/asm/processor.h |  2 +-
- arch/microblaze/kernel/process.c        |  2 +-
- arch/mips/include/asm/processor.h       |  2 +-
- arch/mips/kernel/process.c              |  8 +++-----
- arch/nds32/include/asm/processor.h      |  2 +-
- arch/nds32/kernel/process.c             |  7 +------
- arch/nios2/include/asm/processor.h      |  2 +-
- arch/nios2/kernel/process.c             |  5 +----
- arch/openrisc/include/asm/processor.h   |  2 +-
- arch/openrisc/kernel/process.c          |  2 +-
- arch/parisc/include/asm/processor.h     |  2 +-
- arch/parisc/kernel/process.c            |  5 +----
- arch/powerpc/include/asm/processor.h    |  2 +-
- arch/powerpc/kernel/process.c           |  9 +++------
- arch/riscv/include/asm/processor.h      |  2 +-
- arch/riscv/kernel/stacktrace.c          | 12 +++++-------
- arch/s390/include/asm/processor.h       |  2 +-
- arch/s390/kernel/process.c              |  4 ++--
- arch/sh/include/asm/processor_32.h      |  2 +-
- arch/sh/kernel/process_32.c             |  5 +----
- arch/sparc/include/asm/processor_32.h   |  2 +-
- arch/sparc/include/asm/processor_64.h   |  2 +-
- arch/sparc/kernel/process_32.c          |  5 +----
- arch/sparc/kernel/process_64.c          |  5 +----
- arch/um/include/asm/processor-generic.h |  2 +-
- arch/um/kernel/process.c                |  5 +----
- arch/x86/include/asm/processor.h        |  2 +-
- arch/x86/kernel/process.c               |  5 +----
- arch/xtensa/include/asm/processor.h     |  2 +-
- arch/xtensa/kernel/process.c            |  5 +----
- include/linux/sched.h                   |  1 +
- kernel/sched/core.c                     | 19 +++++++++++++++++++
- 50 files changed, 80 insertions(+), 112 deletions(-)
-
-diff --git a/arch/alpha/include/asm/processor.h b/arch/alpha/include/asm/processor.h
-index 6100431da07a3..090499c99c1c1 100644
---- a/arch/alpha/include/asm/processor.h
-+++ b/arch/alpha/include/asm/processor.h
-@@ -42,7 +42,7 @@ extern void start_thread(struct pt_regs *, unsigned long, unsigned long);
- struct task_struct;
- extern void release_thread(struct task_struct *);
--unsigned long get_wchan(struct task_struct *p);
-+unsigned long __get_wchan(struct task_struct *p);
- #define KSTK_EIP(tsk) (task_pt_regs(tsk)->pc)
-diff --git a/arch/alpha/kernel/process.c b/arch/alpha/kernel/process.c
-index a5123ea426ce5..5f8527081da92 100644
---- a/arch/alpha/kernel/process.c
-+++ b/arch/alpha/kernel/process.c
-@@ -376,12 +376,11 @@ thread_saved_pc(struct task_struct *t)
- }
- unsigned long
--get_wchan(struct task_struct *p)
-+__get_wchan(struct task_struct *p)
- {
-       unsigned long schedule_frame;
-       unsigned long pc;
--      if (!p || p == current || task_is_running(p))
--              return 0;
-+
-       /*
-        * This one depends on the frame size of schedule().  Do a
-        * "disass schedule" in gdb to find the frame size.  Also, the
-diff --git a/arch/arc/include/asm/processor.h b/arch/arc/include/asm/processor.h
-index f28afcf5c6d10..54db9d7bb562d 100644
---- a/arch/arc/include/asm/processor.h
-+++ b/arch/arc/include/asm/processor.h
-@@ -70,7 +70,7 @@ struct task_struct;
- extern void start_thread(struct pt_regs * regs, unsigned long pc,
-                        unsigned long usp);
--extern unsigned int get_wchan(struct task_struct *p);
-+extern unsigned int __get_wchan(struct task_struct *p);
- #endif /* !__ASSEMBLY__ */
-diff --git a/arch/arc/kernel/stacktrace.c b/arch/arc/kernel/stacktrace.c
-index c376ff3147e7b..5372dc04e7847 100644
---- a/arch/arc/kernel/stacktrace.c
-+++ b/arch/arc/kernel/stacktrace.c
-@@ -15,7 +15,7 @@
-  *      = specifics of data structs where trace is saved(CONFIG_STACKTRACE etc)
-  *
-  *  vineetg: March 2009
-- *  -Implemented correct versions of thread_saved_pc() and get_wchan()
-+ *  -Implemented correct versions of thread_saved_pc() and __get_wchan()
-  *
-  *  rajeshwarr: 2008
-  *  -Initial implementation
-@@ -248,7 +248,7 @@ void show_stack(struct task_struct *tsk, unsigned long *sp, const char *loglvl)
-  * Of course just returning schedule( ) would be pointless so unwind until
-  * the function is not in schedular code
-  */
--unsigned int get_wchan(struct task_struct *tsk)
-+unsigned int __get_wchan(struct task_struct *tsk)
- {
-       return arc_unwind_core(tsk, NULL, __get_first_nonsched, NULL);
- }
-diff --git a/arch/arm/include/asm/processor.h b/arch/arm/include/asm/processor.h
-index 9e6b972863077..6af68edfa53ab 100644
---- a/arch/arm/include/asm/processor.h
-+++ b/arch/arm/include/asm/processor.h
-@@ -84,7 +84,7 @@ struct task_struct;
- /* Free all resources held by a thread. */
- extern void release_thread(struct task_struct *);
--unsigned long get_wchan(struct task_struct *p);
-+unsigned long __get_wchan(struct task_struct *p);
- #define task_pt_regs(p) \
-       ((struct pt_regs *)(THREAD_START_SP + task_stack_page(p)) - 1)
-diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
-index 0e2d3051741ed..96f577e59595f 100644
---- a/arch/arm/kernel/process.c
-+++ b/arch/arm/kernel/process.c
-@@ -276,13 +276,11 @@ int copy_thread(unsigned long clone_flags, unsigned long stack_start,
-       return 0;
- }
--unsigned long get_wchan(struct task_struct *p)
-+unsigned long __get_wchan(struct task_struct *p)
- {
-       struct stackframe frame;
-       unsigned long stack_page;
-       int count = 0;
--      if (!p || p == current || task_is_running(p))
--              return 0;
-       frame.fp = thread_saved_fp(p);
-       frame.sp = thread_saved_sp(p);
-diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h
-index ee2bdc1b9f5bb..55ca034238eae 100644
---- a/arch/arm64/include/asm/processor.h
-+++ b/arch/arm64/include/asm/processor.h
-@@ -257,7 +257,7 @@ struct task_struct;
- /* Free all resources held by a thread. */
- extern void release_thread(struct task_struct *);
--unsigned long get_wchan(struct task_struct *p);
-+unsigned long __get_wchan(struct task_struct *p);
- void update_sctlr_el1(u64 sctlr);
-diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
-index 40adb8cdbf5af..aacf2f5559a8b 100644
---- a/arch/arm64/kernel/process.c
-+++ b/arch/arm64/kernel/process.c
-@@ -528,13 +528,11 @@ __notrace_funcgraph struct task_struct *__switch_to(struct task_struct *prev,
-       return last;
- }
--unsigned long get_wchan(struct task_struct *p)
-+unsigned long __get_wchan(struct task_struct *p)
- {
-       struct stackframe frame;
-       unsigned long stack_page, ret = 0;
-       int count = 0;
--      if (!p || p == current || task_is_running(p))
--              return 0;
-       stack_page = (unsigned long)try_get_task_stack(p);
-       if (!stack_page)
-diff --git a/arch/csky/include/asm/processor.h b/arch/csky/include/asm/processor.h
-index 9e933021fe8e0..817dd60ff152d 100644
---- a/arch/csky/include/asm/processor.h
-+++ b/arch/csky/include/asm/processor.h
-@@ -81,7 +81,7 @@ static inline void release_thread(struct task_struct *dead_task)
- extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
--unsigned long get_wchan(struct task_struct *p);
-+unsigned long __get_wchan(struct task_struct *p);
- #define KSTK_EIP(tsk)         (task_pt_regs(tsk)->pc)
- #define KSTK_ESP(tsk)         (task_pt_regs(tsk)->usp)
-diff --git a/arch/csky/kernel/stacktrace.c b/arch/csky/kernel/stacktrace.c
-index 1b280ef080045..9f78f5d215117 100644
---- a/arch/csky/kernel/stacktrace.c
-+++ b/arch/csky/kernel/stacktrace.c
-@@ -111,12 +111,11 @@ static bool save_wchan(unsigned long pc, void *arg)
-       return false;
- }
--unsigned long get_wchan(struct task_struct *task)
-+unsigned long __get_wchan(struct task_struct *task)
- {
-       unsigned long pc = 0;
--      if (likely(task && task != current && !task_is_running(task)))
--              walk_stackframe(task, NULL, save_wchan, &pc);
-+      walk_stackframe(task, NULL, save_wchan, &pc);
-       return pc;
- }
-diff --git a/arch/h8300/include/asm/processor.h b/arch/h8300/include/asm/processor.h
-index a060b41b2d31c..141a23eb62b74 100644
---- a/arch/h8300/include/asm/processor.h
-+++ b/arch/h8300/include/asm/processor.h
-@@ -105,7 +105,7 @@ static inline void release_thread(struct task_struct *dead_task)
- {
- }
--unsigned long get_wchan(struct task_struct *p);
-+unsigned long __get_wchan(struct task_struct *p);
- #define       KSTK_EIP(tsk)   \
-       ({                       \
-diff --git a/arch/h8300/kernel/process.c b/arch/h8300/kernel/process.c
-index 2ac27e4248a46..8833fa4f5d516 100644
---- a/arch/h8300/kernel/process.c
-+++ b/arch/h8300/kernel/process.c
-@@ -128,15 +128,12 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
-       return 0;
- }
--unsigned long get_wchan(struct task_struct *p)
-+unsigned long __get_wchan(struct task_struct *p)
- {
-       unsigned long fp, pc;
-       unsigned long stack_page;
-       int count = 0;
--      if (!p || p == current || task_is_running(p))
--              return 0;
--
-       stack_page = (unsigned long)p;
-       fp = ((struct pt_regs *)p->thread.ksp)->er6;
-       do {
-diff --git a/arch/hexagon/include/asm/processor.h b/arch/hexagon/include/asm/processor.h
-index 9f0cc99420bee..615f7e49968e6 100644
---- a/arch/hexagon/include/asm/processor.h
-+++ b/arch/hexagon/include/asm/processor.h
-@@ -64,7 +64,7 @@ struct thread_struct {
- extern void release_thread(struct task_struct *dead_task);
- /* Get wait channel for task P.  */
--extern unsigned long get_wchan(struct task_struct *p);
-+extern unsigned long __get_wchan(struct task_struct *p);
- /*  The following stuff is pretty HEXAGON specific.  */
-diff --git a/arch/hexagon/kernel/process.c b/arch/hexagon/kernel/process.c
-index 6a6835fb42425..232dfd8956aa2 100644
---- a/arch/hexagon/kernel/process.c
-+++ b/arch/hexagon/kernel/process.c
-@@ -130,13 +130,11 @@ void flush_thread(void)
-  * is an identification of the point at which the scheduler
-  * was invoked by a blocked thread.
-  */
--unsigned long get_wchan(struct task_struct *p)
-+unsigned long __get_wchan(struct task_struct *p)
- {
-       unsigned long fp, pc;
-       unsigned long stack_page;
-       int count = 0;
--      if (!p || p == current || task_is_running(p))
--              return 0;
-       stack_page = (unsigned long)task_stack_page(p);
-       fp = ((struct hexagon_switch_stack *)p->thread.switch_sp)->fp;
-diff --git a/arch/ia64/include/asm/processor.h b/arch/ia64/include/asm/processor.h
-index 2d8bcdc27d7f8..45365c2ef5983 100644
---- a/arch/ia64/include/asm/processor.h
-+++ b/arch/ia64/include/asm/processor.h
-@@ -330,7 +330,7 @@ struct task_struct;
- #define release_thread(dead_task)
- /* Get wait channel for task P.  */
--extern unsigned long get_wchan (struct task_struct *p);
-+extern unsigned long __get_wchan (struct task_struct *p);
- /* Return instruction pointer of blocked task TSK.  */
- #define KSTK_EIP(tsk)                                 \
-diff --git a/arch/ia64/kernel/process.c b/arch/ia64/kernel/process.c
-index e56d63f4abf9d..834df24a88f12 100644
---- a/arch/ia64/kernel/process.c
-+++ b/arch/ia64/kernel/process.c
-@@ -523,15 +523,12 @@ exit_thread (struct task_struct *tsk)
- }
- unsigned long
--get_wchan (struct task_struct *p)
-+__get_wchan (struct task_struct *p)
- {
-       struct unw_frame_info info;
-       unsigned long ip;
-       int count = 0;
--      if (!p || p == current || task_is_running(p))
--              return 0;
--
-       /*
-        * Note: p may not be a blocked task (it could be current or
-        * another process running on some other CPU.  Rather than
-diff --git a/arch/m68k/include/asm/processor.h b/arch/m68k/include/asm/processor.h
-index f4d82c619a5c4..ffeda9aa526a5 100644
---- a/arch/m68k/include/asm/processor.h
-+++ b/arch/m68k/include/asm/processor.h
-@@ -150,7 +150,7 @@ static inline void release_thread(struct task_struct *dead_task)
- {
- }
--unsigned long get_wchan(struct task_struct *p);
-+unsigned long __get_wchan(struct task_struct *p);
- #define       KSTK_EIP(tsk)   \
-     ({                        \
-diff --git a/arch/m68k/kernel/process.c b/arch/m68k/kernel/process.c
-index 1ab692b952cd6..a6030dbaa0891 100644
---- a/arch/m68k/kernel/process.c
-+++ b/arch/m68k/kernel/process.c
-@@ -263,13 +263,11 @@ int dump_fpu (struct pt_regs *regs, struct user_m68kfp_struct *fpu)
- }
- EXPORT_SYMBOL(dump_fpu);
--unsigned long get_wchan(struct task_struct *p)
-+unsigned long __get_wchan(struct task_struct *p)
- {
-       unsigned long fp, pc;
-       unsigned long stack_page;
-       int count = 0;
--      if (!p || p == current || task_is_running(p))
--              return 0;
-       stack_page = (unsigned long)task_stack_page(p);
-       fp = ((struct switch_stack *)p->thread.ksp)->a6;
-diff --git a/arch/microblaze/include/asm/processor.h b/arch/microblaze/include/asm/processor.h
-index 06c6e493590a2..7e9e92670df33 100644
---- a/arch/microblaze/include/asm/processor.h
-+++ b/arch/microblaze/include/asm/processor.h
-@@ -68,7 +68,7 @@ static inline void release_thread(struct task_struct *dead_task)
- {
- }
--unsigned long get_wchan(struct task_struct *p);
-+unsigned long __get_wchan(struct task_struct *p);
- /* The size allocated for kernel stacks. This _must_ be a power of two! */
- # define KERNEL_STACK_SIZE    0x2000
-diff --git a/arch/microblaze/kernel/process.c b/arch/microblaze/kernel/process.c
-index 62aa237180b67..5e2b91c1e8ced 100644
---- a/arch/microblaze/kernel/process.c
-+++ b/arch/microblaze/kernel/process.c
-@@ -112,7 +112,7 @@ int copy_thread(unsigned long clone_flags, unsigned long usp, unsigned long arg,
-       return 0;
- }
--unsigned long get_wchan(struct task_struct *p)
-+unsigned long __get_wchan(struct task_struct *p)
- {
- /* TBD (used by procfs) */
-       return 0;
-diff --git a/arch/mips/include/asm/processor.h b/arch/mips/include/asm/processor.h
-index 0c3550c82b726..252ed38ce8c5a 100644
---- a/arch/mips/include/asm/processor.h
-+++ b/arch/mips/include/asm/processor.h
-@@ -369,7 +369,7 @@ static inline void flush_thread(void)
- {
- }
--unsigned long get_wchan(struct task_struct *p);
-+unsigned long __get_wchan(struct task_struct *p);
- #define __KSTK_TOS(tsk) ((unsigned long)task_stack_page(tsk) + \
-                        THREAD_SIZE - 32 - sizeof(struct pt_regs))
-diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c
-index 95aa86fa60778..cbff1b974f882 100644
---- a/arch/mips/kernel/process.c
-+++ b/arch/mips/kernel/process.c
-@@ -511,7 +511,7 @@ static int __init frame_info_init(void)
-       /*
-        * Without schedule() frame info, result given by
--       * thread_saved_pc() and get_wchan() are not reliable.
-+       * thread_saved_pc() and __get_wchan() are not reliable.
-        */
-       if (schedule_mfi.pc_offset < 0)
-               printk("Can't analyze schedule() prologue at %p\n", schedule);
-@@ -652,9 +652,9 @@ unsigned long unwind_stack(struct task_struct *task, unsigned long *sp,
- #endif
- /*
-- * get_wchan - a maintenance nightmare^W^Wpain in the ass ...
-+ * __get_wchan - a maintenance nightmare^W^Wpain in the ass ...
-  */
--unsigned long get_wchan(struct task_struct *task)
-+unsigned long __get_wchan(struct task_struct *task)
- {
-       unsigned long pc = 0;
- #ifdef CONFIG_KALLSYMS
-@@ -662,8 +662,6 @@ unsigned long get_wchan(struct task_struct *task)
-       unsigned long ra = 0;
- #endif
--      if (!task || task == current || task_is_running(task))
--              goto out;
-       if (!task_stack_page(task))
-               goto out;
-diff --git a/arch/nds32/include/asm/processor.h b/arch/nds32/include/asm/processor.h
-index b82369c7659d4..e6bfc74972bb3 100644
---- a/arch/nds32/include/asm/processor.h
-+++ b/arch/nds32/include/asm/processor.h
-@@ -83,7 +83,7 @@ extern struct task_struct *last_task_used_math;
- /* Prepare to copy thread state - unlazy all lazy status */
- #define prepare_to_copy(tsk)  do { } while (0)
--unsigned long get_wchan(struct task_struct *p);
-+unsigned long __get_wchan(struct task_struct *p);
- #define cpu_relax()                   barrier()
-diff --git a/arch/nds32/kernel/process.c b/arch/nds32/kernel/process.c
-index 391895b54d13c..49fab9e39cbff 100644
---- a/arch/nds32/kernel/process.c
-+++ b/arch/nds32/kernel/process.c
-@@ -233,15 +233,12 @@ int dump_fpu(struct pt_regs *regs, elf_fpregset_t * fpu)
- EXPORT_SYMBOL(dump_fpu);
--unsigned long get_wchan(struct task_struct *p)
-+unsigned long __get_wchan(struct task_struct *p)
- {
-       unsigned long fp, lr;
-       unsigned long stack_start, stack_end;
-       int count = 0;
--      if (!p || p == current || task_is_running(p))
--              return 0;
--
-       if (IS_ENABLED(CONFIG_FRAME_POINTER)) {
-               stack_start = (unsigned long)end_of_stack(p);
-               stack_end = (unsigned long)task_stack_page(p) + THREAD_SIZE;
-@@ -258,5 +255,3 @@ unsigned long get_wchan(struct task_struct *p)
-       }
-       return 0;
- }
--
--EXPORT_SYMBOL(get_wchan);
-diff --git a/arch/nios2/include/asm/processor.h b/arch/nios2/include/asm/processor.h
-index 94bcb86f679f5..b8125dfbcad2d 100644
---- a/arch/nios2/include/asm/processor.h
-+++ b/arch/nios2/include/asm/processor.h
-@@ -69,7 +69,7 @@ static inline void release_thread(struct task_struct *dead_task)
- {
- }
--extern unsigned long get_wchan(struct task_struct *p);
-+extern unsigned long __get_wchan(struct task_struct *p);
- #define task_pt_regs(p) \
-       ((struct pt_regs *)(THREAD_SIZE + task_stack_page(p)) - 1)
-diff --git a/arch/nios2/kernel/process.c b/arch/nios2/kernel/process.c
-index 9ff37ba2bb603..f8ea522a15880 100644
---- a/arch/nios2/kernel/process.c
-+++ b/arch/nios2/kernel/process.c
-@@ -217,15 +217,12 @@ void dump(struct pt_regs *fp)
-       pr_emerg("\n\n");
- }
--unsigned long get_wchan(struct task_struct *p)
-+unsigned long __get_wchan(struct task_struct *p)
- {
-       unsigned long fp, pc;
-       unsigned long stack_page;
-       int count = 0;
--      if (!p || p == current || task_is_running(p))
--              return 0;
--
-       stack_page = (unsigned long)p;
-       fp = ((struct switch_stack *)p->thread.ksp)->fp;        /* ;dgt2 */
-       do {
-diff --git a/arch/openrisc/include/asm/processor.h b/arch/openrisc/include/asm/processor.h
-index ad53b31848859..aa1699c18add8 100644
---- a/arch/openrisc/include/asm/processor.h
-+++ b/arch/openrisc/include/asm/processor.h
-@@ -73,7 +73,7 @@ struct thread_struct {
- void start_thread(struct pt_regs *regs, unsigned long nip, unsigned long sp);
- void release_thread(struct task_struct *);
--unsigned long get_wchan(struct task_struct *p);
-+unsigned long __get_wchan(struct task_struct *p);
- #define cpu_relax()     barrier()
-diff --git a/arch/openrisc/kernel/process.c b/arch/openrisc/kernel/process.c
-index b0698d9ce14fa..3c0c91bcdcbaa 100644
---- a/arch/openrisc/kernel/process.c
-+++ b/arch/openrisc/kernel/process.c
-@@ -263,7 +263,7 @@ void dump_elf_thread(elf_greg_t *dest, struct pt_regs* regs)
-       dest[35] = 0;
- }
--unsigned long get_wchan(struct task_struct *p)
-+unsigned long __get_wchan(struct task_struct *p)
- {
-       /* TODO */
-diff --git a/arch/parisc/include/asm/processor.h b/arch/parisc/include/asm/processor.h
-index eeb7da0642891..85a2dbfe52787 100644
---- a/arch/parisc/include/asm/processor.h
-+++ b/arch/parisc/include/asm/processor.h
-@@ -273,7 +273,7 @@ struct mm_struct;
- /* Free all resources held by a thread. */
- extern void release_thread(struct task_struct *);
--extern unsigned long get_wchan(struct task_struct *p);
-+extern unsigned long __get_wchan(struct task_struct *p);
- #define KSTK_EIP(tsk) ((tsk)->thread.regs.iaoq[0])
- #define KSTK_ESP(tsk) ((tsk)->thread.regs.gr[30])
-diff --git a/arch/parisc/kernel/process.c b/arch/parisc/kernel/process.c
-index 38ec4ae812396..4f562dee65a2c 100644
---- a/arch/parisc/kernel/process.c
-+++ b/arch/parisc/kernel/process.c
-@@ -240,15 +240,12 @@ copy_thread(unsigned long clone_flags, unsigned long usp,
- }
- unsigned long
--get_wchan(struct task_struct *p)
-+__get_wchan(struct task_struct *p)
- {
-       struct unwind_frame_info info;
-       unsigned long ip;
-       int count = 0;
--      if (!p || p == current || task_is_running(p))
--              return 0;
--
-       /*
-        * These bracket the sleeping functions..
-        */
-diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h
-index f348e564f7dd5..e39bd0ff69f3a 100644
---- a/arch/powerpc/include/asm/processor.h
-+++ b/arch/powerpc/include/asm/processor.h
-@@ -300,7 +300,7 @@ struct thread_struct {
- #define task_pt_regs(tsk)     ((tsk)->thread.regs)
--unsigned long get_wchan(struct task_struct *p);
-+unsigned long __get_wchan(struct task_struct *p);
- #define KSTK_EIP(tsk)  ((tsk)->thread.regs? (tsk)->thread.regs->nip: 0)
- #define KSTK_ESP(tsk)  ((tsk)->thread.regs? (tsk)->thread.regs->gpr[1]: 0)
-diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
-index 50436b52c2133..406d7ee9e3220 100644
---- a/arch/powerpc/kernel/process.c
-+++ b/arch/powerpc/kernel/process.c
-@@ -2111,14 +2111,11 @@ int validate_sp(unsigned long sp, struct task_struct *p,
- EXPORT_SYMBOL(validate_sp);
--static unsigned long __get_wchan(struct task_struct *p)
-+static unsigned long ___get_wchan(struct task_struct *p)
- {
-       unsigned long ip, sp;
-       int count = 0;
--      if (!p || p == current || task_is_running(p))
--              return 0;
--
-       sp = p->thread.ksp;
-       if (!validate_sp(sp, p, STACK_FRAME_OVERHEAD))
-               return 0;
-@@ -2137,14 +2134,14 @@ static unsigned long __get_wchan(struct task_struct *p)
-       return 0;
- }
--unsigned long get_wchan(struct task_struct *p)
-+unsigned long __get_wchan(struct task_struct *p)
- {
-       unsigned long ret;
-       if (!try_get_task_stack(p))
-               return 0;
--      ret = __get_wchan(p);
-+      ret = ___get_wchan(p);
-       put_task_stack(p);
-diff --git a/arch/riscv/include/asm/processor.h b/arch/riscv/include/asm/processor.h
-index 46b492c78cbbf..0749924d9e552 100644
---- a/arch/riscv/include/asm/processor.h
-+++ b/arch/riscv/include/asm/processor.h
-@@ -66,7 +66,7 @@ static inline void release_thread(struct task_struct *dead_task)
- {
- }
--extern unsigned long get_wchan(struct task_struct *p);
-+extern unsigned long __get_wchan(struct task_struct *p);
- static inline void wait_for_interrupt(void)
-diff --git a/arch/riscv/kernel/stacktrace.c b/arch/riscv/kernel/stacktrace.c
-index 315db3d0229bf..0fcdc0233faca 100644
---- a/arch/riscv/kernel/stacktrace.c
-+++ b/arch/riscv/kernel/stacktrace.c
-@@ -128,16 +128,14 @@ static bool save_wchan(void *arg, unsigned long pc)
-       return true;
- }
--unsigned long get_wchan(struct task_struct *task)
-+unsigned long __get_wchan(struct task_struct *task)
- {
-       unsigned long pc = 0;
--      if (likely(task && task != current && !task_is_running(task))) {
--              if (!try_get_task_stack(task))
--                      return 0;
--              walk_stackframe(task, NULL, save_wchan, &pc);
--              put_task_stack(task);
--      }
-+      if (!try_get_task_stack(task))
-+              return 0;
-+      walk_stackframe(task, NULL, save_wchan, &pc);
-+      put_task_stack(task);
-       return pc;
- }
-diff --git a/arch/s390/include/asm/processor.h b/arch/s390/include/asm/processor.h
-index 879b8e3f609cd..f54c152bf2bf9 100644
---- a/arch/s390/include/asm/processor.h
-+++ b/arch/s390/include/asm/processor.h
-@@ -192,7 +192,7 @@ static inline void release_thread(struct task_struct *tsk) { }
- void guarded_storage_release(struct task_struct *tsk);
- void gs_load_bc_cb(struct pt_regs *regs);
--unsigned long get_wchan(struct task_struct *p);
-+unsigned long __get_wchan(struct task_struct *p);
- #define task_pt_regs(tsk) ((struct pt_regs *) \
-         (task_stack_page(tsk) + THREAD_SIZE) - 1)
- #define KSTK_EIP(tsk) (task_pt_regs(tsk)->psw.addr)
-diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c
-index 350e94d0cac23..e5dd46b1bff8c 100644
---- a/arch/s390/kernel/process.c
-+++ b/arch/s390/kernel/process.c
-@@ -181,12 +181,12 @@ void execve_tail(void)
-       asm volatile("sfpc %0" : : "d" (0));
- }
--unsigned long get_wchan(struct task_struct *p)
-+unsigned long __get_wchan(struct task_struct *p)
- {
-       struct unwind_state state;
-       unsigned long ip = 0;
--      if (!p || p == current || task_is_running(p) || !task_stack_page(p))
-+      if (!task_stack_page(p))
-               return 0;
-       if (!try_get_task_stack(p))
-diff --git a/arch/sh/include/asm/processor_32.h b/arch/sh/include/asm/processor_32.h
-index aa92cc933889d..45240ec6b85a4 100644
---- a/arch/sh/include/asm/processor_32.h
-+++ b/arch/sh/include/asm/processor_32.h
-@@ -180,7 +180,7 @@ static inline void show_code(struct pt_regs *regs)
- }
- #endif
--extern unsigned long get_wchan(struct task_struct *p);
-+extern unsigned long __get_wchan(struct task_struct *p);
- #define KSTK_EIP(tsk)  (task_pt_regs(tsk)->pc)
- #define KSTK_ESP(tsk)  (task_pt_regs(tsk)->regs[15])
-diff --git a/arch/sh/kernel/process_32.c b/arch/sh/kernel/process_32.c
-index 717de05c81f49..1c28e3cddb60d 100644
---- a/arch/sh/kernel/process_32.c
-+++ b/arch/sh/kernel/process_32.c
-@@ -182,13 +182,10 @@ __switch_to(struct task_struct *prev, struct task_struct *next)
-       return prev;
- }
--unsigned long get_wchan(struct task_struct *p)
-+unsigned long __get_wchan(struct task_struct *p)
- {
-       unsigned long pc;
--      if (!p || p == current || task_is_running(p))
--              return 0;
--
-       /*
-        * The same comment as on the Alpha applies here, too ...
-        */
-diff --git a/arch/sparc/include/asm/processor_32.h b/arch/sparc/include/asm/processor_32.h
-index b6242f7771e9e..647bf0ac7beb9 100644
---- a/arch/sparc/include/asm/processor_32.h
-+++ b/arch/sparc/include/asm/processor_32.h
-@@ -89,7 +89,7 @@ static inline void start_thread(struct pt_regs * regs, unsigned long pc,
- /* Free all resources held by a thread. */
- #define release_thread(tsk)           do { } while(0)
--unsigned long get_wchan(struct task_struct *);
-+unsigned long __get_wchan(struct task_struct *);
- #define task_pt_regs(tsk) ((tsk)->thread.kregs)
- #define KSTK_EIP(tsk)  ((tsk)->thread.kregs->pc)
-diff --git a/arch/sparc/include/asm/processor_64.h b/arch/sparc/include/asm/processor_64.h
-index 5cf145f18f36b..ae851e8fce4c9 100644
---- a/arch/sparc/include/asm/processor_64.h
-+++ b/arch/sparc/include/asm/processor_64.h
-@@ -183,7 +183,7 @@ do { \
- /* Free all resources held by a thread. */
- #define release_thread(tsk)           do { } while (0)
--unsigned long get_wchan(struct task_struct *task);
-+unsigned long __get_wchan(struct task_struct *task);
- #define task_pt_regs(tsk) (task_thread_info(tsk)->kregs)
- #define KSTK_EIP(tsk)  (task_pt_regs(tsk)->tpc)
-diff --git a/arch/sparc/kernel/process_32.c b/arch/sparc/kernel/process_32.c
-index bbbe0cfef7465..2dc0bf9fe62eb 100644
---- a/arch/sparc/kernel/process_32.c
-+++ b/arch/sparc/kernel/process_32.c
-@@ -365,7 +365,7 @@ int copy_thread(unsigned long clone_flags, unsigned long sp, unsigned long arg,
-       return 0;
- }
--unsigned long get_wchan(struct task_struct *task)
-+unsigned long __get_wchan(struct task_struct *task)
- {
-       unsigned long pc, fp, bias = 0;
-       unsigned long task_base = (unsigned long) task;
-@@ -373,9 +373,6 @@ unsigned long get_wchan(struct task_struct *task)
-       struct reg_window32 *rw;
-       int count = 0;
--      if (!task || task == current || task_is_running(task))
--              goto out;
--
-       fp = task_thread_info(task)->ksp + bias;
-       do {
-               /* Bogus frame pointer? */
-diff --git a/arch/sparc/kernel/process_64.c b/arch/sparc/kernel/process_64.c
-index d1cc410d2f647..f5b2cac8669f9 100644
---- a/arch/sparc/kernel/process_64.c
-+++ b/arch/sparc/kernel/process_64.c
-@@ -663,7 +663,7 @@ int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
-       return 0;
- }
--unsigned long get_wchan(struct task_struct *task)
-+unsigned long __get_wchan(struct task_struct *task)
- {
-       unsigned long pc, fp, bias = 0;
-       struct thread_info *tp;
-@@ -671,9 +671,6 @@ unsigned long get_wchan(struct task_struct *task)
-         unsigned long ret = 0;
-       int count = 0; 
--      if (!task || task == current || task_is_running(task))
--              goto out;
--
-       tp = task_thread_info(task);
-       bias = STACK_BIAS;
-       fp = task_thread_info(task)->ksp + bias;
-diff --git a/arch/um/include/asm/processor-generic.h b/arch/um/include/asm/processor-generic.h
-index b5cf0ed116d9e..579692a40a556 100644
---- a/arch/um/include/asm/processor-generic.h
-+++ b/arch/um/include/asm/processor-generic.h
-@@ -106,6 +106,6 @@ extern struct cpuinfo_um boot_cpu_data;
- #define cache_line_size()     (boot_cpu_data.cache_alignment)
- #define KSTK_REG(tsk, reg) get_thread_reg(reg, &tsk->thread.switch_buf)
--extern unsigned long get_wchan(struct task_struct *p);
-+extern unsigned long __get_wchan(struct task_struct *p);
- #endif
-diff --git a/arch/um/kernel/process.c b/arch/um/kernel/process.c
-index 457a38db368b7..82107373ac7e9 100644
---- a/arch/um/kernel/process.c
-+++ b/arch/um/kernel/process.c
-@@ -364,14 +364,11 @@ unsigned long arch_align_stack(unsigned long sp)
- }
- #endif
--unsigned long get_wchan(struct task_struct *p)
-+unsigned long __get_wchan(struct task_struct *p)
- {
-       unsigned long stack_page, sp, ip;
-       bool seen_sched = 0;
--      if ((p == NULL) || (p == current) || task_is_running(p))
--              return 0;
--
-       stack_page = (unsigned long) task_stack_page(p);
-       /* Bail if the process has no kernel stack for some reason */
-       if (stack_page == 0)
-diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
-index 577f342dbfb27..2b5f6c6c2b322 100644
---- a/arch/x86/include/asm/processor.h
-+++ b/arch/x86/include/asm/processor.h
-@@ -590,7 +590,7 @@ static inline void load_sp0(unsigned long sp0)
- /* Free all resources held by a thread. */
- extern void release_thread(struct task_struct *);
--unsigned long get_wchan(struct task_struct *p);
-+unsigned long __get_wchan(struct task_struct *p);
- /*
-  * Generic CPUID function
-diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
-index cd426c3283ee1..266962547b58c 100644
---- a/arch/x86/kernel/process.c
-+++ b/arch/x86/kernel/process.c
-@@ -943,13 +943,10 @@ unsigned long arch_randomize_brk(struct mm_struct *mm)
-  * because the task might wake up and we might look at a stack
-  * changing under us.
-  */
--unsigned long get_wchan(struct task_struct *p)
-+unsigned long __get_wchan(struct task_struct *p)
- {
-       unsigned long entry = 0;
--      if (p == current || task_is_running(p))
--              return 0;
--
-       stack_trace_save_tsk(p, &entry, 1, 0);
-       return entry;
- }
-diff --git a/arch/xtensa/include/asm/processor.h b/arch/xtensa/include/asm/processor.h
-index 7f63aca6a0d34..ad15fbc572838 100644
---- a/arch/xtensa/include/asm/processor.h
-+++ b/arch/xtensa/include/asm/processor.h
-@@ -215,7 +215,7 @@ struct mm_struct;
- /* Free all resources held by a thread. */
- #define release_thread(thread) do { } while(0)
--extern unsigned long get_wchan(struct task_struct *p);
-+extern unsigned long __get_wchan(struct task_struct *p);
- #define KSTK_EIP(tsk)         (task_pt_regs(tsk)->pc)
- #define KSTK_ESP(tsk)         (task_pt_regs(tsk)->areg[1])
-diff --git a/arch/xtensa/kernel/process.c b/arch/xtensa/kernel/process.c
-index 0601653406123..47f933fed8700 100644
---- a/arch/xtensa/kernel/process.c
-+++ b/arch/xtensa/kernel/process.c
-@@ -298,15 +298,12 @@ int copy_thread(unsigned long clone_flags, unsigned long usp_thread_fn,
-  * These bracket the sleeping functions..
-  */
--unsigned long get_wchan(struct task_struct *p)
-+unsigned long __get_wchan(struct task_struct *p)
- {
-       unsigned long sp, pc;
-       unsigned long stack_page = (unsigned long) task_stack_page(p);
-       int count = 0;
--      if (!p || p == current || task_is_running(p))
--              return 0;
--
-       sp = p->thread.sp;
-       pc = MAKE_PC_FROM_RA(p->thread.ra, p->thread.sp);
-diff --git a/include/linux/sched.h b/include/linux/sched.h
-index c1a927ddec646..71b012a224e4c 100644
---- a/include/linux/sched.h
-+++ b/include/linux/sched.h
-@@ -2137,6 +2137,7 @@ static inline void set_task_cpu(struct task_struct *p, unsigned int cpu)
- #endif /* CONFIG_SMP */
- extern bool sched_task_on_rq(struct task_struct *p);
-+extern unsigned long get_wchan(struct task_struct *p);
- /*
-  * In order to reduce various lock holder preemption latencies provide an
-diff --git a/kernel/sched/core.c b/kernel/sched/core.c
-index aea60eae21a7f..d37f959ed1ab8 100644
---- a/kernel/sched/core.c
-+++ b/kernel/sched/core.c
-@@ -1962,6 +1962,25 @@ bool sched_task_on_rq(struct task_struct *p)
-       return task_on_rq_queued(p);
- }
-+unsigned long get_wchan(struct task_struct *p)
-+{
-+      unsigned long ip = 0;
-+      unsigned int state;
-+
-+      if (!p || p == current)
-+              return 0;
-+
-+      /* Only get wchan if task is blocked and we can keep it that way. */
-+      raw_spin_lock_irq(&p->pi_lock);
-+      state = READ_ONCE(p->__state);
-+      smp_rmb(); /* see try_to_wake_up() */
-+      if (state != TASK_RUNNING && state != TASK_WAKING && !p->on_rq)
-+              ip = __get_wchan(p);
-+      raw_spin_unlock_irq(&p->pi_lock);
-+
-+      return ip;
-+}
-+
- static inline void enqueue_task(struct rq *rq, struct task_struct *p, int flags)
- {
-       if (!(flags & ENQUEUE_NOCLOCK))
--- 
-2.33.0
-
index 71cc82684122cf6aae107a23efac3cd8689a24f7..d5efba76ccf766d7c164ec54c725b504f34c4b7d 100644 (file)
@@ -424,7 +424,6 @@ kernel-sched-fix-sched_fork-access-an-invalid-sched_.patch
 net-fealnx-fix-build-for-uml.patch
 net-intel-igc_ptp-fix-build-for-uml.patch
 net-tulip-winbond-840-fix-build-for-uml.patch
-x86-fix-get_wchan-to-support-the-orc-unwinder.patch
 tcp-switch-orphan_count-to-bare-per-cpu-counters.patch
 crypto-octeontx2-set-assoclen-in-aead_do_fallback.patch
 thermal-core-fix-a-uaf-bug-in-__thermal_cooling_devi.patch
@@ -519,8 +518,6 @@ tcp-don-t-free-a-fin-sk_buff-in-tcp_remove_empty_skb.patch
 tracing-fix-missing-trace_boot_init_histograms-kstrd.patch
 cpufreq-intel_pstate-fix-cpu-pstate.turbo_freq-initi.patch
 spi-spi-rpc-if-check-return-value-of-rpcif_sw_init.patch
-sched-add-wrapper-for-get_wchan-to-keep-task-blocked.patch
-x86-fix-__get_wchan-for-stacktrace.patch
 samples-kretprobes-fix-return-value-if-register_kret.patch
 kvm-s390-fix-handle_sske-page-fault-handling.patch
 libertas_tf-fix-possible-memory-leak-in-probe-and-di.patch
diff --git a/queue-5.15/x86-fix-__get_wchan-for-stacktrace.patch b/queue-5.15/x86-fix-__get_wchan-for-stacktrace.patch
deleted file mode 100644 (file)
index 55584d7..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-From ed9a94dc9a3b34131f5063fd69fe7ca3ed81c5cc Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 22 Oct 2021 16:53:02 +0200
-Subject: x86: Fix __get_wchan() for !STACKTRACE
-
-From: Peter Zijlstra <peterz@infradead.org>
-
-[ Upstream commit 5d1ceb3969b6b2e47e2df6d17790a7c5a20fcbb4 ]
-
-Use asm/unwind.h to implement wchan, since we cannot always rely on
-STACKTRACE=y.
-
-Fixes: bc9bbb81730e ("x86: Fix get_wchan() to support the ORC unwinder")
-Reported-by: Stephen Rothwell <sfr@canb.auug.org.au>
-Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
-Reviewed-by: Kees Cook <keescook@chromium.org>
-Link: https://lkml.kernel.org/r/20211022152104.137058575@infradead.org
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- arch/x86/kernel/process.c | 17 ++++++++++++++---
- 1 file changed, 14 insertions(+), 3 deletions(-)
-
-diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
-index 266962547b58c..2fe1810e922a9 100644
---- a/arch/x86/kernel/process.c
-+++ b/arch/x86/kernel/process.c
-@@ -43,6 +43,7 @@
- #include <asm/io_bitmap.h>
- #include <asm/proto.h>
- #include <asm/frame.h>
-+#include <asm/unwind.h>
- #include "process.h"
-@@ -945,10 +946,20 @@ unsigned long arch_randomize_brk(struct mm_struct *mm)
-  */
- unsigned long __get_wchan(struct task_struct *p)
- {
--      unsigned long entry = 0;
-+      struct unwind_state state;
-+      unsigned long addr = 0;
--      stack_trace_save_tsk(p, &entry, 1, 0);
--      return entry;
-+      for (unwind_start(&state, p, NULL, NULL); !unwind_done(&state);
-+           unwind_next_frame(&state)) {
-+              addr = unwind_get_return_address(&state);
-+              if (!addr)
-+                      break;
-+              if (in_sched_functions(addr))
-+                      continue;
-+              break;
-+      }
-+
-+      return addr;
- }
- long do_arch_prctl_common(struct task_struct *task, int option,
--- 
-2.33.0
-
diff --git a/queue-5.15/x86-fix-get_wchan-to-support-the-orc-unwinder.patch b/queue-5.15/x86-fix-get_wchan-to-support-the-orc-unwinder.patch
deleted file mode 100644 (file)
index 6fef9f0..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-From c3d0075578e111fe541a909b8a606ba4ab5c0403 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 29 Sep 2021 15:02:17 -0700
-Subject: x86: Fix get_wchan() to support the ORC unwinder
-
-From: Qi Zheng <zhengqi.arch@bytedance.com>
-
-[ Upstream commit bc9bbb81730ea667c31c5b284f95ee312bab466f ]
-
-Currently, the kernel CONFIG_UNWINDER_ORC option is enabled by default
-on x86, but the implementation of get_wchan() is still based on the frame
-pointer unwinder, so the /proc/<pid>/wchan usually returned 0 regardless
-of whether the task <pid> is running.
-
-Reimplement get_wchan() by calling stack_trace_save_tsk(), which is
-adapted to the ORC and frame pointer unwinders.
-
-Fixes: ee9f8fce9964 ("x86/unwind: Add the ORC unwinder")
-Signed-off-by: Qi Zheng <zhengqi.arch@bytedance.com>
-Signed-off-by: Kees Cook <keescook@chromium.org>
-Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
-Link: https://lkml.kernel.org/r/20211008111626.271115116@infradead.org
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- arch/x86/kernel/process.c | 51 +++------------------------------------
- 1 file changed, 3 insertions(+), 48 deletions(-)
-
-diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
-index f2f733bcb2b95..cd426c3283ee1 100644
---- a/arch/x86/kernel/process.c
-+++ b/arch/x86/kernel/process.c
-@@ -945,58 +945,13 @@ unsigned long arch_randomize_brk(struct mm_struct *mm)
-  */
- unsigned long get_wchan(struct task_struct *p)
- {
--      unsigned long start, bottom, top, sp, fp, ip, ret = 0;
--      int count = 0;
-+      unsigned long entry = 0;
-       if (p == current || task_is_running(p))
-               return 0;
--      if (!try_get_task_stack(p))
--              return 0;
--
--      start = (unsigned long)task_stack_page(p);
--      if (!start)
--              goto out;
--
--      /*
--       * Layout of the stack page:
--       *
--       * ----------- topmax = start + THREAD_SIZE - sizeof(unsigned long)
--       * PADDING
--       * ----------- top = topmax - TOP_OF_KERNEL_STACK_PADDING
--       * stack
--       * ----------- bottom = start
--       *
--       * The tasks stack pointer points at the location where the
--       * framepointer is stored. The data on the stack is:
--       * ... IP FP ... IP FP
--       *
--       * We need to read FP and IP, so we need to adjust the upper
--       * bound by another unsigned long.
--       */
--      top = start + THREAD_SIZE - TOP_OF_KERNEL_STACK_PADDING;
--      top -= 2 * sizeof(unsigned long);
--      bottom = start;
--
--      sp = READ_ONCE(p->thread.sp);
--      if (sp < bottom || sp > top)
--              goto out;
--
--      fp = READ_ONCE_NOCHECK(((struct inactive_task_frame *)sp)->bp);
--      do {
--              if (fp < bottom || fp > top)
--                      goto out;
--              ip = READ_ONCE_NOCHECK(*(unsigned long *)(fp + sizeof(unsigned long)));
--              if (!in_sched_functions(ip)) {
--                      ret = ip;
--                      goto out;
--              }
--              fp = READ_ONCE_NOCHECK(*(unsigned long *)fp);
--      } while (count++ < 16 && !task_is_running(p));
--
--out:
--      put_task_stack(p);
--      return ret;
-+      stack_trace_save_tsk(p, &entry, 1, 0);
-+      return entry;
- }
- long do_arch_prctl_common(struct task_struct *task, int option,
--- 
-2.33.0
-