return swiotlb_force || xen_swiotlb_arch_range_needs_mapping(paddr, size);
}
-static int is_xen_swiotlb_buffer(char *addr)
+static int is_xen_swiotlb_buffer(dma_addr_t dma_addr)
{
+ unsigned long mfn = PFN_DOWN(dma_addr);
+ unsigned long pfn = mfn_to_local_pfn(mfn);
+ char *addr = NULL;
+
+ if (pfn_valid(pfn))
+ addr = __va(pfn << PAGE_SHIFT);
+
return addr >= xen_io_tlb_start && addr < xen_io_tlb_end;
}
BUG_ON(dir == DMA_NONE);
- if (is_xen_swiotlb_buffer(dma_addr)) {
+ if (is_xen_swiotlb_buffer(dev_addr)) {
do_unmap_single(hwdev, dma_addr, size, dir);
return;
}
BUG_ON(dir == DMA_NONE);
- if (is_xen_swiotlb_buffer(dma_addr)) {
+ if (is_xen_swiotlb_buffer(dev_addr)) {
sync_single(hwdev, dma_addr, size, dir, target);
return;
}