summaryrefslogtreecommitdiff
path: root/sys/dev/pv/xen.c
diff options
context:
space:
mode:
authorMike Belopuhov <mikeb@cvs.openbsd.org>2016-01-22 19:26:41 +0000
committerMike Belopuhov <mikeb@cvs.openbsd.org>2016-01-22 19:26:41 +0000
commitb92e17c72adafa04f28fcea28a5acdeecd8660be (patch)
treedb673a7049fccb00bad65386309f7fea0eaa01ac /sys/dev/pv/xen.c
parentbf5cd320f452c472d1e14172e8aa98fa7bde1ada (diff)
Convert membar_* calls into virtio_membar_sync where it matters
membar_* functions are defined only as compiler barriers on !MP kernels, while we're trying to be conservative in our use of the barriers. Barriers are placed only where loads and stores might get reordered and it matters at the same time. Shared info page operations are using atomic instructions on Linux, so they get barriers as well.
Diffstat (limited to 'sys/dev/pv/xen.c')
-rw-r--r--sys/dev/pv/xen.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/sys/dev/pv/xen.c b/sys/dev/pv/xen.c
index cc08c6e6ec0..44e83142687 100644
--- a/sys/dev/pv/xen.c
+++ b/sys/dev/pv/xen.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: xen.c,v 1.31 2016/01/19 13:36:00 mikeb Exp $ */
+/* $OpenBSD: xen.c,v 1.32 2016/01/22 19:26:40 mikeb Exp $ */
/*
* Copyright (c) 2015 Mike Belopuhov
@@ -379,7 +379,7 @@ xen_print_info_page(void)
struct vcpu_info *v;
int i;
- membar_sync();
+ virtio_membar_sync();
for (i = 0; i < XEN_LEGACY_MAX_VCPUS; i++) {
v = &s->vcpu_info[i];
if (!v->evtchn_upcall_pending && !v->evtchn_upcall_mask &&
@@ -479,7 +479,6 @@ xen_init_interrupts(struct xen_softc *sc)
for (i = 0; i < nitems(sc->sc_ipg->evtchn_pending); i++) {
sc->sc_ipg->evtchn_pending[i] = 0;
sc->sc_ipg->evtchn_mask[i] = ~0UL;
- membar_producer();
}
SLIST_INIT(&sc->sc_intrs);
@@ -523,6 +522,7 @@ xen_intr_ack(void)
struct vcpu_info *v = &s->vcpu_info[CPU_INFO_UNIT(ci)];
v->evtchn_upcall_pending = 0;
+ virtio_membar_sync();
}
void
@@ -550,7 +550,7 @@ xen_intr(void)
if ((pending & 1) == 0)
continue;
sc->sc_ipg->evtchn_pending[row] &= ~(1 << bit);
- membar_producer();
+ virtio_membar_producer();
port = (row * LONG_BIT) + bit;
if ((xi = xen_lookup_intsrc(sc, port)) == NULL) {
printf("%s: unhandled interrupt on port %u\n",
@@ -687,7 +687,7 @@ xen_intr_disestablish(xen_intr_handle_t xih)
setbit((char *)&sc->sc_ipg->evtchn_mask[0], xi->xi_port);
clrbit((char *)&sc->sc_ipg->evtchn_pending[0], xi->xi_port);
- membar_producer();
+ virtio_membar_sync();
if (!xi->xi_noclose) {
ec.port = xi->xi_port;
@@ -715,7 +715,7 @@ xen_intr_enable(void)
sizeof(eu)))
printf("%s: unmasking port %u failed\n",
sc->sc_dev.dv_xname, xi->xi_port);
- membar_sync();
+ virtio_membar_sync();
if (isset((char *)&sc->sc_ipg->evtchn_mask[0],
xi->xi_port))
printf("%s: port %u is still masked\n",
@@ -734,7 +734,7 @@ xen_intr_mask(xen_intr_handle_t xih)
if ((xi = xen_lookup_intsrc(sc, port)) != NULL) {
xi->xi_masked = 1;
setbit((char *)&sc->sc_ipg->evtchn_mask[0], xi->xi_port);
- membar_producer();
+ virtio_membar_sync();
}
}
@@ -918,7 +918,7 @@ xen_grant_table_enter(struct xen_softc *sc, grant_ref_t ref, paddr_t pa,
mtx_enter(&ge->ge_mtx);
ge->ge_table[ref].frame = atop(pa);
ge->ge_table[ref].domid = 0;
- membar_producer();
+ virtio_membar_sync();
ge->ge_table[ref].flags = GTF_permit_access | flags;
mtx_leave(&ge->ge_mtx);
return (0);