Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'drm-intel-fixes-2021-06-03' of git://anongit.freedesktop.org/drm/drm-intel into drm-fixes

drm/i915 fixes for v5.13-rc5:
- Revert conversion to io_mapping_map_user() which lead to BUG_ON()
- Fix check for error valued returns in a selftest

Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Jani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/87lf7rpcmp.fsf@intel.com

+54 -7
-1
drivers/gpu/drm/i915/Kconfig
··· 20 20 select INPUT if ACPI 21 21 select ACPI_VIDEO if ACPI 22 22 select ACPI_BUTTON if ACPI 23 - select IO_MAPPING 24 23 select SYNC_FILE 25 24 select IOSF_MBI 26 25 select CRC32
+5 -4
drivers/gpu/drm/i915/gem/i915_gem_mman.c
··· 367 367 goto err_unpin; 368 368 369 369 /* Finally, remap it using the new GTT offset */ 370 - ret = io_mapping_map_user(&ggtt->iomap, area, area->vm_start + 371 - (vma->ggtt_view.partial.offset << PAGE_SHIFT), 372 - (ggtt->gmadr.start + vma->node.start) >> PAGE_SHIFT, 373 - min_t(u64, vma->size, area->vm_end - area->vm_start)); 370 + ret = remap_io_mapping(area, 371 + area->vm_start + (vma->ggtt_view.partial.offset << PAGE_SHIFT), 372 + (ggtt->gmadr.start + vma->node.start) >> PAGE_SHIFT, 373 + min_t(u64, vma->size, area->vm_end - area->vm_start), 374 + &ggtt->iomap); 374 375 if (ret) 375 376 goto err_fence; 376 377
+3
drivers/gpu/drm/i915/i915_drv.h
··· 1905 1905 struct drm_file *file); 1906 1906 1907 1907 /* i915_mm.c */ 1908 + int remap_io_mapping(struct vm_area_struct *vma, 1909 + unsigned long addr, unsigned long pfn, unsigned long size, 1910 + struct io_mapping *iomap); 1908 1911 int remap_io_sg(struct vm_area_struct *vma, 1909 1912 unsigned long addr, unsigned long size, 1910 1913 struct scatterlist *sgl, resource_size_t iobase);
+44
drivers/gpu/drm/i915/i915_mm.c
··· 37 37 resource_size_t iobase; 38 38 }; 39 39 40 + static int remap_pfn(pte_t *pte, unsigned long addr, void *data) 41 + { 42 + struct remap_pfn *r = data; 43 + 44 + /* Special PTE are not associated with any struct page */ 45 + set_pte_at(r->mm, addr, pte, pte_mkspecial(pfn_pte(r->pfn, r->prot))); 46 + r->pfn++; 47 + 48 + return 0; 49 + } 50 + 40 51 #define use_dma(io) ((io) != -1) 41 52 42 53 static inline unsigned long sgt_pfn(const struct remap_pfn *r) ··· 77 66 return 0; 78 67 } 79 68 69 + /** 70 + * remap_io_mapping - remap an IO mapping to userspace 71 + * @vma: user vma to map to 72 + * @addr: target user address to start at 73 + * @pfn: physical address of kernel memory 74 + * @size: size of map area 75 + * @iomap: the source io_mapping 76 + * 77 + * Note: this is only safe if the mm semaphore is held when called. 78 + */ 79 + int remap_io_mapping(struct vm_area_struct *vma, 80 + unsigned long addr, unsigned long pfn, unsigned long size, 81 + struct io_mapping *iomap) 82 + { 83 + struct remap_pfn r; 84 + int err; 85 + 80 86 #define EXPECTED_FLAGS (VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP) 87 + GEM_BUG_ON((vma->vm_flags & EXPECTED_FLAGS) != EXPECTED_FLAGS); 88 + 89 + /* We rely on prevalidation of the io-mapping to skip track_pfn(). */ 90 + r.mm = vma->vm_mm; 91 + r.pfn = pfn; 92 + r.prot = __pgprot((pgprot_val(iomap->prot) & _PAGE_CACHE_MASK) | 93 + (pgprot_val(vma->vm_page_prot) & ~_PAGE_CACHE_MASK)); 94 + 95 + err = apply_to_page_range(r.mm, addr, size, remap_pfn, &r); 96 + if (unlikely(err)) { 97 + zap_vma_ptes(vma, addr, (r.pfn - pfn) << PAGE_SHIFT); 98 + return err; 99 + } 100 + 101 + return 0; 102 + } 81 103 82 104 /** 83 105 * remap_io_sg - remap an IO mapping to userspace
+2 -2
drivers/gpu/drm/i915/selftests/i915_request.c
··· 1592 1592 1593 1593 for (n = 0; n < smoke[0].ncontexts; n++) { 1594 1594 smoke[0].contexts[n] = live_context(i915, file); 1595 - if (!smoke[0].contexts[n]) { 1596 - ret = -ENOMEM; 1595 + if (IS_ERR(smoke[0].contexts[n])) { 1596 + ret = PTR_ERR(smoke[0].contexts[n]); 1597 1597 goto out_contexts; 1598 1598 } 1599 1599 }