[PATCH v2] LoongArch: Remove some checks for ORC unwinder

Tiezhu Yang posted 1 patch 1 month, 3 weeks ago
arch/loongarch/kernel/unwind_orc.c | 16 +++++-----------
1 file changed, 5 insertions(+), 11 deletions(-)
[PATCH v2] LoongArch: Remove some checks for ORC unwinder
Posted by Tiezhu Yang 1 month, 3 weeks ago
According to the following function definitions, __kernel_text_address()
already checks __module_text_address(), so it should remove the check of
__module_text_address() in bt_address() at least.

int __kernel_text_address(unsigned long addr)
{
	if (kernel_text_address(addr))
		return 1;
	...
	return 0;
}

int kernel_text_address(unsigned long addr)
{
	bool no_rcu;
	int ret = 1;
	...
	if (is_module_text_address(addr))
		goto out;
	...
	return ret;
}

bool is_module_text_address(unsigned long addr)
{
	guard(rcu)();
	return __module_text_address(addr) != NULL;
}

Furthermore, there are two checks of __kernel_text_address(), one is in
bt_address() and the other is after calling bt_address(), it looks like
redundant.

Handle the exception address first and then use __kernel_text_address()
to validate the calculated address for exception or the normal address
in bt_address(), then it can remove the check of __kernel_text_address()
after calling bt_address().

Just remove unnecessary checks, no functional changes intended.

Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
---
 arch/loongarch/kernel/unwind_orc.c | 16 +++++-----------
 1 file changed, 5 insertions(+), 11 deletions(-)

diff --git a/arch/loongarch/kernel/unwind_orc.c b/arch/loongarch/kernel/unwind_orc.c
index 0d5fa64a2225..fe4fe5f266b9 100644
--- a/arch/loongarch/kernel/unwind_orc.c
+++ b/arch/loongarch/kernel/unwind_orc.c
@@ -360,12 +360,6 @@ static inline unsigned long bt_address(unsigned long ra)
 {
 	extern unsigned long eentry;
 
-	if (__kernel_text_address(ra))
-		return ra;
-
-	if (__module_text_address(ra))
-		return ra;
-
 	if (ra >= eentry && ra < eentry +  EXCCODE_INT_END * VECSIZE) {
 		unsigned long func;
 		unsigned long type = (ra - eentry) / VECSIZE;
@@ -383,10 +377,13 @@ static inline unsigned long bt_address(unsigned long ra)
 			break;
 		}
 
-		return func + offset;
+		ra = func + offset;
 	}
 
-	return ra;
+	if (__kernel_text_address(ra))
+		return ra;
+
+	return 0;
 }
 
 bool unwind_next_frame(struct unwind_state *state)
@@ -512,9 +509,6 @@ bool unwind_next_frame(struct unwind_state *state)
 		goto err;
 	}
 
-	if (!__kernel_text_address(state->pc))
-		goto err;
-
 	return true;
 
 err:
-- 
2.42.0
Re: [PATCH v2] LoongArch: Remove some checks for ORC unwinder
Posted by Huacai Chen 1 month, 1 week ago
Applied, thanks.

Huacai

On Tue, Dec 16, 2025 at 9:53 AM Tiezhu Yang <yangtiezhu@loongson.cn> wrote:
>
> According to the following function definitions, __kernel_text_address()
> already checks __module_text_address(), so it should remove the check of
> __module_text_address() in bt_address() at least.
>
> int __kernel_text_address(unsigned long addr)
> {
>         if (kernel_text_address(addr))
>                 return 1;
>         ...
>         return 0;
> }
>
> int kernel_text_address(unsigned long addr)
> {
>         bool no_rcu;
>         int ret = 1;
>         ...
>         if (is_module_text_address(addr))
>                 goto out;
>         ...
>         return ret;
> }
>
> bool is_module_text_address(unsigned long addr)
> {
>         guard(rcu)();
>         return __module_text_address(addr) != NULL;
> }
>
> Furthermore, there are two checks of __kernel_text_address(), one is in
> bt_address() and the other is after calling bt_address(), it looks like
> redundant.
>
> Handle the exception address first and then use __kernel_text_address()
> to validate the calculated address for exception or the normal address
> in bt_address(), then it can remove the check of __kernel_text_address()
> after calling bt_address().
>
> Just remove unnecessary checks, no functional changes intended.
>
> Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
> ---
>  arch/loongarch/kernel/unwind_orc.c | 16 +++++-----------
>  1 file changed, 5 insertions(+), 11 deletions(-)
>
> diff --git a/arch/loongarch/kernel/unwind_orc.c b/arch/loongarch/kernel/unwind_orc.c
> index 0d5fa64a2225..fe4fe5f266b9 100644
> --- a/arch/loongarch/kernel/unwind_orc.c
> +++ b/arch/loongarch/kernel/unwind_orc.c
> @@ -360,12 +360,6 @@ static inline unsigned long bt_address(unsigned long ra)
>  {
>         extern unsigned long eentry;
>
> -       if (__kernel_text_address(ra))
> -               return ra;
> -
> -       if (__module_text_address(ra))
> -               return ra;
> -
>         if (ra >= eentry && ra < eentry +  EXCCODE_INT_END * VECSIZE) {
>                 unsigned long func;
>                 unsigned long type = (ra - eentry) / VECSIZE;
> @@ -383,10 +377,13 @@ static inline unsigned long bt_address(unsigned long ra)
>                         break;
>                 }
>
> -               return func + offset;
> +               ra = func + offset;
>         }
>
> -       return ra;
> +       if (__kernel_text_address(ra))
> +               return ra;
> +
> +       return 0;
>  }
>
>  bool unwind_next_frame(struct unwind_state *state)
> @@ -512,9 +509,6 @@ bool unwind_next_frame(struct unwind_state *state)
>                 goto err;
>         }
>
> -       if (!__kernel_text_address(state->pc))
> -               goto err;
> -
>         return true;
>
>  err:
> --
> 2.42.0
>
>