Re: How to resolve an issue in swiotlb environment?

Christoph Hellwig
2019-06-11T06:42:29Z

Hi Alan,

thanks for the explanation. It seems like what usb wants is to:

- set sg_tablesize to 1 for devices that can't handle scatterlist at all
- set the virt boundary as-is for devices supporting "basic" scatterlist,
although that still assumes they can rejiggle them because for example
you could still get a smaller than expected first segment ala (assuming
a 1024 byte packet size and thus 1023 virt_boundary_mask):

| 0 .. 511 | 512 .. 1023 | 1024 .. 1535 |

as the virt_bondary does not guarantee that the first segment is
the same size as all the mid segments.
- do not set any limit on xhci

But that just goes back to the original problem, and that is that with
swiotlb we are limited in the total dma mapping size, and recent block
layer changes in the way we handle the virt_boundary mean we now build
much larger requests by default. For SCSI ULDs to take that into
account I need to call dma_max_mapping_size() and use that as the
upper bound for the request size. My plan is to do that in scsi_lib.c,
but for that we need to expose the actual struct device that the dma
mapping is perfomed on to the scsi layer. If that device is different
from the sysfs hierchary struct device, which it is for usb the ULDD
needs to scsi_add_host_with_dma and pass the dma device as well. How
do I get at the dma device (aka the HCDs pci_dev or similar) from
usb-storage/uas?