mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Fenghua Yu <fenghua.yu@intel.com>
To: "Thomas Gleixner" <tglx@linutronix.de>,
	"Ingo Molnar" <mingo@elte.hu>,
	"H. Peter Anvin" <hpa@linux.intel.com>
Cc: "Ashok Raj" <ashok.raj@intel.com>,
	"Dave Hansen" <dave.hansen@intel.com>,
	"Rafael Wysocki" <rafael.j.wysocki@intel.com>,
	"Tony Luck" <tony.luck@intel.com>,
	"Alan Cox" <alan@linux.intel.com>,
	"Ravi V Shankar" <ravi.v.shankar@intel.com>,
	"Arjan van de Ven" <arjan@infradead.org>,
	"linux-kernel" <linux-kernel@vger.kernel.org>,
	"x86" <x86@kernel.org>, Fenghua Yu <fenghua.yu@intel.com>
Subject: [RFC PATCH 13/16] x86/split_lock: Add debugfs interface to control user mode behavior
Date: Sun, 27 May 2018 08:46:02 -0700	[thread overview]
Message-ID: <1527435965-202085-14-git-send-email-fenghua.yu@intel.com> (raw)
In-Reply-To: <1527435965-202085-1-git-send-email-fenghua.yu@intel.com>

Sometimes user wants to change how to handle user mode split lock during
run time.

Add interface /sys/kernel/debug/x86/split_lock/user_mode to allow user
to choose to either generate SIGBUS (default) when hitting split lock in
user or re-execute the user faulting instruction without generating
SIGBUS signal.

By default, user process is killed by SIGBUS after hitting split lock.
This ensures no user process can generate bus lock to block memory access
from other CPUs.

If user just wants to log split lock and continue to run the user process,
the user can configure "re-execute" in the interface.

Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
---
 arch/x86/kernel/cpu/test_ctl.c | 68 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 68 insertions(+)

diff --git a/arch/x86/kernel/cpu/test_ctl.c b/arch/x86/kernel/cpu/test_ctl.c
index 0212a7979a14..d774485a5ca4 100644
--- a/arch/x86/kernel/cpu/test_ctl.c
+++ b/arch/x86/kernel/cpu/test_ctl.c
@@ -57,6 +57,19 @@ static const char * const kernel_modes[KERNEL_MODE_LAST] = {
 
 static int kernel_mode_reaction = KERNEL_MODE_RE_EXECUTE;
 
+enum {
+	USER_MODE_SIGBUS,
+	USER_MODE_RE_EXECUTE,
+	USER_MODE_LAST
+};
+
+static const char * const user_modes[USER_MODE_LAST] = {
+	[USER_MODE_SIGBUS]     = "sigbus",
+	[USER_MODE_RE_EXECUTE] = "re-execute",
+};
+
+static int user_mode_reaction = USER_MODE_SIGBUS;
+
 /* Detete feature of #AC for split lock by probing bit 29 in MSR_TEST_CTL. */
 void detect_split_lock_ac(void)
 {
@@ -220,6 +233,16 @@ static void delayed_reenable_split_lock(struct work_struct *w)
 	mutex_unlock(&reexecute_split_lock_mutex);
 }
 
+static unsigned long eflags_ac(struct pt_regs *regs)
+{
+	return regs->flags & X86_EFLAGS_AC;
+}
+
+static unsigned long cr0_am(struct pt_regs *regs)
+{
+	return read_cr0() & X86_CR0_AM;
+}
+
 /* Will the faulting instruction be re-executed? */
 static bool re_execute(struct pt_regs *regs)
 {
@@ -230,6 +253,24 @@ static bool re_execute(struct pt_regs *regs)
 	if (!user_mode(regs))
 		return true;
 
+	/*
+	 * Now check if the user faulting instruction can be re-executed.
+	 *
+	 * If both CR0.AM (Alignment Mask) and EFLAGS.AC (Alignment Check)
+	 * are set in user space, any misalignment including split lock
+	 * can trigger #AC. In this case, we just issue SIGBUS as standard
+	 * #AC handler to the user process because split lock is not the
+	 * definite reason for triggering this #AC.
+	 *
+	 * If either CR0.AM or EFLAGS.AC is zero, the only reason for
+	 * triggering this #AC is split lock. So the faulting instruction
+	 * can be re-executed if required by user.
+	 */
+	if (cr0_am(regs) == 0 || eflags_ac(regs) == 0)
+		/* User faulting instruction will be re-executed if required. */
+		if (user_mode_reaction == USER_MODE_RE_EXECUTE)
+			return true;
+
 	return false;
 }
 
@@ -449,11 +490,38 @@ static const struct file_operations kernel_mode_ops = {
 	.llseek	= default_llseek,
 };
 
+static ssize_t user_mode_show(struct file *file, char __user *user_buf,
+			      size_t count, loff_t *ppos)
+{
+	return mode_show(user_buf, user_modes, USER_MODE_SIGBUS,
+			 USER_MODE_LAST, user_mode_reaction, count, ppos);
+}
+
+static ssize_t user_mode_store(struct file *file, const char __user *user_buf,
+			       size_t count, loff_t *ppos)
+{
+	int ret;
+
+	ret = mode_store(user_buf, count, user_modes, USER_MODE_SIGBUS,
+			 USER_MODE_LAST, &user_mode_reaction);
+	if (ret)
+		return ret;
+
+	return count;
+}
+
+static const struct file_operations user_mode_ops = {
+	.read	= user_mode_show,
+	.write	= user_mode_store,
+	.llseek	= default_llseek,
+};
+
 static int __init debugfs_setup_split_lock(void)
 {
 	struct debugfs_file debugfs_files[] = {
 		{"enable",      0600, &enable_ops},
 		{"kernel_mode",	0600, &kernel_mode_ops },
+		{"user_mode",	0600, &user_mode_ops },
 	};
 	struct dentry *split_lock_dir, *fd;
 	int i;
-- 
2.5.0

  parent reply	other threads:[~2018-05-27 15:48 UTC|newest]

Thread overview: 73+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-05-27 15:45 [RFC PATCH 00/16] x86/split_lock: Enable #AC exception for split locked accesses Fenghua Yu
2018-05-27 15:45 ` [RFC PATCH 01/16] x86/split_lock: Add CONFIG and enumerate #AC exception for split locked access feature Fenghua Yu
2018-05-27 15:45 ` [RFC PATCH 02/16] x86/split_lock: Handle #AC exception for split lock in kernel mode Fenghua Yu
2018-06-21 19:46   ` Peter Zijlstra
2018-06-22 10:49   ` Thomas Gleixner
2018-06-22 11:59     ` Thomas Gleixner
2018-06-22 22:41       ` Fenghua Yu
2018-06-22 22:57         ` Thomas Gleixner
2018-06-22 23:03           ` Thomas Gleixner
2018-06-22 23:18       ` Fenghua Yu
2018-06-23  9:08         ` Thomas Gleixner
2018-06-23  4:20     ` Fenghua Yu
2018-06-23  9:17       ` Thomas Gleixner
2018-06-23 15:05         ` Fenghua Yu
2018-06-24  0:55           ` Thomas Gleixner
2018-06-24  1:17             ` Fenghua Yu
2018-06-24  6:43               ` Thomas Gleixner
2018-05-27 15:45 ` [RFC PATCH 03/16] x86/split_lock: Set up #AC exception for split locked accesses on all CPUs Fenghua Yu
2018-05-27 15:45 ` [RFC PATCH 04/16] x86/split_lock: Use non locked bit set instruction in set_cpu_cap Fenghua Yu
2018-06-21 19:55   ` Peter Zijlstra
2018-06-21 20:37     ` Thomas Gleixner
2018-06-27 23:35     ` Fenghua Yu
2018-06-28  7:53       ` Thomas Gleixner
2018-06-28 14:23         ` Fenghua Yu
2018-06-28 14:54           ` Fenghua Yu
2018-05-27 15:45 ` [RFC PATCH 05/16] x86/split_lock: Use non atomic set and clear bit instructions in clear_cpufeature() Fenghua Yu
2018-05-27 15:45 ` [RFC PATCH 06/16] x86/split_lock: Save #AC setting for split lock in firmware in boot time and restore the setting in reboot Fenghua Yu
2018-06-21 19:58   ` Peter Zijlstra
2018-06-22 15:11     ` Alan Cox
2018-06-26  9:05       ` Peter Zijlstra
2018-06-26  9:40         ` Thomas Gleixner
2018-06-26 11:02         ` Alan Cox
2018-06-26 11:31           ` Peter Zijlstra
2018-05-27 15:45 ` [RFC PATCH 07/16] x86/split_lock: Handle suspend/hibernate and resume Fenghua Yu
2018-05-27 15:45 ` [RFC PATCH 08/16] x86/split_lock: Set split lock during EFI runtime service Fenghua Yu
2018-05-27 15:45 ` [RFC PATCH 09/16] x86/split_lock: Add CONFIG to control #AC for split lock at boot time Fenghua Yu
2018-05-27 15:45 ` [RFC PATCH 10/16] x86/split_lock: Add a debugfs interface to allow user to enable or disable #AC for split lock during run time Fenghua Yu
2018-05-29 18:43   ` Greg KH
2018-05-27 15:46 ` [RFC PATCH 11/16] x86/split_lock: Add CONFIG to control #AC for split lock from kernel at boot time Fenghua Yu
2018-05-27 15:46 ` [RFC PATCH 12/16] x86/split_lock: Add a debugfs interface to allow user to change how to handle split lock in kernel mode during run time Fenghua Yu
2018-05-27 15:46 ` Fenghua Yu [this message]
2018-05-27 15:46 ` [RFC PATCH 14/16] x86/split_lock: Add debugfs interface to show and control firmware setting for split lock Fenghua Yu
2018-05-27 15:46 ` [RFC PATCH 15/16] x86/split_lock: Add CONFIG and debugfs interface for testing #AC for split lock in kernel mode Fenghua Yu
2018-05-27 15:46 ` [RFC PATCH 16/16] x86/split_lock: Add user space split lock test in selftest Fenghua Yu
2018-05-29 16:39 ` [RFC PATCH 00/16] x86/split_lock: Enable #AC exception for split locked accesses Dave Hansen
2018-05-29 17:25   ` Fenghua Yu
2018-05-29 17:28     ` Dave Hansen
2018-05-29 17:40       ` Fenghua Yu
2018-05-29 16:40 ` Dave Hansen
2018-05-29 17:38   ` Fenghua Yu
2018-06-21 20:06   ` Peter Zijlstra
2018-06-21 19:37 ` Peter Zijlstra
2018-06-21 20:18   ` Fenghua Yu
2018-06-21 20:32     ` Thomas Gleixner
2018-06-21 22:00       ` Fenghua Yu
2018-06-21 22:07         ` Peter Zijlstra
2018-06-21 22:08         ` Peter Zijlstra
2018-06-21 22:18           ` Dave Hansen
2018-06-21 22:42             ` Fenghua Yu
2018-06-22  8:11               ` Peter Zijlstra
2018-06-22  9:30               ` Thomas Gleixner
2018-06-21 22:10         ` Peter Zijlstra
2018-06-21 23:05           ` Fenghua Yu
2018-06-22  8:19             ` Peter Zijlstra
2018-06-21 22:11         ` Peter Zijlstra
2018-06-21 22:43           ` Fenghua Yu
2018-06-21 22:13         ` Peter Zijlstra
2018-06-23 18:47           ` Fenghua Yu
2018-06-22  9:18         ` Thomas Gleixner
2018-06-22  9:22         ` Thomas Gleixner
2018-06-22  9:25         ` Thomas Gleixner
2018-06-22  9:28         ` Thomas Gleixner
2018-06-21 20:36     ` Peter Zijlstra

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=1527435965-202085-14-git-send-email-fenghua.yu@intel.com \
    --to=fenghua.yu@intel.com \
    --cc=alan@linux.intel.com \
    --cc=arjan@infradead.org \
    --cc=ashok.raj@intel.com \
    --cc=dave.hansen@intel.com \
    --cc=hpa@linux.intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=rafael.j.wysocki@intel.com \
    --cc=ravi.v.shankar@intel.com \
    --cc=tglx@linutronix.de \
    --cc=tony.luck@intel.com \
    --cc=x86@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®