From: Catalin Marinas <catalin.marinas@arm.com>
To: Mark Rutland <mark.rutland@arm.com>
Cc: linux-arm-kernel@lists.infradead.org, ardb@kernel.org,
bp@alien8.de, dave.hansen@linux.intel.com, frederic@kernel.org,
james.morse@arm.com, joey.gouly@arm.com, juri.lelli@redhat.com,
linux-kernel@vger.kernel.org, luto@kernel.org, mingo@redhat.com,
peterz@infradead.org, tglx@linutronix.de,
valentin.schneider@arm.com, will@kernel.org
Subject: Re: [PATCH v3 7/7] arm64: support PREEMPT_DYNAMIC
Date: Wed, 9 Feb 2022 18:13:39 +0000 [thread overview]
Message-ID: <YgQEUzA+RkKuDus/@arm.com> (raw)
In-Reply-To: <20220209153535.818830-8-mark.rutland@arm.com>
On Wed, Feb 09, 2022 at 03:35:35PM +0000, Mark Rutland wrote:
> This patch enables support for PREEMPT_DYNAMIC on arm64, allowing the
> preemption model to be chosen at boot time.
>
> Specifically, this patch selects HAVE_PREEMPT_DYNAMIC_KEY, so that each
> preemption function is an out-of-line call with an early return
> depending upon a static key. This leaves almost all the codegen up to
> the compiler, and side-steps a number of pain points with static calls
> (e.g. interaction with CFI schemes). This should have no worse overhead
> than using non-inline static calls, as those use out-of-line trampolines
> with early returns.
>
> For example, the dynamic_cond_resched() wrapper looks as follows when
> enabled. When disabled, the first `B` is replaced with a `NOP`,
> resulting in an early return.
>
> | <dynamic_cond_resched>:
> | bti c
> | b <dynamic_cond_resched+0x10> // or `nop`
> | mov w0, #0x0
> | ret
> | mrs x0, sp_el0
> | ldr x0, [x0, #8]
> | cbnz x0, <dynamic_cond_resched+0x8>
> | paciasp
> | stp x29, x30, [sp, #-16]!
> | mov x29, sp
> | bl <preempt_schedule_common>
> | mov w0, #0x1
> | ldp x29, x30, [sp], #16
> | autiasp
> | ret
>
> ... compared to the regular form of the function:
>
> | <__cond_resched>:
> | bti c
> | mrs x0, sp_el0
> | ldr x1, [x0, #8]
> | cbz x1, <__cond_resched+0x18>
> | mov w0, #0x0
> | ret
> | paciasp
> | stp x29, x30, [sp, #-16]!
> | mov x29, sp
> | bl <preempt_schedule_common>
> | mov w0, #0x1
> | ldp x29, x30, [sp], #16
> | autiasp
> | ret
>
> Since arm64 does not yet use the generic entry code, we must define our
> own `sk_dynamic_irqentry_exit_cond_resched`, which will be
> enabled/disabled by the common code in kernel/sched/core.c. All other
> preemption functions and associated static keys are defined there.
>
> Note that PREEMPT_DYNAMIC is `def bool y`, so this will default to
> enabled.
>
> Signed-off-by: Mark Rutland <mark.rutland@arm.com>
> Cc: Ard Biesheuvel <ardb@kernel.org>
> Cc: Catalin Marinas <catalin.marinas@arm.com>
> Cc: Frederic Weisbecker <frederic@kernel.org>
> Cc: Ingo Molnar <mingo@redhat.com>
> Cc: Joey Gouly <joey.gouly@arm.com>
> Cc: Juri Lelli <juri.lelli@redhat.com>
> Cc: Peter Zijlstra <peterz@infradead.org>
> Cc: Valentin Schneider <valentin.schneider@arm.com>
> Cc: Will Deacon <will@kernel.org>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
WARNING: multiple messages have this Message-ID (diff)
From: Catalin Marinas <catalin.marinas@arm.com>
To: Mark Rutland <mark.rutland@arm.com>
Cc: linux-arm-kernel@lists.infradead.org, ardb@kernel.org,
bp@alien8.de, dave.hansen@linux.intel.com, frederic@kernel.org,
james.morse@arm.com, joey.gouly@arm.com, juri.lelli@redhat.com,
linux-kernel@vger.kernel.org, luto@kernel.org, mingo@redhat.com,
peterz@infradead.org, tglx@linutronix.de,
valentin.schneider@arm.com, will@kernel.org
Subject: Re: [PATCH v3 7/7] arm64: support PREEMPT_DYNAMIC
Date: Wed, 9 Feb 2022 18:13:39 +0000 [thread overview]
Message-ID: <YgQEUzA+RkKuDus/@arm.com> (raw)
In-Reply-To: <20220209153535.818830-8-mark.rutland@arm.com>
On Wed, Feb 09, 2022 at 03:35:35PM +0000, Mark Rutland wrote:
> This patch enables support for PREEMPT_DYNAMIC on arm64, allowing the
> preemption model to be chosen at boot time.
>
> Specifically, this patch selects HAVE_PREEMPT_DYNAMIC_KEY, so that each
> preemption function is an out-of-line call with an early return
> depending upon a static key. This leaves almost all the codegen up to
> the compiler, and side-steps a number of pain points with static calls
> (e.g. interaction with CFI schemes). This should have no worse overhead
> than using non-inline static calls, as those use out-of-line trampolines
> with early returns.
>
> For example, the dynamic_cond_resched() wrapper looks as follows when
> enabled. When disabled, the first `B` is replaced with a `NOP`,
> resulting in an early return.
>
> | <dynamic_cond_resched>:
> | bti c
> | b <dynamic_cond_resched+0x10> // or `nop`
> | mov w0, #0x0
> | ret
> | mrs x0, sp_el0
> | ldr x0, [x0, #8]
> | cbnz x0, <dynamic_cond_resched+0x8>
> | paciasp
> | stp x29, x30, [sp, #-16]!
> | mov x29, sp
> | bl <preempt_schedule_common>
> | mov w0, #0x1
> | ldp x29, x30, [sp], #16
> | autiasp
> | ret
>
> ... compared to the regular form of the function:
>
> | <__cond_resched>:
> | bti c
> | mrs x0, sp_el0
> | ldr x1, [x0, #8]
> | cbz x1, <__cond_resched+0x18>
> | mov w0, #0x0
> | ret
> | paciasp
> | stp x29, x30, [sp, #-16]!
> | mov x29, sp
> | bl <preempt_schedule_common>
> | mov w0, #0x1
> | ldp x29, x30, [sp], #16
> | autiasp
> | ret
>
> Since arm64 does not yet use the generic entry code, we must define our
> own `sk_dynamic_irqentry_exit_cond_resched`, which will be
> enabled/disabled by the common code in kernel/sched/core.c. All other
> preemption functions and associated static keys are defined there.
>
> Note that PREEMPT_DYNAMIC is `def bool y`, so this will default to
> enabled.
>
> Signed-off-by: Mark Rutland <mark.rutland@arm.com>
> Cc: Ard Biesheuvel <ardb@kernel.org>
> Cc: Catalin Marinas <catalin.marinas@arm.com>
> Cc: Frederic Weisbecker <frederic@kernel.org>
> Cc: Ingo Molnar <mingo@redhat.com>
> Cc: Joey Gouly <joey.gouly@arm.com>
> Cc: Juri Lelli <juri.lelli@redhat.com>
> Cc: Peter Zijlstra <peterz@infradead.org>
> Cc: Valentin Schneider <valentin.schneider@arm.com>
> Cc: Will Deacon <will@kernel.org>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
next prev parent reply other threads:[~2022-02-09 18:14 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-02-09 15:35 [PATCH v3 0/7] arm64 / sched/preempt: support PREEMPT_DYNAMIC with static keys Mark Rutland
2022-02-09 15:35 ` Mark Rutland
2022-02-09 15:35 ` [PATCH v3 1/7] sched/preempt: move PREEMPT_DYNAMIC logic later Mark Rutland
2022-02-09 15:35 ` Mark Rutland
2022-02-09 15:35 ` [PATCH v3 2/7] sched/preempt: refactor sched_dynamic_update() Mark Rutland
2022-02-09 15:35 ` Mark Rutland
2022-02-09 15:35 ` [PATCH v3 3/7] sched/preempt: simplify irqentry_exit_cond_resched() callers Mark Rutland
2022-02-09 15:35 ` Mark Rutland
2022-02-09 15:35 ` [PATCH v3 4/7] sched/preempt: decouple HAVE_PREEMPT_DYNAMIC from GENERIC_ENTRY Mark Rutland
2022-02-09 15:35 ` Mark Rutland
2022-02-09 15:35 ` [PATCH v3 5/7] sched/preempt: add PREEMPT_DYNAMIC using static keys Mark Rutland
2022-02-09 15:35 ` Mark Rutland
2022-02-09 17:48 ` Frederic Weisbecker
2022-02-09 17:48 ` Frederic Weisbecker
2022-02-10 10:27 ` Mark Rutland
2022-02-10 10:27 ` Mark Rutland
2022-02-10 15:59 ` Frederic Weisbecker
2022-02-10 15:59 ` Frederic Weisbecker
2022-02-09 15:35 ` [PATCH v3 6/7] arm64: entry: centralize premeption decision Mark Rutland
2022-02-09 15:35 ` Mark Rutland
2022-02-09 18:10 ` Catalin Marinas
2022-02-09 18:10 ` Catalin Marinas
2022-02-10 9:19 ` Mark Rutland
2022-02-10 9:19 ` Mark Rutland
2022-02-09 15:35 ` [PATCH v3 7/7] arm64: support PREEMPT_DYNAMIC Mark Rutland
2022-02-09 15:35 ` Mark Rutland
2022-02-09 18:13 ` Catalin Marinas [this message]
2022-02-09 18:13 ` Catalin Marinas
2022-02-09 19:57 ` Frederic Weisbecker
2022-02-09 19:57 ` Frederic Weisbecker
2022-02-10 9:38 ` Mark Rutland
2022-02-10 9:38 ` Mark Rutland
2022-02-10 12:00 ` Mark Rutland
2022-02-10 12:00 ` Mark Rutland
2022-02-10 15:58 ` Frederic Weisbecker
2022-02-10 15:58 ` Frederic Weisbecker
2022-02-09 19:58 ` [PATCH v3 0/7] arm64 / sched/preempt: support PREEMPT_DYNAMIC with static keys Frederic Weisbecker
2022-02-09 19:58 ` Frederic Weisbecker
2022-02-10 9:29 ` Ard Biesheuvel
2022-02-10 9:29 ` Ard Biesheuvel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YgQEUzA+RkKuDus/@arm.com \
--to=catalin.marinas@arm.com \
--cc=ardb@kernel.org \
--cc=bp@alien8.de \
--cc=dave.hansen@linux.intel.com \
--cc=frederic@kernel.org \
--cc=james.morse@arm.com \
--cc=joey.gouly@arm.com \
--cc=juri.lelli@redhat.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@kernel.org \
--cc=mark.rutland@arm.com \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
--cc=valentin.schneider@arm.com \
--cc=will@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.