arm64: stacktrace: simplify unwind_next_common()
authorMark Rutland <mark.rutland@arm.com>
Thu, 1 Sep 2022 13:06:39 +0000 (14:06 +0100)
committerCatalin Marinas <catalin.marinas@arm.com>
Fri, 9 Sep 2022 11:30:07 +0000 (12:30 +0100)
Currently unwind_next_common() takes a pointer to a stack_info which is
only ever used within unwind_next_common().

Make it a local variable and simplify callers.

There should be no functional change as a result of this patch.

Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Reviewed-by: Kalesh Singh <kaleshsingh@google.com>
Reviewed-by: Madhavan T. Venkataraman <madvenka@linux.microsoft.com>
Reviewed-by: Mark Brown <broonie@kernel.org>
Cc: Fuad Tabba <tabba@google.com>
Cc: Marc Zyngier <maz@kernel.org>
Cc: Will Deacon <will@kernel.org>
Link: https://lore.kernel.org/r/20220901130646.1316937-3-mark.rutland@arm.com
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
arch/arm64/include/asm/stacktrace/common.h
arch/arm64/kernel/stacktrace.c
arch/arm64/kvm/hyp/nvhe/stacktrace.c
arch/arm64/kvm/stacktrace.c

index b8b20ef5aa5dbba8e207a28de6535e1430ff842a..0fbae7c78b70de1d51fee2dbee790cc75f86459e 100644 (file)
@@ -146,27 +146,27 @@ typedef bool (*on_accessible_stack_fn)(const struct task_struct *tsk,
                                       struct stack_info *info);
 
 static inline int unwind_next_common(struct unwind_state *state,
-                                    struct stack_info *info,
                                     on_accessible_stack_fn accessible,
                                     stack_trace_translate_fp_fn translate_fp)
 {
+       struct stack_info info;
        unsigned long fp = state->fp, kern_fp = fp;
        struct task_struct *tsk = state->task;
 
        if (fp & 0x7)
                return -EINVAL;
 
-       if (!accessible(tsk, fp, 16, info))
+       if (!accessible(tsk, fp, 16, &info))
                return -EINVAL;
 
-       if (test_bit(info->type, state->stacks_done))
+       if (test_bit(info.type, state->stacks_done))
                return -EINVAL;
 
        /*
         * If fp is not from the current address space perform the necessary
         * translation before dereferencing it to get the next fp.
         */
-       if (translate_fp && !translate_fp(&kern_fp, info->type))
+       if (translate_fp && !translate_fp(&kern_fp, info.type))
                return -EINVAL;
 
        /*
@@ -183,7 +183,7 @@ static inline int unwind_next_common(struct unwind_state *state,
         * stack to another, it's never valid to unwind back to that first
         * stack.
         */
-       if (info->type == state->prev_type) {
+       if (info.type == state->prev_type) {
                if (fp <= state->prev_fp)
                        return -EINVAL;
        } else {
@@ -197,7 +197,7 @@ static inline int unwind_next_common(struct unwind_state *state,
        state->fp = READ_ONCE(*(unsigned long *)(kern_fp));
        state->pc = READ_ONCE(*(unsigned long *)(kern_fp + 8));
        state->prev_fp = fp;
-       state->prev_type = info->type;
+       state->prev_type = info.type;
 
        return 0;
 }
index ce190ee18a20121893470ab005ff0bccb6aa5f14..056fb045d0e0c6da922453d9c6f05a59bc7a0d99 100644 (file)
@@ -103,14 +103,13 @@ static int notrace unwind_next(struct unwind_state *state)
 {
        struct task_struct *tsk = state->task;
        unsigned long fp = state->fp;
-       struct stack_info info;
        int err;
 
        /* Final frame; nothing to unwind */
        if (fp == (unsigned long)task_pt_regs(tsk)->stackframe)
                return -ENOENT;
 
-       err = unwind_next_common(state, &info, on_accessible_stack, NULL);
+       err = unwind_next_common(state, on_accessible_stack, NULL);
        if (err)
                return err;
 
index 58f645ad66bcbec800a36ecf900ff229c1ac7f92..50a1fa6b5c0440ded3c48daff8f48601088a73bd 100644 (file)
@@ -71,9 +71,7 @@ static bool on_accessible_stack(const struct task_struct *tsk,
 
 static int unwind_next(struct unwind_state *state)
 {
-       struct stack_info info;
-
-       return unwind_next_common(state, &info, on_accessible_stack, NULL);
+       return unwind_next_common(state, on_accessible_stack, NULL);
 }
 
 static void notrace unwind(struct unwind_state *state,
index 949d19d603fbad9e59e433ca8ffc9bf62b1a7a06..b9cf551d9d31d833be357f5a53346daedb5d8759 100644 (file)
@@ -97,9 +97,7 @@ static bool on_accessible_stack(const struct task_struct *tsk,
 
 static int unwind_next(struct unwind_state *state)
 {
-       struct stack_info info;
-
-       return unwind_next_common(state, &info, on_accessible_stack,
+       return unwind_next_common(state, on_accessible_stack,
                                  kvm_nvhe_stack_kern_va);
 }