summaryrefslogtreecommitdiffstats
path: root/sys/dev/pv/xen.c
diff options
context:
space:
mode:
authormikeb <mikeb@openbsd.org>2016-09-12 17:22:45 +0000
committermikeb <mikeb@openbsd.org>2016-09-12 17:22:45 +0000
commit6a8f7da36f317e9404ebe249574fd0a9d1d6cb7d (patch)
tree9457a064c665e866839fd3bd5307fd810f588176 /sys/dev/pv/xen.c
parentRecord mbuf chain head rather than individual fragments (diff)
downloadwireguard-openbsd-6a8f7da36f317e9404ebe249574fd0a9d1d6cb7d.tar.xz
wireguard-openbsd-6a8f7da36f317e9404ebe249574fd0a9d1d6cb7d.zip
Bring back the code that cached DMA fragment offset.
It's required to handle mbuf fragments spanning multiple pages. Original commit message said: Memorize the DMA segment's data offset within the page Grant table references don't convey the information about an actual offset of the data within the page, however Xen needs to know it. We (ab)use bus_dma_segment's _ds_boundary member to store it and can get away with not restoring it's original value atm because neither i386 nor amd64 bus_dmamap_unload(9) code needs it.
Diffstat (limited to 'sys/dev/pv/xen.c')
-rw-r--r--sys/dev/pv/xen.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/sys/dev/pv/xen.c b/sys/dev/pv/xen.c
index 6841c05a761..27759ffa982 100644
--- a/sys/dev/pv/xen.c
+++ b/sys/dev/pv/xen.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: xen.c,v 1.62 2016/08/17 17:18:38 mikeb Exp $ */
+/* $OpenBSD: xen.c,v 1.63 2016/09/12 17:22:45 mikeb Exp $ */
/*
* Copyright (c) 2015 Mike Belopuhov
@@ -1191,6 +1191,8 @@ xen_bus_dmamap_load(bus_dma_tag_t t, bus_dmamap_t map, void *buf,
xen_grant_table_enter(sc, gm[i].gm_ref, map->dm_segs[i].ds_addr,
domain, flags & BUS_DMA_WRITE ? GTF_readonly : 0);
gm[i].gm_paddr = map->dm_segs[i].ds_addr;
+ map->dm_segs[i].ds_offset = map->dm_segs[i].ds_addr &
+ PAGE_MASK;
map->dm_segs[i].ds_addr = gm[i].gm_ref;
}
return (0);
@@ -1212,6 +1214,8 @@ xen_bus_dmamap_load_mbuf(bus_dma_tag_t t, bus_dmamap_t map, struct mbuf *m0,
for (i = 0; i < map->dm_nsegs; i++) {
xen_grant_table_enter(sc, gm[i].gm_ref, map->dm_segs[i].ds_addr,
domain, flags & BUS_DMA_WRITE ? GTF_readonly : 0);
+ map->dm_segs[i].ds_offset = map->dm_segs[i].ds_addr &
+ PAGE_MASK;
gm[i].gm_paddr = map->dm_segs[i].ds_addr;
map->dm_segs[i].ds_addr = gm[i].gm_ref;
}