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>,
"Ashok Raj" <ashok.raj@intel.com>,
"Ravi V Shankar" <ravi.v.shankar@intel.com>,
"Tony Luck" <tony.luck@intel.com>,
"Dave Hansen" <dave.hansen@intel.com>,
"Rafael Wysocki" <rafael.j.wysocki@intel.com>,
"Arjan van de Ven" <arjan@infradead.org>,
"Alan Cox" <alan@linux.intel.com>
Cc: "x86" <x86@kernel.org>,
"linux-kernel" <linux-kernel@vger.kernel.org>,
Fenghua Yu <fenghua.yu@intel.com>
Subject: [PATCH 14/15] x86/split_lock: Add CONFIG and testing sysfs interface
Date: Mon, 14 May 2018 11:52:24 -0700 [thread overview]
Message-ID: <1526323945-211107-15-git-send-email-fenghua.yu@intel.com> (raw)
In-Reply-To: <1526323945-211107-1-git-send-email-fenghua.yu@intel.com>
CONFIG_SPLIT_LOCK_AC_TEST is added to enable sysfs interface
/sys/kernel/split_lock/test_kernel to test split lock in kernel.
Writing 1 to the file triggers a split locked access in kernel.
User can use this interface to test how split locked access
happening in kernel is handled.
The file is not readable.
Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
---
arch/x86/Kconfig | 10 ++++++
arch/x86/kernel/cpu/split_lock.c | 71 ++++++++++++++++++++++++++++++++++++++++
2 files changed, 81 insertions(+)
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index 38baf5fb8556..018596d80424 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -460,6 +460,16 @@ config SPLIT_LOCK_AC
Say N if unsure.
+config SPLIT_LOCK_AC_TEST
+ bool "Test #AC exception for split locked accesses"
+ default n
+ depends on SPLIT_LOCK_AC
+ help
+ Select to enable testing #AC exception for split lock accesses.
+ This adds interface /sys/kernel/split_lock/trigger_kernel to
+ allow user to trigger split locked access in kernel and test
+ split lock handling.
+
if X86_32
config X86_BIGSMP
bool "Support for big SMP systems with more than 8 CPUs"
diff --git a/arch/x86/kernel/cpu/split_lock.c b/arch/x86/kernel/cpu/split_lock.c
index 948a7fa948a2..eef69283aa5d 100644
--- a/arch/x86/kernel/cpu/split_lock.c
+++ b/arch/x86/kernel/cpu/split_lock.c
@@ -490,10 +490,81 @@ bios_store(struct kobject *kobj, struct kobj_attribute *attr,
static struct kobj_attribute split_lock_ac_bios_enable = __ATTR_RW(bios);
+#ifdef CONFIG_SPLIT_LOCK_AC_TEST
+/* Execute locked cmpxchg with split locked address. */
+static void split_lock_test_kernel(void)
+{
+ char cptr[128] __aligned(64);
+ int *iptr, a = 10, b = 11;
+
+ /* Increment the pointer, making it misaligned */
+ iptr = (int *)(cptr + 61);
+
+ /* Initial value 1 in iptr */
+ *iptr = 1;
+
+ pr_info("split lock test: misaligned address=%lx\n",
+ (unsigned long)iptr);
+ /*
+ * Since eax is equal to *iptr, the instruction loads value in b
+ * (i.e. 11) into iptr. If the instruction is executed correctly,
+ * the content of *iptr is changed to 11 from previous value 1.
+ *
+ * Accessing iptr cross two cache lines will trigger #AC in hardware.
+ * The instruction is re-executed during split lock is disabled and
+ * re-enabled later.
+ */
+ asm volatile ("movl %1, %%eax\n\t"
+ "movl %1, %0\n\t"
+ "lock\n cmpxchgl %2, %0\n\t"
+ : "=m" (*iptr)
+ : "r"(a), "r"(b)
+ : "%eax");
+
+ if (*iptr == b)
+ pr_info("split lock kernel test passes\n");
+ else
+ pr_info("split lock kernel test fails\n");
+}
+
+/*
+ * Writing 1 to /sys/kernel/split_lock/test_kernel triggers split locked
+ * access in kernel mode.
+ */
+static ssize_t
+test_kernel_store(struct kobject *kobj, struct kobj_attribute *attr,
+ const char *buf, size_t count)
+{
+ u32 val;
+ int ret;
+
+ if (split_lock_ac == DISABLE_SPLIT_LOCK_AC)
+ return -ENODEV;
+
+ ret = kstrtou32(buf, 10, &val);
+ if (ret)
+ return ret;
+
+ if (val != 1)
+ return -EINVAL;
+
+ mutex_lock(&split_lock_mutex);
+ split_lock_test_kernel();
+ mutex_unlock(&split_lock_mutex);
+
+ return count;
+}
+
+static struct kobj_attribute split_lock_ac_test = __ATTR_WO(test_kernel);
+#endif /* CONFIG_SPLIT_LOCK_AC_TEST */
+
static struct attribute *split_lock_attrs[] = {
&split_lock_ac_enable.attr,
&split_lock_ac_user.attr,
&split_lock_ac_bios_enable.attr,
+#ifdef CONFIG_SPLIT_LOCK_AC_TEST
+ &split_lock_ac_test.attr,
+#endif
NULL,
};
--
2.5.0
next prev parent reply other threads:[~2018-05-14 18:52 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-05-14 18:52 [PATCH 0/15] x86/split_lock: Enable #AC exception for split locked accesses Fenghua Yu
2018-05-14 18:52 ` [PATCH 01/15] x86/split_lock: Add CONFIG and enumerate #AC exception for split locked access feature Fenghua Yu
2018-05-15 15:36 ` Dave Hansen
2018-05-15 15:41 ` Fenghua Yu
2018-05-15 15:54 ` Dave Hansen
2018-05-14 18:52 ` [PATCH 02/15] x86/split_lock: Set up #AC exception for split locked accesses Fenghua Yu
2018-05-14 18:52 ` [PATCH 03/15] x86/split_lock: Handle #AC exception for split lock in kernel mode Fenghua Yu
2018-05-15 15:51 ` Dave Hansen
2018-05-15 16:35 ` Luck, Tony
2018-05-15 17:21 ` Fenghua Yu
2018-05-16 16:44 ` Dave Hansen
2018-05-16 21:35 ` Fenghua Yu
2018-05-14 18:52 ` [PATCH 04/15] x86/split_lock: Use non locked bit set instruction in set_cpu_cap Fenghua Yu
2018-05-14 18:52 ` [PATCH 05/15] x86/split_lock: Use non atomic set and clear bit instructions to clear cpufeature Fenghua Yu
2018-05-14 18:52 ` [PATCH 06/15] x86/split_lock: Save #AC setting for split lock in BIOS in boot time and restore the setting in reboot Fenghua Yu
2018-05-14 18:52 ` [PATCH 07/15] x86/split_lock: Handle suspend/hibernate and resume Fenghua Yu
2018-05-14 21:42 ` Rafael J. Wysocki
2018-05-14 18:52 ` [PATCH 08/15] x86/split_lock: Set split lock during EFI runtime service Fenghua Yu
2018-05-14 18:52 ` [PATCH 09/15] x86/split_lock: Explicitly enable or disable #AC for split locked accesses Fenghua Yu
2018-05-15 16:15 ` Dave Hansen
2018-05-15 17:29 ` Fenghua Yu
2018-05-16 16:37 ` Dave Hansen
2018-05-14 18:52 ` [PATCH 10/15] x86/split_lock: Add a sysfs interface to allow user to enable or disable split lock during run time Fenghua Yu
2018-05-14 18:52 ` [PATCH 11/15] x86/split_lock: Add sysfs interface to control user mode behavior Fenghua Yu
2018-05-14 18:52 ` [PATCH 12/15] x86/split_lock: Add sysfs interface to show and control BIOS split lock setting Fenghua Yu
2018-05-14 18:52 ` [PATCH 13/15] x86/split_lock: Trace #AC exception for split lock Fenghua Yu
2018-05-14 18:52 ` Fenghua Yu [this message]
2018-05-14 18:52 ` [PATCH 15/15] x86/split_lock: Add split lock user space test in selftest Fenghua Yu
2018-05-15 15:10 ` [PATCH 0/15] x86/split_lock: Enable #AC exception for split locked accesses Dave Hansen
2018-05-15 16:26 ` Alan Cox
2018-05-15 16:30 ` Dave Hansen
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=1526323945-211107-15-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 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.