From: Greg KH <gregkh@linuxfoundation.org>
To: speck@linutronix.de
Subject: [MODERATED] Re: [PATCH v6 9/9] TAAv6 9
Date: Thu, 10 Oct 2019 08:54:12 +0200 [thread overview]
Message-ID: <20191010065412.GD256999@kroah.com> (raw)
In-Reply-To: <5d9e6f13.1c69fb81.d7036.be99SMTPIN_ADDED_BROKEN@mx.google.com>
On Wed, Oct 09, 2019 at 04:30:57PM -0700, speck for Pawan Gupta wrote:
> Transactional Synchronization Extensions (TSX) is an extension to the
> x86 instruction set architecture (ISA) that adds Hardware Transactional
> Memory (HTM) support. Changing TSX state currently requires a reboot.
> This may not be desirable when rebooting imposes a huge penalty. Add
> support to control TSX feature via a new sysfs file:
> /sys/devices/system/cpu/hw_tx_mem
>
> - Writing 0|off|N|n to this file disables TSX feature on all the CPUs.
> This is equivalent to boot parameter tsx=off.
> - Writing 1|on|Y|y to this file enables TSX feature on all the CPUs.
> This is equivalent to boot parameter tsx=on.
> - Reading from this returns the status of TSX feature.
> - When TSX control is not supported this interface is not visible in
> sysfs.
>
> Changing the TSX state from this interface also updates CPUID.RTM
> feature bit. From the kernel side, this feature bit doesn't result in
> any ALTERNATIVE code patching. No memory allocations are done to
> save/restore user state. No code paths in outside of the tests for
> vulnerability to TAA are dependent on the value of the feature bit. In
> general the kernel doesn't care whether RTM is present or not.
>
> Applications typically look at CPUID bits once at startup (or when first
> calling into a library that uses the feature). So we have a couple of
> cases to cover:
>
> 1) An application started and saw that RTM was enabled, so began
> to use it. Then TSX was disabled. Net result in this case is that
> the application will keep trying to use RTM, but every xbegin() will
> immediately abort the transaction. This has a performance impact to
> the application, but it doesn't affect correctness because all users
> of RTM must have a fallback path for when the transaction aborts. Note
> that even if an application is in the middle of a transaction when we
> disable RTM, we are safe. The XPI that we use to update the TSX_CTRL
> MSR will abort the transaction (just as any interrupt would abort
> a transaction).
>
> 2) An application starts and sees RTM is not available. So it will
> always use alternative paths. Even if TSX is enabled and RTM is set,
> applications in general do not re-evaluate their choice so will
> continue to run in non-TSX mode.
>
> When the TSX state is changed from the sysfs interface, TSX Async Abort
> (TAA) mitigation state also needs to be updated. Set the TAA mitigation
> state as per TSX and VERW static branch state.
>
> Signed-off-by: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
> Reviewed-by: Mark Gross <mgross@linux.intel.com>
> Reviewed-by: Tony Luck <tony.luck@intel.com>
> Tested-by: Neelima Krishnan <neelima.krishnan@intel.com>
> ---
> .../ABI/testing/sysfs-devices-system-cpu | 23 ++++
> .../admin-guide/hw-vuln/tsx_async_abort.rst | 29 +++++
> arch/x86/kernel/cpu/bugs.c | 21 +++-
> arch/x86/kernel/cpu/cpu.h | 3 +-
> arch/x86/kernel/cpu/tsx.c | 100 +++++++++++++++++-
> drivers/base/cpu.c | 32 +++++-
> include/linux/cpu.h | 6 ++
> 7 files changed, 210 insertions(+), 4 deletions(-)
>
> diff --git a/Documentation/ABI/testing/sysfs-devices-system-cpu b/Documentation/ABI/testing/sysfs-devices-system-cpu
> index 9ef9efa4e717..09a90be9f8cc 100644
> --- a/Documentation/ABI/testing/sysfs-devices-system-cpu
> +++ b/Documentation/ABI/testing/sysfs-devices-system-cpu
> @@ -563,3 +563,26 @@ Description: Umwait control
> or C0.2 state. The time is an unsigned 32-bit number.
> Note that a value of zero means there is no limit.
> Low order two bits must be zero.
> +
> +What: /sys/devices/system/cpu/hw_tx_mem
> +Date: August 2019
> +Contact: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
> + Linux kernel mailing list <linux-kernel@vger.kernel.org>
> +Description: Hardware Transactional Memory (HTM) control.
> +
> + Read/write interface to control HTM feature for all the CPUs in
> + the system. This interface is only present on platforms that
> + support HTM control. HTM is a hardware feature to speed up the
> + execution of multi-threaded software through lock elision. An
> + example of HTM implementation is Intel Transactional
> + Synchronization Extensions (TSX).
> +
> + Read returns the status of HTM feature.
> +
> + 0: HTM is disabled
> + 1: HTM is enabled
> +
> + Write sets the state of HTM feature.
> +
> + 0: Disables HTM
> + 1: Enables HTM
> diff --git a/Documentation/admin-guide/hw-vuln/tsx_async_abort.rst b/Documentation/admin-guide/hw-vuln/tsx_async_abort.rst
> index 58f24db49615..b62bc749fd8c 100644
> --- a/Documentation/admin-guide/hw-vuln/tsx_async_abort.rst
> +++ b/Documentation/admin-guide/hw-vuln/tsx_async_abort.rst
> @@ -207,6 +207,35 @@ buffers. For platforms without TSX control "tsx" command line argument has no
> effect.
>
>
> +.. _taa_mitigation_sysfs:
> +
> +Mitigation control using sysfs
> +------------------------------
> +
> +For those affected systems that can not be frequently rebooted to enable or
> +disable TSX, sysfs can be used as an alternative after installing the updates.
> +The possible values for the file /sys/devices/system/cpu/hw_tx_mem are:
> +
> + ============ =============================================================
> + 0 Disable TSX. Upon entering a TSX transactional region, the code
> + will immediately abort, before any instruction executes within
> + the transactional region even speculatively, and continue on
> + the fallback. Equivalent to boot parameter "tsx=off".
> +
> + 1 Enable TSX. Equivalent to boot parameter "tsx=on".
> +
> + ============ =============================================================
> +
> +Reading from this file returns the status of TSX feature. This file is only
> +present on systems that support TSX control.
> +
> +When disabling TSX by using the sysfs mechanism, applications that are already
> +running and use TSX will see their transactional regions aborted and execution
> +flow will be redirected to the fallback, losing the benefits of the
> +non-blocking path. TSX needs fallback code to guarantee correct execution
> +without transactional regions.
> +
> +
> Mitigation selection guide
> --------------------------
>
> diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c
> index 073687ddd06d..3bd8040ef747 100644
> --- a/arch/x86/kernel/cpu/bugs.c
> +++ b/arch/x86/kernel/cpu/bugs.c
> @@ -274,7 +274,7 @@ early_param("mds", mds_cmdline);
> #define pr_fmt(fmt) "TAA: " fmt
>
> /* Default mitigation for TAA-affected CPUs */
> -static enum taa_mitigations taa_mitigation __ro_after_init = TAA_MITIGATION_VERW;
> +static enum taa_mitigations taa_mitigation = TAA_MITIGATION_VERW;
> static bool taa_nosmt __ro_after_init;
>
> static const char * const taa_strings[] = {
> @@ -374,6 +374,25 @@ static int __init tsx_async_abort_cmdline(char *str)
> }
> early_param("tsx_async_abort", tsx_async_abort_cmdline);
>
> +void taa_update_mitigation(bool tsx_enabled)
> +{
> + /*
> + * When userspace changes the TSX state, update taa_mitigation
> + * so that the updated mitigation state is shown in:
> + * /sys/devices/system/cpu/vulnerabilities/tsx_async_abort
> + *
> + * Check if TSX is disabled.
> + * Check if CPU buffer clear is enabled.
> + * else the system is vulnerable.
> + */
> + if (!tsx_enabled)
> + taa_mitigation = TAA_MITIGATION_TSX_DISABLE;
> + else if (static_key_count(&mds_user_clear.key))
> + taa_mitigation = TAA_MITIGATION_VERW;
> + else
> + taa_mitigation = TAA_MITIGATION_OFF;
> +}
> +
> #undef pr_fmt
> #define pr_fmt(fmt) "Spectre V1 : " fmt
>
> diff --git a/arch/x86/kernel/cpu/cpu.h b/arch/x86/kernel/cpu/cpu.h
> index 38ab6e115eac..c0e2ae982692 100644
> --- a/arch/x86/kernel/cpu/cpu.h
> +++ b/arch/x86/kernel/cpu/cpu.h
> @@ -51,11 +51,12 @@ enum tsx_ctrl_states {
> TSX_CTRL_NOT_SUPPORTED,
> };
>
> -extern __ro_after_init enum tsx_ctrl_states tsx_ctrl_state;
> +extern enum tsx_ctrl_states tsx_ctrl_state;
>
> extern void __init tsx_init(void);
> extern void tsx_enable(void);
> extern void tsx_disable(void);
> +extern void taa_update_mitigation(bool tsx_enabled);
> #else
> static inline void tsx_init(void) { }
> #endif /* CONFIG_CPU_SUP_INTEL */
> diff --git a/arch/x86/kernel/cpu/tsx.c b/arch/x86/kernel/cpu/tsx.c
> index e93abe6f0bb9..96320449abb7 100644
> --- a/arch/x86/kernel/cpu/tsx.c
> +++ b/arch/x86/kernel/cpu/tsx.c
> @@ -10,12 +10,15 @@
>
> #include <linux/processor.h>
> #include <linux/cpufeature.h>
> +#include <linux/cpu.h>
>
> #include <asm/cmdline.h>
>
> #include "cpu.h"
>
> -enum tsx_ctrl_states tsx_ctrl_state __ro_after_init = TSX_CTRL_NOT_SUPPORTED;
> +static DEFINE_MUTEX(tsx_mutex);
I still don't know what this is trying to "protect". Please at least
document it so I have a chance to review it...
> +
> +enum tsx_ctrl_states tsx_ctrl_state = TSX_CTRL_NOT_SUPPORTED;
>
> void tsx_disable(void)
> {
> @@ -118,3 +121,98 @@ void __init tsx_init(void)
> setup_force_cpu_cap(X86_FEATURE_RTM);
> }
> }
> +
> +static void tsx_update_this_cpu(void *arg)
> +{
> + unsigned long enable = (unsigned long)arg;
> +
> + if (enable)
> + tsx_enable();
> + else
> + tsx_disable();
> +}
> +
> +/* Take tsx_mutex lock and update tsx_ctrl_state when calling this function */
> +static void tsx_update_on_each_cpu(bool val)
> +{
> + get_online_cpus();
> + on_each_cpu(tsx_update_this_cpu, (void *)val, 1);
> + put_online_cpus();
> +}
Why take the lock? This is only called in one place.
> +ssize_t hw_tx_mem_show(struct device *dev, struct device_attribute *attr,
> + char *buf)
> +{
> + return sprintf(buf, "%d\n", tsx_ctrl_state == TSX_CTRL_ENABLE ? 1 : 0);
> +}
> +
> +ssize_t hw_tx_mem_store(struct device *dev, struct device_attribute *attr,
> + const char *buf, size_t count)
> +{
> + enum tsx_ctrl_states requested_state;
> + ssize_t ret;
> + bool val;
> +
> + ret = kstrtobool(buf, &val);
> + if (ret)
> + return ret;
> +
> + mutex_lock(&tsx_mutex);
> +
> + if (val)
> + requested_state = TSX_CTRL_ENABLE;
> + else
> + requested_state = TSX_CTRL_DISABLE;
Why is lock grabbed above and not here?
And again, why a lock at all...
thanks,
greg k-h
next prev parent reply other threads:[~2019-10-10 6:54 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-09 23:21 [MODERATED] [PATCH v6 0/9] TAAv6 0 Pawan Gupta
2019-10-09 23:22 ` [MODERATED] [PATCH v6 1/9] TAAv6 1 Pawan Gupta
2019-10-09 23:23 ` [MODERATED] [PATCH v6 2/9] TAAv6 2 Pawan Gupta
2019-10-09 23:24 ` [MODERATED] [PATCH v6 3/9] TAAv6 3 Pawan Gupta
2019-10-09 23:25 ` [MODERATED] [PATCH v6 4/9] TAAv6 4 Pawan Gupta
2019-10-09 23:26 ` [MODERATED] [PATCH v6 5/9] TAAv6 5 Pawan Gupta
2019-10-09 23:27 ` [MODERATED] [PATCH v6 6/9] TAAv6 6 Pawan Gupta
2019-10-09 23:28 ` [MODERATED] [PATCH v6 7/9] TAAv6 7 Pawan Gupta
2019-10-09 23:29 ` [MODERATED] [PATCH v6 8/9] TAAv6 8 Pawan Gupta
2019-10-09 23:30 ` [MODERATED] [PATCH v6 9/9] TAAv6 9 Pawan Gupta
2019-10-09 23:34 ` [MODERATED] Re: [PATCH v6 1/9] TAAv6 1 Pawan Gupta
2019-10-10 1:23 ` Pawan Gupta
2019-10-15 12:54 ` Thomas Gleixner
2019-10-21 20:35 ` [MODERATED] " Pawan Gupta
2019-10-09 23:38 ` Andrew Cooper
2019-10-09 23:40 ` Andrew Cooper
2019-10-09 23:53 ` Luck, Tony
2019-10-10 0:01 ` Andrew Cooper
2019-10-10 16:51 ` Luck, Tony
[not found] ` <5d9e6daa.1c69fb81.f84ad.88ceSMTPIN_ADDED_BROKEN@mx.google.com>
2019-10-10 6:47 ` [MODERATED] Re: [PATCH v6 3/9] TAAv6 3 Greg KH
2019-10-10 23:44 ` Pawan Gupta
[not found] ` <5d9e6e22.1c69fb81.6df19.ff55SMTPIN_ADDED_BROKEN@mx.google.com>
2019-10-10 6:50 ` [MODERATED] Re: [PATCH v6 5/9] TAAv6 5 Greg KH
2019-10-10 21:18 ` Pawan Gupta
2019-10-10 6:50 ` Greg KH
[not found] ` <5d9e6f13.1c69fb81.d7036.be99SMTPIN_ADDED_BROKEN@mx.google.com>
2019-10-10 6:54 ` Greg KH [this message]
2019-10-12 1:41 ` [MODERATED] Re: [PATCH v6 9/9] TAAv6 9 Pawan Gupta
2019-10-13 20:05 ` Ben Hutchings
2019-10-13 21:00 ` Ben Hutchings
[not found] ` <4b15283c29b75be3177eb7c4b8601be5644f630e.157065=?utf-8?q?8889?= .git.pawan.kumar.gupta@linux.intel.com>
2019-10-18 1:21 ` [MODERATED] Re: [PATCH v6 8/9] TAAv6 8 Ben Hutchings
2019-10-21 20:04 ` [MODERATED] Re: [PATCH v6 0/9] TAAv6 0 Josh Poimboeuf
2019-10-21 20:09 ` Pawan Gupta
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=20191010065412.GD256999@kroah.com \
--to=gregkh@linuxfoundation.org \
--cc=speck@linutronix.de \
/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.