Re: [RFC][PATCH] dma-mapping: align default segment_boundary_mask with dma_mask

From: Robin Murphy
Date: Mon Mar 16 2020 - 09:16:28 EST


On 2020-03-16 12:46 pm, Christoph Hellwig wrote:
On Mon, Mar 16, 2020 at 12:12:08PM +0000, Robin Murphy wrote:
On 2020-03-14 12:00 am, Nicolin Chen wrote:
More and more drivers set dma_masks above DMA_BIT_MAKS(32) while
only a handful of drivers call dma_set_seg_boundary(). This means
that most drivers have a 4GB segmention boundary because DMA API
returns DMA_BIT_MAKS(32) as a default value, though they might be
able to handle things above 32-bit.

Don't assume the boundary mask and the DMA mask are related. There do exist
devices which can DMA to a 64-bit address space in general, but due to
descriptor formats/hardware design/whatever still require any single
transfer not to cross some smaller boundary. XHCI is 64-bit yet requires
most things not to cross a 64KB boundary. EHCI's 64-bit mode is an example
of the 4GB boundary (not the best example, admittedly, but it undeniably
exists).

Yes, which is what the boundary is for. But why would we default to
something restrictive by default even if the driver didn't ask for it?

I've always assumed it was for the same reason as the 64KB segment length, i.e. it was sufficiently common as an actual restriction, but still "good enough" for everyone else. I remember digging up all the history to understand what these were about back when I implemented the map_sg stuff, and from that I'd imagine the actual values are somewhat biased towards SCSI HBAs, since they originated in the block and SCSI layers.

Robin.