Commit a4648c75 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'stable/for-linus-4.20' of...

Merge branch 'stable/for-linus-4.20' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/swiotlb

Pull xen swiotlb fix from Konrad Rzeszutek Wilk:
 "One tiny fix for the Xen SWIOTLB mechanism that occasionally happened
  with devices that didn't allocate size in power of two but rather some
  odd sizes.

  We neglected to make the memory coherent leading to all kinds of fun
  crashes"

* 'stable/for-linus-4.20' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/swiotlb:
  xen-swiotlb: use actually allocated size on check physical continuous
parents 58a02287 7250f422
...@@ -303,6 +303,9 @@ xen_swiotlb_alloc_coherent(struct device *hwdev, size_t size, ...@@ -303,6 +303,9 @@ xen_swiotlb_alloc_coherent(struct device *hwdev, size_t size,
*/ */
flags &= ~(__GFP_DMA | __GFP_HIGHMEM); flags &= ~(__GFP_DMA | __GFP_HIGHMEM);
/* Convert the size to actually allocated. */
size = 1UL << (order + XEN_PAGE_SHIFT);
/* On ARM this function returns an ioremap'ped virtual address for /* On ARM this function returns an ioremap'ped virtual address for
* which virt_to_phys doesn't return the corresponding physical * which virt_to_phys doesn't return the corresponding physical
* address. In fact on ARM virt_to_phys only works for kernel direct * address. In fact on ARM virt_to_phys only works for kernel direct
...@@ -351,6 +354,9 @@ xen_swiotlb_free_coherent(struct device *hwdev, size_t size, void *vaddr, ...@@ -351,6 +354,9 @@ xen_swiotlb_free_coherent(struct device *hwdev, size_t size, void *vaddr,
* physical address */ * physical address */
phys = xen_bus_to_phys(dev_addr); phys = xen_bus_to_phys(dev_addr);
/* Convert the size to actually allocated. */
size = 1UL << (order + XEN_PAGE_SHIFT);
if (((dev_addr + size - 1 <= dma_mask)) || if (((dev_addr + size - 1 <= dma_mask)) ||
range_straddles_page_boundary(phys, size)) range_straddles_page_boundary(phys, size))
xen_destroy_contiguous_region(phys, order); xen_destroy_contiguous_region(phys, order);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment