• Firo Yang's avatar
    ixgbe: sync the first fragment unconditionally · e7ba676c
    Firo Yang authored
    In Xen environment, if Xen-swiotlb is enabled, ixgbe driver
    could possibly allocate a page, DMA memory buffer, for the first
    fragment which is not suitable for Xen-swiotlb to do DMA operations.
    Xen-swiotlb have to internally allocate another page for doing DMA
    operations. This mechanism requires syncing the data from the internal
    page to the page which ixgbe sends to upper network stack. However,
    since commit f3213d93 ("ixgbe: Update driver to make use of DMA
    attributes in Rx path"), the unmap operation is performed with
    DMA_ATTR_SKIP_CPU_SYNC. As a result, the sync is not performed.
    Since the sync isn't performed, the upper network stack could receive
    a incomplete network packet. By incomplete, it means the linear data
    on the first fragment(between skb->head and skb->end) is invalid. So
    we have to copy the data from the internal xen-swiotlb page to the page
    which ixgbe sends to upper network stack through the sync operation.
    
    More details from Alexander Duyck:
    Specifically since we are mapping the frame with
    DMA_ATTR_SKIP_CPU_SYNC we have to unmap with that as well. As a result
    a sync is not performed on an unmap and must be done manually as we
    skipped it for the first frag. As such we need to always sync before
    possibly performing a page unmap operation.
    
    Fixes: f3213d93 ("ixgbe: Update driver to make use of DMA attributes in Rx path")
    Signed-off-by: default avatarFiro Yang <firo.yang@suse.com>
    Reviewed-by: default avatarAlexander Duyck <alexander.h.duyck@linux.intel.com>
    Tested-by: default avatarAndrew Bowers <andrewx.bowers@intel.com>
    Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
    e7ba676c
ixgbe_main.c 313 KB