summaryrefslogtreecommitdiff
path: root/arch/s390/mm
diff options
context:
space:
mode:
authorHeiko Carstens <hca@linux.ibm.com>2023-10-12 10:40:41 +0300
committerVasily Gorbik <gor@linux.ibm.com>2023-10-23 19:21:22 +0300
commit4416d2ed816699b8e7491f1e8e8b15f69685af57 (patch)
tree4a5131f0b9c63ead952d1bd4e8bdde56e92f7392 /arch/s390/mm
parent9641613f48bbf8626355118de58f96eec5aebf49 (diff)
downloadlinux-4416d2ed816699b8e7491f1e8e8b15f69685af57.tar.xz
s390/mm,fault: use static key for store indication
Generate slightly better code by using a static key to implement store indication. This allows to get rid of a memory access on the hot path. Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com> Signed-off-by: Heiko Carstens <hca@linux.ibm.com> Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
Diffstat (limited to 'arch/s390/mm')
-rw-r--r--arch/s390/mm/fault.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c
index ba2056b35910..5466a30d1ec4 100644
--- a/arch/s390/mm/fault.c
+++ b/arch/s390/mm/fault.c
@@ -15,6 +15,7 @@
#include <linux/signal.h>
#include <linux/sched.h>
#include <linux/sched/debug.h>
+#include <linux/jump_label.h>
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/string.h>
@@ -60,12 +61,12 @@ enum fault_type {
GMAP_FAULT,
};
-static unsigned long store_indication __read_mostly;
+static DEFINE_STATIC_KEY_FALSE(have_store_indication);
static int __init fault_init(void)
{
if (test_facility(75))
- store_indication = 0xc00;
+ static_branch_enable(&have_store_indication);
return 0;
}
early_initcall(fault_init);
@@ -104,11 +105,13 @@ static unsigned long get_fault_address(struct pt_regs *regs)
return trans_exc_code & __FAIL_ADDR_MASK;
}
-static bool fault_is_write(struct pt_regs *regs)
+static __always_inline bool fault_is_write(struct pt_regs *regs)
{
unsigned long trans_exc_code = regs->int_parm_long;
- return (trans_exc_code & store_indication) == 0x400;
+ if (static_branch_likely(&have_store_indication))
+ return (trans_exc_code & 0xc00) == 0x400;
+ return false;
}
static int bad_address(void *p)