Merge tag 'dma-mapping-5.14-1' of git://git.infradead.org/users/hch/dma-mapping

Pull dma-mapping fix from Christoph Hellwig:

- handle vmalloc addresses in dma_common_{mmap,get_sgtable} (Roman
Skakun)

* tag 'dma-mapping-5.14-1' of git://git.infradead.org/users/hch/dma-mapping:
dma-mapping: handle vmalloc addresses in dma_common_{mmap,get_sgtable}

+10 -2
+10 -2
kernel/dma/ops_helpers.c
··· 5 */ 6 #include <linux/dma-map-ops.h> 7 8 /* 9 * Create scatter-list for the already allocated DMA buffer. 10 */ ··· 19 void *cpu_addr, dma_addr_t dma_addr, size_t size, 20 unsigned long attrs) 21 { 22 - struct page *page = virt_to_page(cpu_addr); 23 int ret; 24 25 ret = sg_alloc_table(sgt, 1, GFP_KERNEL); ··· 39 unsigned long user_count = vma_pages(vma); 40 unsigned long count = PAGE_ALIGN(size) >> PAGE_SHIFT; 41 unsigned long off = vma->vm_pgoff; 42 int ret = -ENXIO; 43 44 vma->vm_page_prot = dma_pgprot(dev, vma->vm_page_prot, attrs); ··· 51 return -ENXIO; 52 53 return remap_pfn_range(vma, vma->vm_start, 54 - page_to_pfn(virt_to_page(cpu_addr)) + vma->vm_pgoff, 55 user_count << PAGE_SHIFT, vma->vm_page_prot); 56 #else 57 return -ENXIO;
··· 5 */ 6 #include <linux/dma-map-ops.h> 7 8 + static struct page *dma_common_vaddr_to_page(void *cpu_addr) 9 + { 10 + if (is_vmalloc_addr(cpu_addr)) 11 + return vmalloc_to_page(cpu_addr); 12 + return virt_to_page(cpu_addr); 13 + } 14 + 15 /* 16 * Create scatter-list for the already allocated DMA buffer. 17 */ ··· 12 void *cpu_addr, dma_addr_t dma_addr, size_t size, 13 unsigned long attrs) 14 { 15 + struct page *page = dma_common_vaddr_to_page(cpu_addr); 16 int ret; 17 18 ret = sg_alloc_table(sgt, 1, GFP_KERNEL); ··· 32 unsigned long user_count = vma_pages(vma); 33 unsigned long count = PAGE_ALIGN(size) >> PAGE_SHIFT; 34 unsigned long off = vma->vm_pgoff; 35 + struct page *page = dma_common_vaddr_to_page(cpu_addr); 36 int ret = -ENXIO; 37 38 vma->vm_page_prot = dma_pgprot(dev, vma->vm_page_prot, attrs); ··· 43 return -ENXIO; 44 45 return remap_pfn_range(vma, vma->vm_start, 46 + page_to_pfn(page) + vma->vm_pgoff, 47 user_count << PAGE_SHIFT, vma->vm_page_prot); 48 #else 49 return -ENXIO;