]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm, drm/xe: Fix xe userptr in the absence of CONFIG_DEVICE_PRIVATE
authorThomas Hellström <thomas.hellstrom@linux.intel.com>
Wed, 21 Jan 2026 09:10:47 +0000 (10:10 +0100)
committerThomas Hellström <thomas.hellstrom@linux.intel.com>
Thu, 22 Jan 2026 08:56:27 +0000 (09:56 +0100)
CONFIG_DEVICE_PRIVATE is not selected by default by some distros,
for example Fedora, and that leads to a regression in the xe driver
since userptr support gets compiled out.

It turns out that DRM_GPUSVM, which is needed for xe userptr support
compiles also without CONFIG_DEVICE_PRIVATE, but doesn't compile
without CONFIG_ZONE_DEVICE.
Exclude the drm_pagemap files from compilation with !CONFIG_ZONE_DEVICE,
and remove the CONFIG_DEVICE_PRIVATE dependency from CONFIG_DRM_GPUSVM and
the xe driver's selection of it, re-enabling xe userptr for those configs.

v2:
- Don't compile the drm_pagemap files unless CONFIG_ZONE_DEVICE is set.
- Adjust the drm_pagemap.h header accordingly.

Fixes: 9e9787414882 ("drm/xe/userptr: replace xe_hmm with gpusvm")
Cc: Matthew Auld <matthew.auld@intel.com>
Cc: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Cc: "Thomas Hellström" <thomas.hellstrom@linux.intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: dri-devel@lists.freedesktop.org
Cc: <stable@vger.kernel.org> # v6.18+
Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Acked-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: https://patch.msgid.link/20260121091048.41371-2-thomas.hellstrom@linux.intel.com
drivers/gpu/drm/Kconfig
drivers/gpu/drm/Makefile
drivers/gpu/drm/xe/Kconfig
include/drm/drm_pagemap.h

index a33b902515302f4ac20600a053693d5af7233386..d3d52310c9cc150a0389d47ba9488d59cdea2d85 100644 (file)
@@ -210,7 +210,7 @@ config DRM_GPUVM
 
 config DRM_GPUSVM
        tristate
-       depends on DRM && DEVICE_PRIVATE
+       depends on DRM
        select HMM_MIRROR
        select MMU_NOTIFIER
        help
index 0deee72ef9358afa7f95b71dbf8c479f72df7f5b..0c21029c446fd36bc0c8213e8c4a2cedbb14e174 100644 (file)
@@ -108,9 +108,11 @@ obj-$(CONFIG_DRM_EXEC) += drm_exec.o
 obj-$(CONFIG_DRM_GPUVM) += drm_gpuvm.o
 
 drm_gpusvm_helper-y := \
-       drm_gpusvm.o\
+       drm_gpusvm.o
+drm_gpusvm_helper-$(CONFIG_ZONE_DEVICE) += \
        drm_pagemap.o\
        drm_pagemap_util.o
+
 obj-$(CONFIG_DRM_GPUSVM) += drm_gpusvm_helper.o
 
 obj-$(CONFIG_DRM_BUDDY) += drm_buddy.o
index 4b288eb3f5b0e5c0489f9e7301cad22459d8ef0a..c34be1be155b39aef9afd404214e93c4fe8b334d 100644 (file)
@@ -39,7 +39,7 @@ config DRM_XE
        select DRM_TTM
        select DRM_TTM_HELPER
        select DRM_EXEC
-       select DRM_GPUSVM if !UML && DEVICE_PRIVATE
+       select DRM_GPUSVM if !UML
        select DRM_GPUVM
        select DRM_SCHED
        select MMU_NOTIFIER
index 46e9c58f09e01683eab4a1a57fd24df034ed1d52..2baf0861f78f30decb1f054dcb48c33def290832 100644 (file)
@@ -243,6 +243,8 @@ struct drm_pagemap_devmem_ops {
                           struct dma_fence *pre_migrate_fence);
 };
 
+#if IS_ENABLED(CONFIG_ZONE_DEVICE)
+
 int drm_pagemap_init(struct drm_pagemap *dpagemap,
                     struct dev_pagemap *pagemap,
                     struct drm_device *drm,
@@ -252,17 +254,22 @@ struct drm_pagemap *drm_pagemap_create(struct drm_device *drm,
                                       struct dev_pagemap *pagemap,
                                       const struct drm_pagemap_ops *ops);
 
-#if IS_ENABLED(CONFIG_DRM_GPUSVM)
+struct drm_pagemap *drm_pagemap_page_to_dpagemap(struct page *page);
 
 void drm_pagemap_put(struct drm_pagemap *dpagemap);
 
 #else
 
+static inline struct drm_pagemap *drm_pagemap_page_to_dpagemap(struct page *page)
+{
+       return NULL;
+}
+
 static inline void drm_pagemap_put(struct drm_pagemap *dpagemap)
 {
 }
 
-#endif /* IS_ENABLED(CONFIG_DRM_GPUSVM) */
+#endif /* IS_ENABLED(CONFIG_ZONE_DEVICE) */
 
 /**
  * drm_pagemap_get() - Obtain a reference on a struct drm_pagemap
@@ -334,6 +341,8 @@ struct drm_pagemap_migrate_details {
        u32 source_peer_migrates : 1;
 };
 
+#if IS_ENABLED(CONFIG_ZONE_DEVICE)
+
 int drm_pagemap_migrate_to_devmem(struct drm_pagemap_devmem *devmem_allocation,
                                  struct mm_struct *mm,
                                  unsigned long start, unsigned long end,
@@ -343,8 +352,6 @@ int drm_pagemap_evict_to_ram(struct drm_pagemap_devmem *devmem_allocation);
 
 const struct dev_pagemap_ops *drm_pagemap_pagemap_ops_get(void);
 
-struct drm_pagemap *drm_pagemap_page_to_dpagemap(struct page *page);
-
 void drm_pagemap_devmem_init(struct drm_pagemap_devmem *devmem_allocation,
                             struct device *dev, struct mm_struct *mm,
                             const struct drm_pagemap_devmem_ops *ops,
@@ -359,4 +366,7 @@ int drm_pagemap_populate_mm(struct drm_pagemap *dpagemap,
 void drm_pagemap_destroy(struct drm_pagemap *dpagemap, bool is_atomic_or_reclaim);
 
 int drm_pagemap_reinit(struct drm_pagemap *dpagemap);
+
+#endif /* IS_ENABLED(CONFIG_ZONE_DEVICE) */
+
 #endif