[PATCH 1/2] arm64: kasan: do not instrument stacktrace.c

18 views
Skip to first unread message

andrey.k...@linux.dev

unread,
May 21, 2022, 7:51:02 PM5/21/22
to Mark Rutland, Andrey Konovalov, Marco Elver, Alexander Potapenko, Dmitry Vyukov, Andrey Ryabinin, kasa...@googlegroups.com, Catalin Marinas, Vincenzo Frascino, Will Deacon, linux-ar...@lists.infradead.org, linux-...@vger.kernel.org, Andrey Konovalov
From: Andrey Konovalov <andre...@google.com>

Disable KASAN instrumentation of arch/arm64/kernel/stacktrace.c.

This speeds up Generic KASAN by 5-20%.

As a side-effect, KASAN is now unable to detect bugs in the stack trace
collection code. This is taken as an acceptable downside.

Also replace READ_ONCE_NOCHECK() with READ_ONCE() in stacktrace.c.
As the file is now not instrumented, there is no need to use the
NOCHECK version of READ_ONCE().

Suggested-by: Mark Rutland <mark.r...@arm.com>
Signed-off-by: Andrey Konovalov <andre...@google.com>
---
arch/arm64/kernel/Makefile | 3 +++
arch/arm64/kernel/stacktrace.c | 4 ++--
2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile
index fa7981d0d917..da8cf6905c76 100644
--- a/arch/arm64/kernel/Makefile
+++ b/arch/arm64/kernel/Makefile
@@ -14,6 +14,9 @@ CFLAGS_REMOVE_return_address.o = $(CC_FLAGS_FTRACE)
CFLAGS_REMOVE_syscall.o = -fstack-protector -fstack-protector-strong
CFLAGS_syscall.o += -fno-stack-protector

+# Do not instrument to improve performance.
+KASAN_SANITIZE_stacktrace.o := n
+
# It's not safe to invoke KCOV when portions of the kernel environment aren't
# available or are out-of-sync with HW state. Since `noinstr` doesn't always
# inhibit KCOV instrumentation, disable it for the entire compilation unit.
diff --git a/arch/arm64/kernel/stacktrace.c b/arch/arm64/kernel/stacktrace.c
index e4103e085681..33e96ae4b15f 100644
--- a/arch/arm64/kernel/stacktrace.c
+++ b/arch/arm64/kernel/stacktrace.c
@@ -110,8 +110,8 @@ static int notrace unwind_frame(struct task_struct *tsk,
* Record this frame record's values and location. The prev_fp and
* prev_type are only meaningful to the next unwind_frame() invocation.
*/
- frame->fp = READ_ONCE_NOCHECK(*(unsigned long *)(fp));
- frame->pc = READ_ONCE_NOCHECK(*(unsigned long *)(fp + 8));
+ frame->fp = READ_ONCE(*(unsigned long *)(fp));
+ frame->pc = READ_ONCE(*(unsigned long *)(fp + 8));
frame->prev_fp = fp;
frame->prev_type = info.type;

--
2.25.1

andrey.k...@linux.dev

unread,
May 21, 2022, 7:51:04 PM5/21/22
to Mark Rutland, Andrey Konovalov, Marco Elver, Alexander Potapenko, Dmitry Vyukov, Andrey Ryabinin, kasa...@googlegroups.com, Catalin Marinas, Vincenzo Frascino, Will Deacon, linux-ar...@lists.infradead.org, linux-...@vger.kernel.org, Andrey Konovalov
From: Andrey Konovalov <andre...@google.com>

Use the non-atomic version of set_bit() in arch/arm64/kernel/stacktrace.c,
as there is no concurrent accesses to frame->prev_type.

This speeds up stack trace collection and improves the boot time of
Generic KASAN by 2-5%.

Suggested-by: Mark Rutland <mark.r...@arm.com>
Signed-off-by: Andrey Konovalov <andre...@google.com>
---
arch/arm64/kernel/stacktrace.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/arm64/kernel/stacktrace.c b/arch/arm64/kernel/stacktrace.c
index 33e96ae4b15f..03593d451b0a 100644
--- a/arch/arm64/kernel/stacktrace.c
+++ b/arch/arm64/kernel/stacktrace.c
@@ -103,7 +103,7 @@ static int notrace unwind_frame(struct task_struct *tsk,
if (fp <= frame->prev_fp)
return -EINVAL;
} else {
- set_bit(frame->prev_type, frame->stacks_done);
+ __set_bit(frame->prev_type, frame->stacks_done);
}

/*
--
2.25.1

Mark Rutland

unread,
May 23, 2022, 7:33:57 AM5/23/22
to andrey.k...@linux.dev, Andrey Konovalov, Marco Elver, Alexander Potapenko, Dmitry Vyukov, Andrey Ryabinin, kasa...@googlegroups.com, Catalin Marinas, Vincenzo Frascino, Will Deacon, linux-ar...@lists.infradead.org, linux-...@vger.kernel.org, Andrey Konovalov
On Sun, May 22, 2022 at 01:50:58AM +0200, andrey.k...@linux.dev wrote:
> From: Andrey Konovalov <andre...@google.com>
>
> Disable KASAN instrumentation of arch/arm64/kernel/stacktrace.c.
>
> This speeds up Generic KASAN by 5-20%.
>
> As a side-effect, KASAN is now unable to detect bugs in the stack trace
> collection code. This is taken as an acceptable downside.
>
> Also replace READ_ONCE_NOCHECK() with READ_ONCE() in stacktrace.c.
> As the file is now not instrumented, there is no need to use the
> NOCHECK version of READ_ONCE().
>
> Suggested-by: Mark Rutland <mark.r...@arm.com>
> Signed-off-by: Andrey Konovalov <andre...@google.com>
> ---
> arch/arm64/kernel/Makefile | 3 +++
> arch/arm64/kernel/stacktrace.c | 4 ++--
> 2 files changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile
> index fa7981d0d917..da8cf6905c76 100644
> --- a/arch/arm64/kernel/Makefile
> +++ b/arch/arm64/kernel/Makefile
> @@ -14,6 +14,9 @@ CFLAGS_REMOVE_return_address.o = $(CC_FLAGS_FTRACE)
> CFLAGS_REMOVE_syscall.o = -fstack-protector -fstack-protector-strong
> CFLAGS_syscall.o += -fno-stack-protector
>
> +# Do not instrument to improve performance.
> +KASAN_SANITIZE_stacktrace.o := n

Can we make that a little more descriptive? e.g.

# When KASAN is enabled, a stacktrace is recorded for every alloc/free, which
# can significantly impact performance. Avoid instrumenting the stacktrace code
# to minimize this impact.
KASAN_SANITIZE_stacktrace.o := n

With that:

Acked-by: Mark Rutland <mark.r...@arm.com>

Mark.

Mark Rutland

unread,
May 23, 2022, 7:34:22 AM5/23/22
to andrey.k...@linux.dev, Andrey Konovalov, Marco Elver, Alexander Potapenko, Dmitry Vyukov, Andrey Ryabinin, kasa...@googlegroups.com, Catalin Marinas, Vincenzo Frascino, Will Deacon, linux-ar...@lists.infradead.org, linux-...@vger.kernel.org, Andrey Konovalov
On Sun, May 22, 2022 at 01:50:59AM +0200, andrey.k...@linux.dev wrote:
> From: Andrey Konovalov <andre...@google.com>
>
> Use the non-atomic version of set_bit() in arch/arm64/kernel/stacktrace.c,
> as there is no concurrent accesses to frame->prev_type.
>
> This speeds up stack trace collection and improves the boot time of
> Generic KASAN by 2-5%.
>
> Suggested-by: Mark Rutland <mark.r...@arm.com>
> Signed-off-by: Andrey Konovalov <andre...@google.com>

Acked-by: Mark Rutland <mark.r...@arm.com>

Mark.

andrey.k...@linux.dev

unread,
May 23, 2022, 10:51:56 AM5/23/22
to Will Deacon, Catalin Marinas, Andrey Konovalov, Marco Elver, Alexander Potapenko, Dmitry Vyukov, Andrey Ryabinin, kasa...@googlegroups.com, Vincenzo Frascino, Mark Rutland, linux-ar...@lists.infradead.org, linux-...@vger.kernel.org, Andrey Konovalov
From: Andrey Konovalov <andre...@google.com>

Disable KASAN instrumentation of arch/arm64/kernel/stacktrace.c.

This speeds up Generic KASAN by 5-20%.

As a side-effect, KASAN is now unable to detect bugs in the stack trace
collection code. This is taken as an acceptable downside.

Also replace READ_ONCE_NOCHECK() with READ_ONCE() in stacktrace.c.
As the file is now not instrumented, there is no need to use the
NOCHECK version of READ_ONCE().

Suggested-by: Mark Rutland <mark.r...@arm.com>
Acked-by: Mark Rutland <mark.r...@arm.com>
Signed-off-by: Andrey Konovalov <andre...@google.com>

---

Changes v1->v2:
- Updated the comment in Makefile as suggested by Mark.

---
arch/arm64/kernel/Makefile | 5 +++++
arch/arm64/kernel/stacktrace.c | 4 ++--
2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile
index fa7981d0d917..7075a9c6a4a6 100644
--- a/arch/arm64/kernel/Makefile
+++ b/arch/arm64/kernel/Makefile
@@ -14,6 +14,11 @@ CFLAGS_REMOVE_return_address.o = $(CC_FLAGS_FTRACE)
CFLAGS_REMOVE_syscall.o = -fstack-protector -fstack-protector-strong
CFLAGS_syscall.o += -fno-stack-protector

+# When KASAN is enabled, a stack trace is recorded for every alloc/free, which
+# can significantly impact performance. Avoid instrumenting the stack trace
+# collection code to minimize this impact.
+KASAN_SANITIZE_stacktrace.o := n
+
# It's not safe to invoke KCOV when portions of the kernel environment aren't
# available or are out-of-sync with HW state. Since `noinstr` doesn't always
# inhibit KCOV instrumentation, disable it for the entire compilation unit.
diff --git a/arch/arm64/kernel/stacktrace.c b/arch/arm64/kernel/stacktrace.c
index e4103e085681..33e96ae4b15f 100644
--- a/arch/arm64/kernel/stacktrace.c
+++ b/arch/arm64/kernel/stacktrace.c

andrey.k...@linux.dev

unread,
May 23, 2022, 10:51:57 AM5/23/22
to Will Deacon, Catalin Marinas, Andrey Konovalov, Marco Elver, Alexander Potapenko, Dmitry Vyukov, Andrey Ryabinin, kasa...@googlegroups.com, Vincenzo Frascino, Mark Rutland, linux-ar...@lists.infradead.org, linux-...@vger.kernel.org, Andrey Konovalov
From: Andrey Konovalov <andre...@google.com>

Use the non-atomic version of set_bit() in arch/arm64/kernel/stacktrace.c,
as there is no concurrent accesses to frame->prev_type.

This speeds up stack trace collection and improves the boot time of
Generic KASAN by 2-5%.

Suggested-by: Mark Rutland <mark.r...@arm.com>
Acked-by: Mark Rutland <mark.r...@arm.com>
Signed-off-by: Andrey Konovalov <andre...@google.com>
---
arch/arm64/kernel/stacktrace.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/arm64/kernel/stacktrace.c b/arch/arm64/kernel/stacktrace.c
index 33e96ae4b15f..03593d451b0a 100644
--- a/arch/arm64/kernel/stacktrace.c
+++ b/arch/arm64/kernel/stacktrace.c

Will Deacon

unread,
Jun 23, 2022, 3:31:56 PM6/23/22
to andrey.k...@linux.dev, Catalin Marinas, kerne...@android.com, Will Deacon, Alexander Potapenko, Mark Rutland, Dmitry Vyukov, linux-ar...@lists.infradead.org, Vincenzo Frascino, Andrey Konovalov, kasa...@googlegroups.com, Andrey Konovalov, Marco Elver, Andrey Ryabinin, linux-...@vger.kernel.org
On Mon, 23 May 2022 16:51:51 +0200, andrey.k...@linux.dev wrote:
> From: Andrey Konovalov <andre...@google.com>
>
> Disable KASAN instrumentation of arch/arm64/kernel/stacktrace.c.
>
> This speeds up Generic KASAN by 5-20%.
>
> As a side-effect, KASAN is now unable to detect bugs in the stack trace
> collection code. This is taken as an acceptable downside.
>
> [...]

Applied to arm64 (for-next/stacktrace), thanks! I had to fix conflicts
in both of the patches, so please can you take a quick look at the result?

[1/2] arm64: kasan: do not instrument stacktrace.c
https://git.kernel.org/arm64/c/802b91118d11
[2/2] arm64: stacktrace: use non-atomic __set_bit
https://git.kernel.org/arm64/c/446297b28a21

Cheers,
--
Will

https://fixes.arm64.dev
https://next.arm64.dev
https://will.arm64.dev

Mark Rutland

unread,
Jun 26, 2022, 5:21:42 AM6/26/22
to Will Deacon, andrey.k...@linux.dev, Catalin Marinas, kerne...@android.com, Alexander Potapenko, Dmitry Vyukov, linux-ar...@lists.infradead.org, Vincenzo Frascino, Andrey Konovalov, kasa...@googlegroups.com, Andrey Konovalov, Marco Elver, Andrey Ryabinin, linux-...@vger.kernel.org
On Thu, Jun 23, 2022 at 08:31:32PM +0100, Will Deacon wrote:
> On Mon, 23 May 2022 16:51:51 +0200, andrey.k...@linux.dev wrote:
> > From: Andrey Konovalov <andre...@google.com>
> >
> > Disable KASAN instrumentation of arch/arm64/kernel/stacktrace.c.
> >
> > This speeds up Generic KASAN by 5-20%.
> >
> > As a side-effect, KASAN is now unable to detect bugs in the stack trace
> > collection code. This is taken as an acceptable downside.
> >
> > [...]
>
> Applied to arm64 (for-next/stacktrace), thanks! I had to fix conflicts
> in both of the patches, so please can you take a quick look at the result?
>
> [1/2] arm64: kasan: do not instrument stacktrace.c
> https://git.kernel.org/arm64/c/802b91118d11
> [2/2] arm64: stacktrace: use non-atomic __set_bit
> https://git.kernel.org/arm64/c/446297b28a21

I take it that was just the s/frame/state/ conflict?

FWIW, that looks good to me; thanks for sorting that out!

Mark.

Andrey Konovalov

unread,
Jun 28, 2022, 9:14:36 AM6/28/22
to Will Deacon, andrey.k...@linux.dev, Catalin Marinas, kerne...@android.com, Alexander Potapenko, Mark Rutland, Dmitry Vyukov, Linux ARM, Vincenzo Frascino, kasan-dev, Andrey Konovalov, Marco Elver, Andrey Ryabinin, LKML
On Thu, Jun 23, 2022 at 9:31 PM Will Deacon <wi...@kernel.org> wrote:
>
> On Mon, 23 May 2022 16:51:51 +0200, andrey.k...@linux.dev wrote:
> > From: Andrey Konovalov <andre...@google.com>
> >
> > Disable KASAN instrumentation of arch/arm64/kernel/stacktrace.c.
> >
> > This speeds up Generic KASAN by 5-20%.
> >
> > As a side-effect, KASAN is now unable to detect bugs in the stack trace
> > collection code. This is taken as an acceptable downside.
> >
> > [...]
>
> Applied to arm64 (for-next/stacktrace), thanks! I had to fix conflicts
> in both of the patches, so please can you take a quick look at the result?
>
> [1/2] arm64: kasan: do not instrument stacktrace.c
> https://git.kernel.org/arm64/c/802b91118d11
> [2/2] arm64: stacktrace: use non-atomic __set_bit
> https://git.kernel.org/arm64/c/446297b28a21

Hi Will,

The updated patches look good.

Thanks!
Reply all
Reply to author
Forward
0 new messages