|
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 |
|