From: "Alex Bennée" <alex.bennee@linaro.org>
To: Dave Martin <Dave.Martin@arm.com>
Cc: Christoffer Dall <cdall@kernel.org>,
Ard Biesheuvel <ard.biesheuvel@linaro.org>,
Marc Zyngier <marc.zyngier@arm.com>,
Catalin Marinas <catalin.marinas@arm.com>,
Will Deacon <will.deacon@arm.com>,
kvmarm@lists.cs.columbia.edu,
linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH v10 08/18] arm64/sve: Refactor user SVE trap maintenance for external use
Date: Wed, 23 May 2018 21:16:52 +0100 [thread overview]
Message-ID: <87h8myt9e3.fsf@linaro.org> (raw)
In-Reply-To: <1527005119-6842-9-git-send-email-Dave.Martin@arm.com>
Dave Martin <Dave.Martin@arm.com> writes:
> In preparation for optimising the way KVM manages switching the
> guest and host FPSIMD state, it is necessary to provide a means for
> code outside arch/arm64/kernel/fpsimd.c to restore the user trap
> configuration for SVE correctly for the current task.
>
> Rather than requiring external code to duplicate the maintenance
> explicitly, this patch wraps moves the trap maintenenace to
> fpsimd_bind_to_cpu(), since it is logically part of the work of
> associating the current task with the cpu.
>
> Because fpsimd_bind_to_cpu() is rather a cryptic name to publish
> alongside fpsimd_bind_state_to_cpu(), the former function is
> renamed to fpsimd_bind_task_to_cpu() to make its purpose more
> explicit.
>
> This patch makes appropriate changes to ensure that
> fpsimd_bind_task_to_cpu() is always called alongside
> task_fpsimd_load(), so that the trap maintenance continues to be
> done in every situation where it was done prior to this patch.
>
> As a side-effect, the metadata updates done by
> fpsimd_bind_task_to_cpu() now change from conditional to
> unconditional in the "already bound" case of sigreturn. This is
> harmless, and a couple of extra stores on this slow path will not
> impact performance. I consider this a reasonable price to pay for
> a slightly cleaner interface.
>
> Signed-off-by: Dave Martin <Dave.Martin@arm.com>
> Acked-by: Marc Zyngier <marc.zyngier@arm.com>
> Acked-by: Catalin Marinas <catalin.marinas@arm.com>
In fact the comment I alluded to in 6/18 could be applied in this.
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
> ---
> arch/arm64/kernel/fpsimd.c | 28 ++++++++++++++--------------
> 1 file changed, 14 insertions(+), 14 deletions(-)
>
> diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c
> index 1222491..ba9e7df 100644
> --- a/arch/arm64/kernel/fpsimd.c
> +++ b/arch/arm64/kernel/fpsimd.c
> @@ -257,16 +257,6 @@ static void task_fpsimd_load(void)
> sve_vq_from_vl(current->thread.sve_vl) - 1);
> else
> fpsimd_load_state(¤t->thread.uw.fpsimd_state);
> -
> - if (system_supports_sve()) {
> - /* Toggle SVE trapping for userspace if needed */
> - if (test_thread_flag(TIF_SVE))
> - sve_user_enable();
> - else
> - sve_user_disable();
> -
> - /* Serialised by exception return to user */
> - }
> }
>
> /*
> @@ -991,7 +981,7 @@ void fpsimd_signal_preserve_current_state(void)
> * Associate current's FPSIMD context with this cpu
> * Preemption must be disabled when calling this function.
> */
> -static void fpsimd_bind_to_cpu(void)
> +static void fpsimd_bind_task_to_cpu(void)
> {
> struct fpsimd_last_state_struct *last =
> this_cpu_ptr(&fpsimd_last_state);
> @@ -999,6 +989,16 @@ static void fpsimd_bind_to_cpu(void)
> last->st = ¤t->thread.uw.fpsimd_state;
> last->sve_in_use = test_thread_flag(TIF_SVE);
> current->thread.fpsimd_cpu = smp_processor_id();
> +
> + if (system_supports_sve()) {
> + /* Toggle SVE trapping for userspace if needed */
> + if (test_thread_flag(TIF_SVE))
> + sve_user_enable();
> + else
> + sve_user_disable();
> +
> + /* Serialised by exception return to user */
> + }
> }
>
> /*
> @@ -1015,7 +1015,7 @@ void fpsimd_restore_current_state(void)
>
> if (test_and_clear_thread_flag(TIF_FOREIGN_FPSTATE)) {
> task_fpsimd_load();
> - fpsimd_bind_to_cpu();
> + fpsimd_bind_task_to_cpu();
> }
>
> local_bh_enable();
> @@ -1038,9 +1038,9 @@ void fpsimd_update_current_state(struct user_fpsimd_state const *state)
> fpsimd_to_sve(current);
>
> task_fpsimd_load();
> + fpsimd_bind_task_to_cpu();
>
> - if (test_and_clear_thread_flag(TIF_FOREIGN_FPSTATE))
> - fpsimd_bind_to_cpu();
> + clear_thread_flag(TIF_FOREIGN_FPSTATE);
>
> local_bh_enable();
> }
--
Alex Bennée
_______________________________________________
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: alex.bennee@linaro.org (Alex Bennée)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v10 08/18] arm64/sve: Refactor user SVE trap maintenance for external use
Date: Wed, 23 May 2018 21:16:52 +0100 [thread overview]
Message-ID: <87h8myt9e3.fsf@linaro.org> (raw)
In-Reply-To: <1527005119-6842-9-git-send-email-Dave.Martin@arm.com>
Dave Martin <Dave.Martin@arm.com> writes:
> In preparation for optimising the way KVM manages switching the
> guest and host FPSIMD state, it is necessary to provide a means for
> code outside arch/arm64/kernel/fpsimd.c to restore the user trap
> configuration for SVE correctly for the current task.
>
> Rather than requiring external code to duplicate the maintenance
> explicitly, this patch wraps moves the trap maintenenace to
> fpsimd_bind_to_cpu(), since it is logically part of the work of
> associating the current task with the cpu.
>
> Because fpsimd_bind_to_cpu() is rather a cryptic name to publish
> alongside fpsimd_bind_state_to_cpu(), the former function is
> renamed to fpsimd_bind_task_to_cpu() to make its purpose more
> explicit.
>
> This patch makes appropriate changes to ensure that
> fpsimd_bind_task_to_cpu() is always called alongside
> task_fpsimd_load(), so that the trap maintenance continues to be
> done in every situation where it was done prior to this patch.
>
> As a side-effect, the metadata updates done by
> fpsimd_bind_task_to_cpu() now change from conditional to
> unconditional in the "already bound" case of sigreturn. This is
> harmless, and a couple of extra stores on this slow path will not
> impact performance. I consider this a reasonable price to pay for
> a slightly cleaner interface.
>
> Signed-off-by: Dave Martin <Dave.Martin@arm.com>
> Acked-by: Marc Zyngier <marc.zyngier@arm.com>
> Acked-by: Catalin Marinas <catalin.marinas@arm.com>
In fact the comment I alluded to in 6/18 could be applied in this.
Reviewed-by: Alex Benn?e <alex.bennee@linaro.org>
> ---
> arch/arm64/kernel/fpsimd.c | 28 ++++++++++++++--------------
> 1 file changed, 14 insertions(+), 14 deletions(-)
>
> diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c
> index 1222491..ba9e7df 100644
> --- a/arch/arm64/kernel/fpsimd.c
> +++ b/arch/arm64/kernel/fpsimd.c
> @@ -257,16 +257,6 @@ static void task_fpsimd_load(void)
> sve_vq_from_vl(current->thread.sve_vl) - 1);
> else
> fpsimd_load_state(¤t->thread.uw.fpsimd_state);
> -
> - if (system_supports_sve()) {
> - /* Toggle SVE trapping for userspace if needed */
> - if (test_thread_flag(TIF_SVE))
> - sve_user_enable();
> - else
> - sve_user_disable();
> -
> - /* Serialised by exception return to user */
> - }
> }
>
> /*
> @@ -991,7 +981,7 @@ void fpsimd_signal_preserve_current_state(void)
> * Associate current's FPSIMD context with this cpu
> * Preemption must be disabled when calling this function.
> */
> -static void fpsimd_bind_to_cpu(void)
> +static void fpsimd_bind_task_to_cpu(void)
> {
> struct fpsimd_last_state_struct *last =
> this_cpu_ptr(&fpsimd_last_state);
> @@ -999,6 +989,16 @@ static void fpsimd_bind_to_cpu(void)
> last->st = ¤t->thread.uw.fpsimd_state;
> last->sve_in_use = test_thread_flag(TIF_SVE);
> current->thread.fpsimd_cpu = smp_processor_id();
> +
> + if (system_supports_sve()) {
> + /* Toggle SVE trapping for userspace if needed */
> + if (test_thread_flag(TIF_SVE))
> + sve_user_enable();
> + else
> + sve_user_disable();
> +
> + /* Serialised by exception return to user */
> + }
> }
>
> /*
> @@ -1015,7 +1015,7 @@ void fpsimd_restore_current_state(void)
>
> if (test_and_clear_thread_flag(TIF_FOREIGN_FPSTATE)) {
> task_fpsimd_load();
> - fpsimd_bind_to_cpu();
> + fpsimd_bind_task_to_cpu();
> }
>
> local_bh_enable();
> @@ -1038,9 +1038,9 @@ void fpsimd_update_current_state(struct user_fpsimd_state const *state)
> fpsimd_to_sve(current);
>
> task_fpsimd_load();
> + fpsimd_bind_task_to_cpu();
>
> - if (test_and_clear_thread_flag(TIF_FOREIGN_FPSTATE))
> - fpsimd_bind_to_cpu();
> + clear_thread_flag(TIF_FOREIGN_FPSTATE);
>
> local_bh_enable();
> }
--
Alex Benn?e
next prev parent reply other threads:[~2018-05-23 20:16 UTC|newest]
Thread overview: 138+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-05-22 16:05 [PATCH v10 00/18] KVM: arm64: Optimise FPSIMD context switching Dave Martin
2018-05-22 16:05 ` Dave Martin
2018-05-22 16:05 ` [PATCH v10 01/18] arm64: fpsimd: Fix TIF_FOREIGN_FPSTATE after invalidating cpu regs Dave Martin
2018-05-22 16:05 ` Dave Martin
2018-05-23 11:33 ` Christoffer Dall
2018-05-23 11:33 ` Christoffer Dall
2018-05-23 13:44 ` Alex Bennée
2018-05-23 13:44 ` Alex Bennée
2018-05-23 13:46 ` Catalin Marinas
2018-05-23 13:46 ` Catalin Marinas
2018-05-22 16:05 ` [PATCH v10 02/18] thread_info: Add update_thread_flag() helpers Dave Martin
2018-05-22 16:05 ` Dave Martin
2018-05-23 13:46 ` Alex Bennée
2018-05-23 13:46 ` Alex Bennée
2018-05-23 13:57 ` Dave Martin
2018-05-23 13:57 ` Dave Martin
2018-05-23 14:35 ` Alex Bennée
2018-05-23 14:35 ` Alex Bennée
2018-05-22 16:05 ` [PATCH v10 03/18] arm64: Use update{,_tsk}_thread_flag() Dave Martin
2018-05-22 16:05 ` Dave Martin
2018-05-23 13:48 ` Alex Bennée
2018-05-23 13:48 ` Alex Bennée
2018-05-22 16:05 ` [PATCH v10 04/18] KVM: arm/arm64: Introduce kvm_arch_vcpu_run_pid_change Dave Martin
2018-05-22 16:05 ` Dave Martin
2018-05-23 14:34 ` Alex Bennée
2018-05-23 14:34 ` Alex Bennée
2018-05-23 14:40 ` Dave Martin
2018-05-23 14:40 ` Dave Martin
2018-05-24 8:11 ` Christoffer Dall
2018-05-24 8:11 ` Christoffer Dall
2018-05-24 9:18 ` Alex Bennée
2018-05-24 9:18 ` Alex Bennée
2018-05-24 10:04 ` Dave Martin
2018-05-24 10:04 ` Dave Martin
2018-05-22 16:05 ` [PATCH v10 05/18] KVM: arm64: Convert lazy FPSIMD context switch trap to C Dave Martin
2018-05-22 16:05 ` Dave Martin
2018-05-23 19:35 ` Alex Bennée
2018-05-23 19:35 ` Alex Bennée
2018-05-24 8:12 ` Christoffer Dall
2018-05-24 8:12 ` Christoffer Dall
2018-05-24 8:54 ` Dave Martin
2018-05-24 8:54 ` Dave Martin
2018-05-24 9:14 ` Alex Bennée
2018-05-24 9:14 ` Alex Bennée
2018-05-22 16:05 ` [PATCH v10 06/18] arm64: fpsimd: Generalise context saving for non-task contexts Dave Martin
2018-05-22 16:05 ` Dave Martin
2018-05-23 20:15 ` Alex Bennée
2018-05-23 20:15 ` Alex Bennée
2018-05-24 9:03 ` Dave Martin
2018-05-24 9:03 ` Dave Martin
2018-05-24 9:41 ` Alex Bennée
2018-05-24 9:41 ` Alex Bennée
2018-05-22 16:05 ` [PATCH v10 07/18] arm64: fpsimd: Eliminate task->mm checks Dave Martin
2018-05-22 16:05 ` Dave Martin
2018-05-23 11:48 ` Christoffer Dall
2018-05-23 11:48 ` Christoffer Dall
2018-05-23 13:31 ` Dave Martin
2018-05-23 13:31 ` Dave Martin
2018-05-23 14:56 ` Catalin Marinas
2018-05-23 14:56 ` Catalin Marinas
2018-05-23 15:03 ` Dave Martin
2018-05-23 15:03 ` Dave Martin
2018-05-23 16:42 ` Catalin Marinas
2018-05-23 16:42 ` Catalin Marinas
2018-05-24 8:33 ` Christoffer Dall
2018-05-24 8:33 ` Christoffer Dall
2018-05-24 9:16 ` Alex Bennée
2018-05-24 9:16 ` Alex Bennée
2018-05-24 9:50 ` Dave Martin
2018-05-24 9:50 ` Dave Martin
2018-05-24 10:06 ` Christoffer Dall
2018-05-24 10:06 ` Christoffer Dall
2018-05-24 14:37 ` Dave Martin
2018-05-24 14:37 ` Dave Martin
2018-05-25 9:00 ` Christoffer Dall
2018-05-25 9:00 ` Christoffer Dall
2018-05-25 9:45 ` Dave Martin
2018-05-25 9:45 ` Dave Martin
2018-05-25 11:28 ` Christoffer Dall
2018-05-25 11:28 ` Christoffer Dall
2018-05-24 9:19 ` Alex Bennée
2018-05-24 9:19 ` Alex Bennée
2018-05-22 16:05 ` [PATCH v10 08/18] arm64/sve: Refactor user SVE trap maintenance for external use Dave Martin
2018-05-22 16:05 ` Dave Martin
2018-05-23 20:16 ` Alex Bennée [this message]
2018-05-23 20:16 ` Alex Bennée
2018-05-22 16:05 ` [PATCH v10 09/18] KVM: arm64: Repurpose vcpu_arch.debug_flags for general-purpose flags Dave Martin
2018-05-22 16:05 ` Dave Martin
2018-05-24 9:21 ` Alex Bennée
2018-05-24 9:21 ` Alex Bennée
2018-05-22 16:05 ` [PATCH v10 10/18] KVM: arm64: Optimise FPSIMD handling to reduce guest/host thrashing Dave Martin
2018-05-22 16:05 ` Dave Martin
2018-05-24 10:09 ` Alex Bennée
2018-05-24 10:09 ` Alex Bennée
2018-05-24 10:18 ` Dave Martin
2018-05-24 10:18 ` Dave Martin
2018-05-22 16:05 ` [PATCH v10 11/18] arm64/sve: Move read_zcr_features() out of cpufeature.h Dave Martin
2018-05-22 16:05 ` Dave Martin
2018-05-24 10:12 ` Alex Bennée
2018-05-24 10:12 ` Alex Bennée
2018-05-22 16:05 ` [PATCH v10 12/18] arm64/sve: Switch sve_pffr() argument from task to thread Dave Martin
2018-05-22 16:05 ` Dave Martin
2018-05-24 10:12 ` Alex Bennée
2018-05-24 10:12 ` Alex Bennée
2018-05-22 16:05 ` [PATCH v10 13/18] arm64/sve: Move sve_pffr() to fpsimd.h and make inline Dave Martin
2018-05-22 16:05 ` Dave Martin
2018-05-24 10:20 ` Alex Bennée
2018-05-24 10:20 ` Alex Bennée
2018-05-24 11:22 ` Dave Martin
2018-05-24 11:22 ` Dave Martin
2018-05-22 16:05 ` [PATCH v10 14/18] KVM: arm64: Save host SVE context as appropriate Dave Martin
2018-05-22 16:05 ` Dave Martin
2018-05-23 14:59 ` Catalin Marinas
2018-05-23 14:59 ` Catalin Marinas
2018-05-24 9:11 ` Christoffer Dall
2018-05-24 9:11 ` Christoffer Dall
2018-05-24 14:49 ` Alex Bennée
2018-05-24 14:49 ` Alex Bennée
2018-05-22 16:05 ` [PATCH v10 15/18] KVM: arm64: Remove eager host SVE state saving Dave Martin
2018-05-22 16:05 ` Dave Martin
2018-05-24 14:54 ` Alex Bennée
2018-05-24 14:54 ` Alex Bennée
2018-05-22 16:05 ` [PATCH v10 16/18] KVM: arm64: Remove redundant *exit_code changes in fpsimd_guest_exit() Dave Martin
2018-05-22 16:05 ` Dave Martin
2018-05-24 9:11 ` Christoffer Dall
2018-05-24 9:11 ` Christoffer Dall
2018-05-24 15:02 ` Alex Bennée
2018-05-24 15:02 ` Alex Bennée
2018-05-22 16:05 ` [PATCH v10 17/18] KVM: arm64: Fold redundant exit code checks out of fixup_guest_exit() Dave Martin
2018-05-22 16:05 ` Dave Martin
2018-05-24 9:12 ` Christoffer Dall
2018-05-24 9:12 ` Christoffer Dall
2018-05-24 15:06 ` Alex Bennée
2018-05-24 15:06 ` Alex Bennée
2018-05-22 16:05 ` [PATCH v10 18/18] KVM: arm64: Invoke FPSIMD context switch trap from C Dave Martin
2018-05-22 16:05 ` Dave Martin
2018-05-24 15:09 ` Alex Bennée
2018-05-24 15:09 ` Alex Bennée
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=87h8myt9e3.fsf@linaro.org \
--to=alex.bennee@linaro.org \
--cc=Dave.Martin@arm.com \
--cc=ard.biesheuvel@linaro.org \
--cc=catalin.marinas@arm.com \
--cc=cdall@kernel.org \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=marc.zyngier@arm.com \
--cc=will.deacon@arm.com \
/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.