summaryrefslogtreecommitdiffstats
path: root/sys/arch/powerpc64
diff options
context:
space:
mode:
authorkettenis <kettenis@openbsd.org>2020-08-17 16:55:41 +0000
committerkettenis <kettenis@openbsd.org>2020-08-17 16:55:41 +0000
commit3d73cff41e6a3d60bea06fb1ae581db81112f85c (patch)
tree57ddc8c29eb2e96e93416491c36948d02309df27 /sys/arch/powerpc64
parentFix possible leak of ocsp_id. (diff)
downloadwireguard-openbsd-3d73cff41e6a3d60bea06fb1ae581db81112f85c.tar.xz
wireguard-openbsd-3d73cff41e6a3d60bea06fb1ae581db81112f85c.zip
Switch to a per-proc SLB cache. Seems to make GENERIC.MP kernels
(much more) stable. Probably because we could restore an incoherent SLB cache since there was no locking in the trap return path.
Diffstat (limited to 'sys/arch/powerpc64')
-rw-r--r--sys/arch/powerpc64/include/pcb.h4
-rw-r--r--sys/arch/powerpc64/include/pmap.h3
-rw-r--r--sys/arch/powerpc64/powerpc64/machdep.c3
-rw-r--r--sys/arch/powerpc64/powerpc64/pmap.c19
-rw-r--r--sys/arch/powerpc64/powerpc64/vm_machdep.c8
5 files changed, 22 insertions, 15 deletions
diff --git a/sys/arch/powerpc64/include/pcb.h b/sys/arch/powerpc64/include/pcb.h
index 349707f4eac..3bc8295af49 100644
--- a/sys/arch/powerpc64/include/pcb.h
+++ b/sys/arch/powerpc64/include/pcb.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: pcb.h,v 1.6 2020/07/01 16:05:48 kettenis Exp $ */
+/* $OpenBSD: pcb.h,v 1.7 2020/08/17 16:55:41 kettenis Exp $ */
/*
* Copyright (c) 2020 Mark Kettenis <kettenis@openbsd.org>
@@ -20,6 +20,7 @@
#define _MACHINE_PCB_H_
#include <machine/reg.h>
+#include <machine/pte.h>
struct pcb {
register_t pcb_sp;
@@ -27,6 +28,7 @@ struct pcb {
#define PCB_FP 0x000000001
#define PCB_VEC 0x000000002
#define PCB_VSX 0x000000004
+ struct slb pcb_slb[32];
vaddr_t pcb_onfault;
vaddr_t pcb_userva;
struct fpreg pcb_fpstate;
diff --git a/sys/arch/powerpc64/include/pmap.h b/sys/arch/powerpc64/include/pmap.h
index 50ff0464e9c..14316fe5fd0 100644
--- a/sys/arch/powerpc64/include/pmap.h
+++ b/sys/arch/powerpc64/include/pmap.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: pmap.h,v 1.13 2020/07/23 15:09:09 kettenis Exp $ */
+/* $OpenBSD: pmap.h,v 1.14 2020/08/17 16:55:41 kettenis Exp $ */
/*
* Copyright (c) 2020 Mark Kettenis <kettenis@openbsd.org>
@@ -36,7 +36,6 @@ struct pmap {
int pm_refs;
struct pmap_statistics pm_stats;
struct mutex pm_mtx;
- struct slb pm_slb[32];
};
typedef struct pmap *pmap_t;
diff --git a/sys/arch/powerpc64/powerpc64/machdep.c b/sys/arch/powerpc64/powerpc64/machdep.c
index fee4cd85e5d..2f36148c222 100644
--- a/sys/arch/powerpc64/powerpc64/machdep.c
+++ b/sys/arch/powerpc64/powerpc64/machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: machdep.c,v 1.55 2020/07/21 21:36:58 kettenis Exp $ */
+/* $OpenBSD: machdep.c,v 1.56 2020/08/17 16:55:41 kettenis Exp $ */
/*
* Copyright (c) 2020 Mark Kettenis <kettenis@openbsd.org>
@@ -738,6 +738,7 @@ setregs(struct proc *p, struct exec_package *pack, u_long stack,
frame->srr0 = pack->ep_entry;
frame->srr1 = PSL_USER;
+ memset(&pcb->pcb_slb, 0, sizeof(pcb->pcb_slb));
memset(&pcb->pcb_fpstate, 0, sizeof(pcb->pcb_fpstate));
pcb->pcb_flags = 0;
}
diff --git a/sys/arch/powerpc64/powerpc64/pmap.c b/sys/arch/powerpc64/powerpc64/pmap.c
index a67595e6518..eba61982c17 100644
--- a/sys/arch/powerpc64/powerpc64/pmap.c
+++ b/sys/arch/powerpc64/powerpc64/pmap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pmap.c,v 1.40 2020/08/04 16:28:16 kettenis Exp $ */
+/* $OpenBSD: pmap.c,v 1.41 2020/08/17 16:55:41 kettenis Exp $ */
/*
* Copyright (c) 2015 Martin Pieuchot
@@ -50,6 +50,8 @@
#include <sys/param.h>
#include <sys/atomic.h>
#include <sys/pool.h>
+#include <sys/proc.h>
+#include <sys/user.h>
#include <uvm/uvm_extern.h>
@@ -333,23 +335,24 @@ pmap_slbd_lookup(pmap_t pm, vaddr_t va)
void
pmap_slbd_cache(pmap_t pm, struct slb_desc *slbd)
{
+ struct pcb *pcb = &curproc->p_addr->u_pcb;
uint64_t slbe, slbv;
int idx;
- PMAP_VP_ASSERT_LOCKED(pm);
+ KASSERT(curproc->p_vmspace->vm_map.pmap == pm);
- for (idx = 0; idx < nitems(pm->pm_slb); idx++) {
- if (pm->pm_slb[idx].slb_slbe == 0)
+ for (idx = 0; idx < nitems(pcb->pcb_slb); idx++) {
+ if (pcb->pcb_slb[idx].slb_slbe == 0)
break;
}
- if (idx == nitems(pm->pm_slb))
- idx = arc4random_uniform(nitems(pm->pm_slb));
+ if (idx == nitems(pcb->pcb_slb))
+ idx = arc4random_uniform(nitems(pcb->pcb_slb));
slbe = (slbd->slbd_esid << SLBE_ESID_SHIFT) | SLBE_VALID | idx;
slbv = slbd->slbd_vsid << SLBV_VSID_SHIFT;
- pm->pm_slb[idx].slb_slbe = slbe;
- pm->pm_slb[idx].slb_slbv = slbv;
+ pcb->pcb_slb[idx].slb_slbe = slbe;
+ pcb->pcb_slb[idx].slb_slbv = slbv;
}
int
diff --git a/sys/arch/powerpc64/powerpc64/vm_machdep.c b/sys/arch/powerpc64/powerpc64/vm_machdep.c
index e872ee5f2da..609593b90be 100644
--- a/sys/arch/powerpc64/powerpc64/vm_machdep.c
+++ b/sys/arch/powerpc64/powerpc64/vm_machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: vm_machdep.c,v 1.4 2020/06/30 20:31:54 kettenis Exp $ */
+/* $OpenBSD: vm_machdep.c,v 1.5 2020/08/17 16:55:41 kettenis Exp $ */
/*-
* Copyright (c) 1995 Charles M. Hannum. All rights reserved.
@@ -67,7 +67,6 @@ void
cpu_fork(struct proc *p1, struct proc *p2, void *stack, void *tcb,
void (*func)(void *), void *arg)
{
- pmap_t pm = p2->p_vmspace->vm_map.pmap;
struct pcb *pcb = &p2->p_addr->u_pcb;
struct trapframe *tf;
struct callframe *cf;
@@ -77,7 +76,10 @@ cpu_fork(struct proc *p1, struct proc *p2, void *stack, void *tcb,
/* Copy the pcb. */
*pcb = p1->p_addr->u_pcb;
- pmap_extract(pmap_kernel(), (vaddr_t)&pm->pm_slb,
+ /* XXX This should not be necessary but things explodes without it. */
+ memset(&pcb->pcb_slb, 0, sizeof(pcb->pcb_slb));
+
+ pmap_extract(pmap_kernel(), (vaddr_t)&pcb->pcb_slb,
&p2->p_md.md_user_slb_pa);
pmap_activate(p2);