]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
drm/vmwgfx: Remove explicit transparent hugepages support
authorZack Rusin <zackr@vmware.com>
Wed, 15 Dec 2021 18:41:46 +0000 (13:41 -0500)
committerPaolo Pisati <paolo.pisati@canonical.com>
Fri, 28 Jan 2022 10:03:27 +0000 (11:03 +0100)
BugLink: https://bugs.launchpad.net/bugs/1959376
commit bc701a28c74e78d7b5aa2b8628cb3608d4785d14 upstream.

Old versions of the svga device used to export virtual vram, handling of
which was optimized on top of transparent hugepages support. Only very
old devices (OpenGL 2.1 support and earlier) used this code and at this
point performance differences are negligible.

Because the code requires very old hardware versions to run it has
been largely untested and unused for a long time.

Furthermore removal of the ttm hugepages support in:
commit 0d979509539e ("drm/ttm: remove ttm_bo_vm_insert_huge()")
broke the coherency mode in vmwgfx when running with hugepages.

Fixes: 0d979509539e ("drm/ttm: remove ttm_bo_vm_insert_huge()")
Signed-off-by: Zack Rusin <zackr@vmware.com>
Cc: Jason Gunthorpe <jgg@nvidia.com>
Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Cc: Christian König <christian.koenig@amd.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Reviewed-by: Martin Krastev <krastevm@vmware.com>
Reviewed-by: Maaz Mombasawala <mombasawalam@vmware.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20211215184147.3688785-2-zack@kde.org
(cherry picked from commit 49d535d64d52945e2c874f380705675e20a02b6a)
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Paolo Pisati <paolo.pisati@canonical.com>
drivers/gpu/drm/vmwgfx/Makefile
drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
drivers/gpu/drm/vmwgfx/vmwgfx_thp.c [deleted file]

index 0188a312c38c2aebe88457e20c0f993dabbd0b90..18edc7ca5b4549e0d425d89a7ffc057a5a49b9ec 100644 (file)
@@ -12,6 +12,5 @@ vmwgfx-y := vmwgfx_execbuf.o vmwgfx_gmr.o vmwgfx_kms.o vmwgfx_drv.o \
            vmwgfx_devcaps.o ttm_object.o ttm_memory.o vmwgfx_system_manager.o
 
 vmwgfx-$(CONFIG_DRM_FBDEV_EMULATION) += vmwgfx_fb.o
-vmwgfx-$(CONFIG_TRANSPARENT_HUGEPAGE) += vmwgfx_thp.o
 
 obj-$(CONFIG_DRM_VMWGFX) := vmwgfx.o
index daf65615308adad33ec8b9c11b0edc5d26b8f0e8..8449d09c06f7a42f6cee8df79e32c6ae000f59e4 100644 (file)
@@ -707,23 +707,15 @@ static int vmw_dma_masks(struct vmw_private *dev_priv)
 static int vmw_vram_manager_init(struct vmw_private *dev_priv)
 {
        int ret;
-#ifdef CONFIG_TRANSPARENT_HUGEPAGE
-       ret = vmw_thp_init(dev_priv);
-#else
        ret = ttm_range_man_init(&dev_priv->bdev, TTM_PL_VRAM, false,
                                 dev_priv->vram_size >> PAGE_SHIFT);
-#endif
        ttm_resource_manager_set_used(ttm_manager_type(&dev_priv->bdev, TTM_PL_VRAM), false);
        return ret;
 }
 
 static void vmw_vram_manager_fini(struct vmw_private *dev_priv)
 {
-#ifdef CONFIG_TRANSPARENT_HUGEPAGE
-       vmw_thp_fini(dev_priv);
-#else
        ttm_range_man_fini(&dev_priv->bdev, TTM_PL_VRAM);
-#endif
 }
 
 static int vmw_setup_pci_resources(struct vmw_private *dev,
index 645c18b267e6ecf5dce073ad087b42345ab0ecd2..2b42971f99272835855d000ef48eb78ac793f0fb 100644 (file)
@@ -1557,11 +1557,6 @@ void vmw_bo_dirty_unmap(struct vmw_buffer_object *vbo,
 vm_fault_t vmw_bo_vm_fault(struct vm_fault *vmf);
 vm_fault_t vmw_bo_vm_mkwrite(struct vm_fault *vmf);
 
-/* Transparent hugepage support - vmwgfx_thp.c */
-#ifdef CONFIG_TRANSPARENT_HUGEPAGE
-extern int vmw_thp_init(struct vmw_private *dev_priv);
-void vmw_thp_fini(struct vmw_private *dev_priv);
-#endif
 
 /**
  * VMW_DEBUG_KMS - Debug output for kernel mode-setting
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_thp.c b/drivers/gpu/drm/vmwgfx/vmwgfx_thp.c
deleted file mode 100644 (file)
index 2a3d346..0000000
+++ /dev/null
@@ -1,184 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0 OR MIT
-/*
- * Huge page-table-entry support for IO memory.
- *
- * Copyright (C) 2007-2019 Vmware, Inc. All rights reservedd.
- */
-#include "vmwgfx_drv.h"
-#include <drm/ttm/ttm_bo_driver.h>
-#include <drm/ttm/ttm_placement.h>
-#include <drm/ttm/ttm_range_manager.h>
-
-/**
- * struct vmw_thp_manager - Range manager implementing huge page alignment
- *
- * @manager: TTM resource manager.
- * @mm: The underlying range manager. Protected by @lock.
- * @lock: Manager lock.
- */
-struct vmw_thp_manager {
-       struct ttm_resource_manager manager;
-       struct drm_mm mm;
-       spinlock_t lock;
-};
-
-static struct vmw_thp_manager *to_thp_manager(struct ttm_resource_manager *man)
-{
-       return container_of(man, struct vmw_thp_manager, manager);
-}
-
-static const struct ttm_resource_manager_func vmw_thp_func;
-
-static int vmw_thp_insert_aligned(struct ttm_buffer_object *bo,
-                                 struct drm_mm *mm, struct drm_mm_node *node,
-                                 unsigned long align_pages,
-                                 const struct ttm_place *place,
-                                 struct ttm_resource *mem,
-                                 unsigned long lpfn,
-                                 enum drm_mm_insert_mode mode)
-{
-       if (align_pages >= bo->page_alignment &&
-           (!bo->page_alignment || align_pages % bo->page_alignment == 0)) {
-               return drm_mm_insert_node_in_range(mm, node,
-                                                  mem->num_pages,
-                                                  align_pages, 0,
-                                                  place->fpfn, lpfn, mode);
-       }
-
-       return -ENOSPC;
-}
-
-static int vmw_thp_get_node(struct ttm_resource_manager *man,
-                           struct ttm_buffer_object *bo,
-                           const struct ttm_place *place,
-                           struct ttm_resource **res)
-{
-       struct vmw_thp_manager *rman = to_thp_manager(man);
-       struct drm_mm *mm = &rman->mm;
-       struct ttm_range_mgr_node *node;
-       unsigned long align_pages;
-       unsigned long lpfn;
-       enum drm_mm_insert_mode mode = DRM_MM_INSERT_BEST;
-       int ret;
-
-       node = kzalloc(struct_size(node, mm_nodes, 1), GFP_KERNEL);
-       if (!node)
-               return -ENOMEM;
-
-       ttm_resource_init(bo, place, &node->base);
-
-       lpfn = place->lpfn;
-       if (!lpfn)
-               lpfn = man->size;
-
-       mode = DRM_MM_INSERT_BEST;
-       if (place->flags & TTM_PL_FLAG_TOPDOWN)
-               mode = DRM_MM_INSERT_HIGH;
-
-       spin_lock(&rman->lock);
-       if (IS_ENABLED(CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD)) {
-               align_pages = (HPAGE_PUD_SIZE >> PAGE_SHIFT);
-               if (node->base.num_pages >= align_pages) {
-                       ret = vmw_thp_insert_aligned(bo, mm, &node->mm_nodes[0],
-                                                    align_pages, place,
-                                                    &node->base, lpfn, mode);
-                       if (!ret)
-                               goto found_unlock;
-               }
-       }
-
-       align_pages = (HPAGE_PMD_SIZE >> PAGE_SHIFT);
-       if (node->base.num_pages >= align_pages) {
-               ret = vmw_thp_insert_aligned(bo, mm, &node->mm_nodes[0],
-                                            align_pages, place, &node->base,
-                                            lpfn, mode);
-               if (!ret)
-                       goto found_unlock;
-       }
-
-       ret = drm_mm_insert_node_in_range(mm, &node->mm_nodes[0],
-                                         node->base.num_pages,
-                                         bo->page_alignment, 0,
-                                         place->fpfn, lpfn, mode);
-found_unlock:
-       spin_unlock(&rman->lock);
-
-       if (unlikely(ret)) {
-               kfree(node);
-       } else {
-               node->base.start = node->mm_nodes[0].start;
-               *res = &node->base;
-       }
-
-       return ret;
-}
-
-static void vmw_thp_put_node(struct ttm_resource_manager *man,
-                            struct ttm_resource *res)
-{
-       struct ttm_range_mgr_node *node = to_ttm_range_mgr_node(res);
-       struct vmw_thp_manager *rman = to_thp_manager(man);
-
-       spin_lock(&rman->lock);
-       drm_mm_remove_node(&node->mm_nodes[0]);
-       spin_unlock(&rman->lock);
-
-       kfree(node);
-}
-
-int vmw_thp_init(struct vmw_private *dev_priv)
-{
-       struct vmw_thp_manager *rman;
-
-       rman = kzalloc(sizeof(*rman), GFP_KERNEL);
-       if (!rman)
-               return -ENOMEM;
-
-       ttm_resource_manager_init(&rman->manager,
-                                 dev_priv->vram_size >> PAGE_SHIFT);
-
-       rman->manager.func = &vmw_thp_func;
-       drm_mm_init(&rman->mm, 0, rman->manager.size);
-       spin_lock_init(&rman->lock);
-
-       ttm_set_driver_manager(&dev_priv->bdev, TTM_PL_VRAM, &rman->manager);
-       ttm_resource_manager_set_used(&rman->manager, true);
-       return 0;
-}
-
-void vmw_thp_fini(struct vmw_private *dev_priv)
-{
-       struct ttm_resource_manager *man = ttm_manager_type(&dev_priv->bdev, TTM_PL_VRAM);
-       struct vmw_thp_manager *rman = to_thp_manager(man);
-       struct drm_mm *mm = &rman->mm;
-       int ret;
-
-       ttm_resource_manager_set_used(man, false);
-
-       ret = ttm_resource_manager_evict_all(&dev_priv->bdev, man);
-       if (ret)
-               return;
-       spin_lock(&rman->lock);
-       drm_mm_clean(mm);
-       drm_mm_takedown(mm);
-       spin_unlock(&rman->lock);
-       ttm_resource_manager_cleanup(man);
-       ttm_set_driver_manager(&dev_priv->bdev, TTM_PL_VRAM, NULL);
-       kfree(rman);
-}
-
-static void vmw_thp_debug(struct ttm_resource_manager *man,
-                         struct drm_printer *printer)
-{
-       struct vmw_thp_manager *rman = to_thp_manager(man);
-
-       spin_lock(&rman->lock);
-       drm_mm_print(&rman->mm, printer);
-       spin_unlock(&rman->lock);
-}
-
-static const struct ttm_resource_manager_func vmw_thp_func = {
-       .alloc = vmw_thp_get_node,
-       .free = vmw_thp_put_node,
-       .debug = vmw_thp_debug
-};