Takashi Iwai 905ca9
From 0d979509539ed1df883a30d442177ca7be609565 Mon Sep 17 00:00:00 2001
Takashi Iwai 905ca9
From: Jason Gunthorpe <jgg@nvidia.com>
Takashi Iwai 905ca9
Date: Tue, 19 Oct 2021 20:27:31 -0300
Takashi Iwai 905ca9
Subject: [PATCH] drm/ttm: remove ttm_bo_vm_insert_huge()
Takashi Iwai 905ca9
Mime-version: 1.0
Takashi Iwai 905ca9
Content-type: text/plain; charset=UTF-8
Takashi Iwai 905ca9
Content-transfer-encoding: 8bit
Takashi Iwai 905ca9
Git-commit: 0d979509539ed1df883a30d442177ca7be609565
Takashi Iwai 905ca9
Patch-mainline: v5.16-rc1
Takashi Iwai 001336
References: git-fixes stable-5.14.19
Takashi Iwai 905ca9
Takashi Iwai 905ca9
The huge page functionality in TTM does not work safely because PUD and
Takashi Iwai 905ca9
PMD entries do not have a special bit.
Takashi Iwai 905ca9
Takashi Iwai 905ca9
get_user_pages_fast() considers any page that passed pmd_huge() as
Takashi Iwai 905ca9
Usable: 
Takashi Iwai 905ca9
Takashi Iwai 905ca9
	if (unlikely(pmd_trans_huge(pmd) || pmd_huge(pmd) ||
Takashi Iwai 905ca9
		     pmd_devmap(pmd))) {
Takashi Iwai 905ca9
Takashi Iwai 905ca9
And vmf_insert_pfn_pmd_prot() unconditionally sets
Takashi Iwai 905ca9
Takashi Iwai 905ca9
	entry = pmd_mkhuge(pfn_t_pmd(pfn, prot));
Takashi Iwai 905ca9
Takashi Iwai 905ca9
eg on x86 the page will be _PAGE_PRESENT | PAGE_PSE.
Takashi Iwai 905ca9
Takashi Iwai 905ca9
As such gup_huge_pmd() will try to deref a struct page:
Takashi Iwai 905ca9
Takashi Iwai 905ca9
	head = try_grab_compound_head(pmd_page(orig), refs, flags);
Takashi Iwai 905ca9
Takashi Iwai 905ca9
and thus crash.
Takashi Iwai 905ca9
Takashi Iwai 905ca9
Thomas further notices that the drivers are not expecting the struct page
Takashi Iwai 905ca9
to be used by anything - in particular the refcount incr above will cause
Takashi Iwai 905ca9
them to malfunction.
Takashi Iwai 905ca9
Takashi Iwai 905ca9
Thus everything about this is not able to fully work correctly considering
Takashi Iwai 905ca9
GUP_fast. Delete it entirely. It can return someday along with a proper
Takashi Iwai 905ca9
PMD/PUD_SPECIAL bit in the page table itself to gate GUP_fast.
Takashi Iwai 905ca9
Takashi Iwai 905ca9
Fixes: 314b6580adc5 ("drm/ttm, drm/vmwgfx: Support huge TTM pagefaults")
Takashi Iwai 905ca9
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Takashi Iwai 905ca9
Reviewed-by: Thomas Hellström <thomas.helllstrom@linux.intel.com>
Takashi Iwai 905ca9
Reviewed-by: Christian König <christian.koenig@amd.com>
Takashi Iwai 905ca9
[danvet: Update subject per Thomas' &Christian's review]
Takashi Iwai 905ca9
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Takashi Iwai 905ca9
Link: https://patchwork.freedesktop.org/patch/msgid/0-v2-a44694790652+4ac-ttm_pmd_jgg@nvidia.com
Takashi Iwai 905ca9
Acked-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai 905ca9
Takashi Iwai 905ca9
---
Takashi Iwai 905ca9
 drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c    |  2 +-
Takashi Iwai 905ca9
 drivers/gpu/drm/nouveau/nouveau_gem.c      |  2 +-
Takashi Iwai 905ca9
 drivers/gpu/drm/radeon/radeon_gem.c        |  2 +-
Takashi Iwai 905ca9
 drivers/gpu/drm/ttm/ttm_bo_vm.c            | 94 +---------------------
Takashi Iwai 905ca9
 drivers/gpu/drm/vmwgfx/vmwgfx_drv.h        |  4 -
Takashi Iwai 905ca9
 drivers/gpu/drm/vmwgfx/vmwgfx_page_dirty.c | 72 +----------------
Takashi Iwai 905ca9
 drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c   |  3 -
Takashi Iwai 905ca9
 include/drm/ttm/ttm_bo_api.h               |  3 +-
Takashi Iwai 905ca9
 8 files changed, 7 insertions(+), 175 deletions(-)
Takashi Iwai 905ca9
Takashi Iwai 905ca9
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
Takashi Iwai 905ca9
index d6aa032890ee..a1e63ba4c54a 100644
Takashi Iwai 905ca9
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
Takashi Iwai 905ca9
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
Takashi Iwai 905ca9
@@ -61,7 +61,7 @@ static vm_fault_t amdgpu_gem_fault(struct vm_fault *vmf)
Takashi Iwai 905ca9
 		}
Takashi Iwai 905ca9
 
Takashi Iwai 905ca9
 		 ret = ttm_bo_vm_fault_reserved(vmf, vmf->vma->vm_page_prot,
Takashi Iwai 905ca9
-						TTM_BO_VM_NUM_PREFAULT, 1);
Takashi Iwai 905ca9
+						TTM_BO_VM_NUM_PREFAULT);
Takashi Iwai 905ca9
 
Takashi Iwai 905ca9
 		 drm_dev_exit(idx);
Takashi Iwai 905ca9
 	} else {
Takashi Iwai 905ca9
diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c
Takashi Iwai 905ca9
index d476940ee97c..beeafb3bb266 100644
Takashi Iwai 905ca9
--- a/drivers/gpu/drm/nouveau/nouveau_gem.c
Takashi Iwai 905ca9
+++ b/drivers/gpu/drm/nouveau/nouveau_gem.c
Takashi Iwai 905ca9
@@ -56,7 +56,7 @@ static vm_fault_t nouveau_ttm_fault(struct vm_fault *vmf)
Takashi Iwai 905ca9
 
Takashi Iwai 905ca9
 	nouveau_bo_del_io_reserve_lru(bo);
Takashi Iwai 905ca9
 	prot = vm_get_page_prot(vma->vm_flags);
Takashi Iwai 905ca9
-	ret = ttm_bo_vm_fault_reserved(vmf, prot, TTM_BO_VM_NUM_PREFAULT, 1);
Takashi Iwai 905ca9
+	ret = ttm_bo_vm_fault_reserved(vmf, prot, TTM_BO_VM_NUM_PREFAULT);
Takashi Iwai 905ca9
 	nouveau_bo_add_io_reserve_lru(bo);
Takashi Iwai 905ca9
 	if (ret == VM_FAULT_RETRY && !(vmf->flags & FAULT_FLAG_RETRY_NOWAIT))
Takashi Iwai 905ca9
 		return ret;
Takashi Iwai 905ca9
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c
Takashi Iwai 905ca9
index 458f92a70887..a36a4f2c76b0 100644
Takashi Iwai 905ca9
--- a/drivers/gpu/drm/radeon/radeon_gem.c
Takashi Iwai 905ca9
+++ b/drivers/gpu/drm/radeon/radeon_gem.c
Takashi Iwai 905ca9
@@ -61,7 +61,7 @@ static vm_fault_t radeon_gem_fault(struct vm_fault *vmf)
Takashi Iwai 905ca9
 		goto unlock_resv;
Takashi Iwai 905ca9
 
Takashi Iwai 905ca9
 	ret = ttm_bo_vm_fault_reserved(vmf, vmf->vma->vm_page_prot,
Takashi Iwai 905ca9
-				       TTM_BO_VM_NUM_PREFAULT, 1);
Takashi Iwai 905ca9
+				       TTM_BO_VM_NUM_PREFAULT);
Takashi Iwai 905ca9
 	if (ret == VM_FAULT_RETRY && !(vmf->flags & FAULT_FLAG_RETRY_NOWAIT))
Takashi Iwai 905ca9
 		goto unlock_mclk;
Takashi Iwai 905ca9
 
Takashi Iwai 905ca9
diff --git a/drivers/gpu/drm/ttm/ttm_bo_vm.c b/drivers/gpu/drm/ttm/ttm_bo_vm.c
Takashi Iwai 905ca9
index 33680c94127c..08ba083a80d2 100644
Takashi Iwai 905ca9
--- a/drivers/gpu/drm/ttm/ttm_bo_vm.c
Takashi Iwai 905ca9
+++ b/drivers/gpu/drm/ttm/ttm_bo_vm.c
Takashi Iwai 905ca9
@@ -173,89 +173,6 @@ vm_fault_t ttm_bo_vm_reserve(struct ttm_buffer_object *bo,
Takashi Iwai 905ca9
 }
Takashi Iwai 905ca9
 EXPORT_SYMBOL(ttm_bo_vm_reserve);
Takashi Iwai 905ca9
 
Takashi Iwai 905ca9
-#ifdef CONFIG_TRANSPARENT_HUGEPAGE
Takashi Iwai 905ca9
-/**
Takashi Iwai 905ca9
- * ttm_bo_vm_insert_huge - Insert a pfn for PUD or PMD faults
Takashi Iwai 905ca9
- * @vmf: Fault data
Takashi Iwai 905ca9
- * @bo: The buffer object
Takashi Iwai 905ca9
- * @page_offset: Page offset from bo start
Takashi Iwai 905ca9
- * @fault_page_size: The size of the fault in pages.
Takashi Iwai 905ca9
- * @pgprot: The page protections.
Takashi Iwai 905ca9
- * Does additional checking whether it's possible to insert a PUD or PMD
Takashi Iwai 905ca9
- * pfn and performs the insertion.
Takashi Iwai 905ca9
- *
Takashi Iwai 905ca9
- * Return: VM_FAULT_NOPAGE on successful insertion, VM_FAULT_FALLBACK if
Takashi Iwai 905ca9
- * a huge fault was not possible, or on insertion error.
Takashi Iwai 905ca9
- */
Takashi Iwai 905ca9
-static vm_fault_t ttm_bo_vm_insert_huge(struct vm_fault *vmf,
Takashi Iwai 905ca9
-					struct ttm_buffer_object *bo,
Takashi Iwai 905ca9
-					pgoff_t page_offset,
Takashi Iwai 905ca9
-					pgoff_t fault_page_size,
Takashi Iwai 905ca9
-					pgprot_t pgprot)
Takashi Iwai 905ca9
-{
Takashi Iwai 905ca9
-	pgoff_t i;
Takashi Iwai 905ca9
-	vm_fault_t ret;
Takashi Iwai 905ca9
-	unsigned long pfn;
Takashi Iwai 905ca9
-	pfn_t pfnt;
Takashi Iwai 905ca9
-	struct ttm_tt *ttm = bo->ttm;
Takashi Iwai 905ca9
-	bool write = vmf->flags & FAULT_FLAG_WRITE;
Takashi Iwai 905ca9
-
Takashi Iwai 905ca9
-	/* Fault should not cross bo boundary. */
Takashi Iwai 905ca9
-	page_offset &= ~(fault_page_size - 1);
Takashi Iwai 905ca9
-	if (page_offset + fault_page_size > bo->resource->num_pages)
Takashi Iwai 905ca9
-		goto out_fallback;
Takashi Iwai 905ca9
-
Takashi Iwai 905ca9
-	if (bo->resource->bus.is_iomem)
Takashi Iwai 905ca9
-		pfn = ttm_bo_io_mem_pfn(bo, page_offset);
Takashi Iwai 905ca9
-	else
Takashi Iwai 905ca9
-		pfn = page_to_pfn(ttm->pages[page_offset]);
Takashi Iwai 905ca9
-
Takashi Iwai 905ca9
-	/* pfn must be fault_page_size aligned. */
Takashi Iwai 905ca9
-	if ((pfn & (fault_page_size - 1)) != 0)
Takashi Iwai 905ca9
-		goto out_fallback;
Takashi Iwai 905ca9
-
Takashi Iwai 905ca9
-	/* Check that memory is contiguous. */
Takashi Iwai 905ca9
-	if (!bo->resource->bus.is_iomem) {
Takashi Iwai 905ca9
-		for (i = 1; i < fault_page_size; ++i) {
Takashi Iwai 905ca9
-			if (page_to_pfn(ttm->pages[page_offset + i]) != pfn + i)
Takashi Iwai 905ca9
-				goto out_fallback;
Takashi Iwai 905ca9
-		}
Takashi Iwai 905ca9
-	} else if (bo->bdev->funcs->io_mem_pfn) {
Takashi Iwai 905ca9
-		for (i = 1; i < fault_page_size; ++i) {
Takashi Iwai 905ca9
-			if (ttm_bo_io_mem_pfn(bo, page_offset + i) != pfn + i)
Takashi Iwai 905ca9
-				goto out_fallback;
Takashi Iwai 905ca9
-		}
Takashi Iwai 905ca9
-	}
Takashi Iwai 905ca9
-
Takashi Iwai 905ca9
-	pfnt = __pfn_to_pfn_t(pfn, PFN_DEV);
Takashi Iwai 905ca9
-	if (fault_page_size == (HPAGE_PMD_SIZE >> PAGE_SHIFT))
Takashi Iwai 905ca9
-		ret = vmf_insert_pfn_pmd_prot(vmf, pfnt, pgprot, write);
Takashi Iwai 905ca9
-#ifdef CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD
Takashi Iwai 905ca9
-	else if (fault_page_size == (HPAGE_PUD_SIZE >> PAGE_SHIFT))
Takashi Iwai 905ca9
-		ret = vmf_insert_pfn_pud_prot(vmf, pfnt, pgprot, write);
Takashi Iwai 905ca9
-#endif
Takashi Iwai 905ca9
-	else
Takashi Iwai 905ca9
-		WARN_ON_ONCE(ret = VM_FAULT_FALLBACK);
Takashi Iwai 905ca9
-
Takashi Iwai 905ca9
-	if (ret != VM_FAULT_NOPAGE)
Takashi Iwai 905ca9
-		goto out_fallback;
Takashi Iwai 905ca9
-
Takashi Iwai 905ca9
-	return VM_FAULT_NOPAGE;
Takashi Iwai 905ca9
-out_fallback:
Takashi Iwai 905ca9
-	count_vm_event(THP_FAULT_FALLBACK);
Takashi Iwai 905ca9
-	return VM_FAULT_FALLBACK;
Takashi Iwai 905ca9
-}
Takashi Iwai 905ca9
-#else
Takashi Iwai 905ca9
-static vm_fault_t ttm_bo_vm_insert_huge(struct vm_fault *vmf,
Takashi Iwai 905ca9
-					struct ttm_buffer_object *bo,
Takashi Iwai 905ca9
-					pgoff_t page_offset,
Takashi Iwai 905ca9
-					pgoff_t fault_page_size,
Takashi Iwai 905ca9
-					pgprot_t pgprot)
Takashi Iwai 905ca9
-{
Takashi Iwai 905ca9
-	return VM_FAULT_FALLBACK;
Takashi Iwai 905ca9
-}
Takashi Iwai 905ca9
-#endif
Takashi Iwai 905ca9
-
Takashi Iwai 905ca9
 /**
Takashi Iwai 905ca9
  * ttm_bo_vm_fault_reserved - TTM fault helper
Takashi Iwai 905ca9
  * @vmf: The struct vm_fault given as argument to the fault callback
Takashi Iwai 905ca9
@@ -263,7 +180,6 @@ static vm_fault_t ttm_bo_vm_insert_huge(struct vm_fault *vmf,
Takashi Iwai 905ca9
  * @num_prefault: Maximum number of prefault pages. The caller may want to
Takashi Iwai 905ca9
  * specify this based on madvice settings and the size of the GPU object
Takashi Iwai 905ca9
  * backed by the memory.
Takashi Iwai 905ca9
- * @fault_page_size: The size of the fault in pages.
Takashi Iwai 905ca9
  *
Takashi Iwai 905ca9
  * This function inserts one or more page table entries pointing to the
Takashi Iwai 905ca9
  * memory backing the buffer object, and then returns a return code
Takashi Iwai 905ca9
@@ -277,8 +193,7 @@ static vm_fault_t ttm_bo_vm_insert_huge(struct vm_fault *vmf,
Takashi Iwai 905ca9
  */
Takashi Iwai 905ca9
 vm_fault_t ttm_bo_vm_fault_reserved(struct vm_fault *vmf,
Takashi Iwai 905ca9
 				    pgprot_t prot,
Takashi Iwai 905ca9
-				    pgoff_t num_prefault,
Takashi Iwai 905ca9
-				    pgoff_t fault_page_size)
Takashi Iwai 905ca9
+				    pgoff_t num_prefault)
Takashi Iwai 905ca9
 {
Takashi Iwai 905ca9
 	struct vm_area_struct *vma = vmf->vma;
Takashi Iwai 905ca9
 	struct ttm_buffer_object *bo = vma->vm_private_data;
Takashi Iwai 905ca9
@@ -329,11 +244,6 @@ vm_fault_t ttm_bo_vm_fault_reserved(struct vm_fault *vmf,
Takashi Iwai 905ca9
 		prot = pgprot_decrypted(prot);
Takashi Iwai 905ca9
 	}
Takashi Iwai 905ca9
 
Takashi Iwai 905ca9
-	/* We don't prefault on huge faults. Yet. */
Takashi Iwai 905ca9
-	if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE) && fault_page_size != 1)
Takashi Iwai 905ca9
-		return ttm_bo_vm_insert_huge(vmf, bo, page_offset,
Takashi Iwai 905ca9
-					     fault_page_size, prot);
Takashi Iwai 905ca9
-
Takashi Iwai 905ca9
 	/*
Takashi Iwai 905ca9
 	 * Speculatively prefault a number of pages. Only error on
Takashi Iwai 905ca9
 	 * first page.
Takashi Iwai 905ca9
@@ -429,7 +339,7 @@ vm_fault_t ttm_bo_vm_fault(struct vm_fault *vmf)
Takashi Iwai 905ca9
 
Takashi Iwai 905ca9
 	prot = vma->vm_page_prot;
Takashi Iwai 905ca9
 	if (drm_dev_enter(ddev, &idx)) {
Takashi Iwai 905ca9
-		ret = ttm_bo_vm_fault_reserved(vmf, prot, TTM_BO_VM_NUM_PREFAULT, 1);
Takashi Iwai 905ca9
+		ret = ttm_bo_vm_fault_reserved(vmf, prot, TTM_BO_VM_NUM_PREFAULT);
Takashi Iwai 905ca9
 		drm_dev_exit(idx);
Takashi Iwai 905ca9
 	} else {
Takashi Iwai 905ca9
 		ret = ttm_bo_vm_dummy_page(vmf, prot);
Takashi Iwai 905ca9
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
Takashi Iwai 905ca9
index a833751099b5..858aff99a3fe 100644
Takashi Iwai 905ca9
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
Takashi Iwai 905ca9
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
Takashi Iwai 905ca9
@@ -1550,10 +1550,6 @@ void vmw_bo_dirty_unmap(struct vmw_buffer_object *vbo,
Takashi Iwai 905ca9
 			pgoff_t start, pgoff_t end);
Takashi Iwai 905ca9
 vm_fault_t vmw_bo_vm_fault(struct vm_fault *vmf);
Takashi Iwai 905ca9
 vm_fault_t vmw_bo_vm_mkwrite(struct vm_fault *vmf);
Takashi Iwai 905ca9
-#ifdef CONFIG_TRANSPARENT_HUGEPAGE
Takashi Iwai 905ca9
-vm_fault_t vmw_bo_vm_huge_fault(struct vm_fault *vmf,
Takashi Iwai 905ca9
-				enum page_entry_size pe_size);
Takashi Iwai 905ca9
-#endif
Takashi Iwai 905ca9
 
Takashi Iwai 905ca9
 /* Transparent hugepage support - vmwgfx_thp.c */
Takashi Iwai 905ca9
 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
Takashi Iwai 905ca9
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_page_dirty.c b/drivers/gpu/drm/vmwgfx/vmwgfx_page_dirty.c
Takashi Iwai 905ca9
index e5a9a5cbd01a..922317d1acc8 100644
Takashi Iwai 905ca9
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_page_dirty.c
Takashi Iwai 905ca9
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_page_dirty.c
Takashi Iwai 905ca9
@@ -477,7 +477,7 @@ vm_fault_t vmw_bo_vm_fault(struct vm_fault *vmf)
Takashi Iwai 905ca9
 	else
Takashi Iwai 905ca9
 		prot = vm_get_page_prot(vma->vm_flags);
Takashi Iwai 905ca9
 
Takashi Iwai 905ca9
-	ret = ttm_bo_vm_fault_reserved(vmf, prot, num_prefault, 1);
Takashi Iwai 905ca9
+	ret = ttm_bo_vm_fault_reserved(vmf, prot, num_prefault);
Takashi Iwai 905ca9
 	if (ret == VM_FAULT_RETRY && !(vmf->flags & FAULT_FLAG_RETRY_NOWAIT))
Takashi Iwai 905ca9
 		return ret;
Takashi Iwai 905ca9
 
Takashi Iwai 905ca9
@@ -486,73 +486,3 @@ vm_fault_t vmw_bo_vm_fault(struct vm_fault *vmf)
Takashi Iwai 905ca9
 
Takashi Iwai 905ca9
 	return ret;
Takashi Iwai 905ca9
 }
Takashi Iwai 905ca9
-
Takashi Iwai 905ca9
-#ifdef CONFIG_TRANSPARENT_HUGEPAGE
Takashi Iwai 905ca9
-vm_fault_t vmw_bo_vm_huge_fault(struct vm_fault *vmf,
Takashi Iwai 905ca9
-				enum page_entry_size pe_size)
Takashi Iwai 905ca9
-{
Takashi Iwai 905ca9
-	struct vm_area_struct *vma = vmf->vma;
Takashi Iwai 905ca9
-	struct ttm_buffer_object *bo = (struct ttm_buffer_object *)
Takashi Iwai 905ca9
-	    vma->vm_private_data;
Takashi Iwai 905ca9
-	struct vmw_buffer_object *vbo =
Takashi Iwai 905ca9
-		container_of(bo, struct vmw_buffer_object, base);
Takashi Iwai 905ca9
-	pgprot_t prot;
Takashi Iwai 905ca9
-	vm_fault_t ret;
Takashi Iwai 905ca9
-	pgoff_t fault_page_size;
Takashi Iwai 905ca9
-	bool write = vmf->flags & FAULT_FLAG_WRITE;
Takashi Iwai 905ca9
-
Takashi Iwai 905ca9
-	switch (pe_size) {
Takashi Iwai 905ca9
-	case PE_SIZE_PMD:
Takashi Iwai 905ca9
-		fault_page_size = HPAGE_PMD_SIZE >> PAGE_SHIFT;
Takashi Iwai 905ca9
-		break;
Takashi Iwai 905ca9
-#ifdef CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD
Takashi Iwai 905ca9
-	case PE_SIZE_PUD:
Takashi Iwai 905ca9
-		fault_page_size = HPAGE_PUD_SIZE >> PAGE_SHIFT;
Takashi Iwai 905ca9
-		break;
Takashi Iwai 905ca9
-#endif
Takashi Iwai 905ca9
-	default:
Takashi Iwai 905ca9
-		WARN_ON_ONCE(1);
Takashi Iwai 905ca9
-		return VM_FAULT_FALLBACK;
Takashi Iwai 905ca9
-	}
Takashi Iwai 905ca9
-
Takashi Iwai 905ca9
-	/* Always do write dirty-tracking and COW on PTE level. */
Takashi Iwai 905ca9
-	if (write && (READ_ONCE(vbo->dirty) || is_cow_mapping(vma->vm_flags)))
Takashi Iwai 905ca9
-		return VM_FAULT_FALLBACK;
Takashi Iwai 905ca9
-
Takashi Iwai 905ca9
-	ret = ttm_bo_vm_reserve(bo, vmf);
Takashi Iwai 905ca9
-	if (ret)
Takashi Iwai 905ca9
-		return ret;
Takashi Iwai 905ca9
-
Takashi Iwai 905ca9
-	if (vbo->dirty) {
Takashi Iwai 905ca9
-		pgoff_t allowed_prefault;
Takashi Iwai 905ca9
-		unsigned long page_offset;
Takashi Iwai 905ca9
-
Takashi Iwai 905ca9
-		page_offset = vmf->pgoff -
Takashi Iwai 905ca9
-			drm_vma_node_start(&bo->base.vma_node);
Takashi Iwai 905ca9
-		if (page_offset >= bo->resource->num_pages ||
Takashi Iwai 905ca9
-		    vmw_resources_clean(vbo, page_offset,
Takashi Iwai 905ca9
-					page_offset + PAGE_SIZE,
Takashi Iwai 905ca9
-					&allowed_prefault)) {
Takashi Iwai 905ca9
-			ret = VM_FAULT_SIGBUS;
Takashi Iwai 905ca9
-			goto out_unlock;
Takashi Iwai 905ca9
-		}
Takashi Iwai 905ca9
-
Takashi Iwai 905ca9
-		/*
Takashi Iwai 905ca9
-		 * Write protect, so we get a new fault on write, and can
Takashi Iwai 905ca9
-		 * split.
Takashi Iwai 905ca9
-		 */
Takashi Iwai 905ca9
-		prot = vm_get_page_prot(vma->vm_flags & ~VM_SHARED);
Takashi Iwai 905ca9
-	} else {
Takashi Iwai 905ca9
-		prot = vm_get_page_prot(vma->vm_flags);
Takashi Iwai 905ca9
-	}
Takashi Iwai 905ca9
-
Takashi Iwai 905ca9
-	ret = ttm_bo_vm_fault_reserved(vmf, prot, 1, fault_page_size);
Takashi Iwai 905ca9
-	if (ret == VM_FAULT_RETRY && !(vmf->flags & FAULT_FLAG_RETRY_NOWAIT))
Takashi Iwai 905ca9
-		return ret;
Takashi Iwai 905ca9
-
Takashi Iwai 905ca9
-out_unlock:
Takashi Iwai 905ca9
-	dma_resv_unlock(bo->base.resv);
Takashi Iwai 905ca9
-
Takashi Iwai 905ca9
-	return ret;
Takashi Iwai 905ca9
-}
Takashi Iwai 905ca9
-#endif
Takashi Iwai 905ca9
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
Takashi Iwai 905ca9
index e6b1f98ec99f..0a4c340252ec 100644
Takashi Iwai 905ca9
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
Takashi Iwai 905ca9
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_glue.c
Takashi Iwai 905ca9
@@ -61,9 +61,6 @@ int vmw_mmap(struct file *filp, struct vm_area_struct *vma)
Takashi Iwai 905ca9
 		.fault = vmw_bo_vm_fault,
Takashi Iwai 905ca9
 		.open = ttm_bo_vm_open,
Takashi Iwai 905ca9
 		.close = ttm_bo_vm_close,
Takashi Iwai 905ca9
-#ifdef CONFIG_TRANSPARENT_HUGEPAGE
Takashi Iwai 905ca9
-		.huge_fault = vmw_bo_vm_huge_fault,
Takashi Iwai 905ca9
-#endif
Takashi Iwai 905ca9
 	};
Takashi Iwai 905ca9
 	struct drm_file *file_priv = filp->private_data;
Takashi Iwai 905ca9
 	struct vmw_private *dev_priv = vmw_priv(file_priv->minor->dev);
Takashi Iwai 905ca9
diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h
Takashi Iwai 905ca9
index 0551e2587f14..cd785cfa3123 100644
Takashi Iwai 905ca9
--- a/include/drm/ttm/ttm_bo_api.h
Takashi Iwai 905ca9
+++ b/include/drm/ttm/ttm_bo_api.h
Takashi Iwai 905ca9
@@ -584,8 +584,7 @@ vm_fault_t ttm_bo_vm_reserve(struct ttm_buffer_object *bo,
Takashi Iwai 905ca9
 
Takashi Iwai 905ca9
 vm_fault_t ttm_bo_vm_fault_reserved(struct vm_fault *vmf,
Takashi Iwai 905ca9
 				    pgprot_t prot,
Takashi Iwai 905ca9
-				    pgoff_t num_prefault,
Takashi Iwai 905ca9
-				    pgoff_t fault_page_size);
Takashi Iwai 905ca9
+				    pgoff_t num_prefault);
Takashi Iwai 905ca9
 
Takashi Iwai 905ca9
 vm_fault_t ttm_bo_vm_fault(struct vm_fault *vmf);
Takashi Iwai 905ca9
 
Takashi Iwai 905ca9
-- 
Takashi Iwai 905ca9
2.26.2
Takashi Iwai 905ca9