Skip to content
  • David Gibson's avatar
    usb: Fix (another) bug in usb_packet_map() for IOMMU handling · 155de06f
    David Gibson authored
    Elements in qemu SGLists can cross IOMMU page boundaries.  So, in commit
    39c138c8
    
     "usb: Fix usb_packet_map() in the
    presence of IOMMUs", I changed usb_packet_map() to split up each SGList
    element on IOMMU page boundaries and each resulting piece of qemu's memory
    space separately to the iovec the usb code uses internally.
    
    That was correct in concept, but the patch has a bug.  The 'base' variable
    correctly steps through the dma address of each piece, but then we call
    the dma_memory_map() function on the base address of the whole SGList
    element every time.
    
    This patch fixes at least one problem using XHCI on the pseries guest
    machine.  It didn't affect OHCI because that doesn't use usb_packet_map().
    In theory it also affects EHCI, but we haven't observed that in practice.
    I think the transfers were small enough on EHCI that they never crossed an
    IOMMU page boundary in practice.
    
    Signed-off-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
    Signed-off-by: default avatarGerd Hoffmann <kraxel@redhat.com>
    155de06f