]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
x86/dma_bounce: rework _bus_dmamap_load_ma implementation
authorRoger Pau Monné <royger@FreeBSD.org>
Mon, 9 Nov 2015 12:19:58 +0000 (12:19 +0000)
committerRoger Pau Monné <royger@FreeBSD.org>
Mon, 9 Nov 2015 12:19:58 +0000 (12:19 +0000)
commit5c4133b1b5de150a1d0876037b4f358d1aca6d28
treeaa915403049febaaa65d88e0af195d017d2228e1
parentfdb319ca6678b0b14dfcbe1b7c2c4c1ce5bfc1b3
x86/dma_bounce: rework _bus_dmamap_load_ma implementation

The implementation of bus_dmamap_load_ma_triv currently calls
_bus_dmamap_load_phys on each page that is part of the passed in buffer.
Since each page is treated as an individual buffer, the resulting behaviour
is different from the behaviour of _bus_dmamap_load_buffer. This breaks
certain drivers, like Xen blkfront.

If an unmapped buffer of size 4096 that starts at offset 13 into the first
page is passed to the current _bus_dmamap_load_ma implementation (so the ma
array contains two pages), the result is that two segments are created, one
with a size of 4083 and the other with size 13 (because two independant
calls to _bus_dmamap_load_phys are performed, one for each physical page).
If the same is done with a mapped buffer and calling _bus_dmamap_load_buffer
the result is that only one segment is created, with a size of 4096.

This patch relegates the usage of bus_dmamap_load_ma_triv in x86 bounce
buffer code to drivers requesting BUS_DMA_KEEP_PG_OFFSET and implements
_bus_dmamap_load_ma so that it's behaviour is the same as the mapped version
(_bus_dmamap_load_buffer). This patch only modifies the x86 bounce buffer
code, other arches are left untouched.

Sponsored by: Citrix Systems R&D
Reviewed by: kib, jah (previous version)
MFC after: 2 weeks
Differential Revision: https://reviews.freebsd.org/D888
sys/x86/x86/busdma_bounce.c