summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMateusz Guzik <mjg@FreeBSD.org>2020-02-14 13:14:19 +0000
committerMateusz Guzik <mjg@FreeBSD.org>2020-02-14 13:14:19 +0000
commited8cd4795c4cebccfbb165b7dba376b7cf2dabff (patch)
tree26182fe8ba069920df641cb670b98228545201a3
parent2f7292437d0c4b7173a3298b96a0d0e6156efa5f (diff)
Notes
-rw-r--r--sys/amd64/amd64/trap.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/sys/amd64/amd64/trap.c b/sys/amd64/amd64/trap.c
index 08423b6182c4..2dda8f41b719 100644
--- a/sys/amd64/amd64/trap.c
+++ b/sys/amd64/amd64/trap.c
@@ -1068,25 +1068,32 @@ flush_l1d_hw(void)
wrmsr(MSR_IA32_FLUSH_CMD, IA32_FLUSH_CMD_L1D);
}
-static void __inline
-amd64_syscall_ret_flush_l1d_inline(int error)
+static void __noinline
+amd64_syscall_ret_flush_l1d_check(int error)
{
void (*p)(void);
- if (error != 0 && error != EEXIST && error != EAGAIN &&
- error != EXDEV && error != ENOENT && error != ENOTCONN &&
- error != EINPROGRESS) {
- p = syscall_ret_l1d_flush;
+ if (error != EEXIST && error != EAGAIN && error != EXDEV &&
+ error != ENOENT && error != ENOTCONN && error != EINPROGRESS) {
+ p = (void *)atomic_load_ptr(&syscall_ret_l1d_flush);
if (p != NULL)
p();
}
}
+static void __inline
+amd64_syscall_ret_flush_l1d_check_inline(int error)
+{
+
+ if (__predict_false(error != 0))
+ amd64_syscall_ret_flush_l1d_check(error);
+}
+
void
amd64_syscall_ret_flush_l1d(int error)
{
- amd64_syscall_ret_flush_l1d_inline(error);
+ amd64_syscall_ret_flush_l1d_check_inline(error);
}
void
@@ -1190,5 +1197,5 @@ amd64_syscall(struct thread *td, int traced)
if (__predict_false(td->td_frame->tf_rip >= VM_MAXUSER_ADDRESS))
set_pcb_flags(td->td_pcb, PCB_FULL_IRET);
- amd64_syscall_ret_flush_l1d_inline(td->td_errno);
+ amd64_syscall_ret_flush_l1d_check_inline(td->td_errno);
}