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

drm, drm/xe: Fix xe userptr in the absence of CONFIG_DEVICE_PRIVATE

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
(cherry picked from commit 1e372b246199ca7a35f930177fea91b557dac16e)
Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>

+22 -5
+1 -1
drivers/gpu/drm/Kconfig
··· 210 210 211 211 config DRM_GPUSVM 212 212 tristate 213 - depends on DRM && DEVICE_PRIVATE 213 + depends on DRM 214 214 select HMM_MIRROR 215 215 select MMU_NOTIFIER 216 216 help
+3 -1
drivers/gpu/drm/Makefile
··· 108 108 obj-$(CONFIG_DRM_GPUVM) += drm_gpuvm.o 109 109 110 110 drm_gpusvm_helper-y := \ 111 - drm_gpusvm.o\ 111 + drm_gpusvm.o 112 + drm_gpusvm_helper-$(CONFIG_ZONE_DEVICE) += \ 112 113 drm_pagemap.o 114 + 113 115 obj-$(CONFIG_DRM_GPUSVM) += drm_gpusvm_helper.o 114 116 115 117 obj-$(CONFIG_DRM_BUDDY) += drm_buddy.o
+1 -1
drivers/gpu/drm/xe/Kconfig
··· 39 39 select DRM_TTM 40 40 select DRM_TTM_HELPER 41 41 select DRM_EXEC 42 - select DRM_GPUSVM if !UML && DEVICE_PRIVATE 42 + select DRM_GPUSVM if !UML 43 43 select DRM_GPUVM 44 44 select DRM_SCHED 45 45 select MMU_NOTIFIER
+17 -2
include/drm/drm_pagemap.h
··· 209 209 struct dma_fence *pre_migrate_fence); 210 210 }; 211 211 212 + #if IS_ENABLED(CONFIG_ZONE_DEVICE) 213 + 214 + struct drm_pagemap *drm_pagemap_page_to_dpagemap(struct page *page); 215 + 216 + #else 217 + 218 + static inline struct drm_pagemap *drm_pagemap_page_to_dpagemap(struct page *page) 219 + { 220 + return NULL; 221 + } 222 + 223 + #endif /* IS_ENABLED(CONFIG_ZONE_DEVICE) */ 224 + 212 225 /** 213 226 * struct drm_pagemap_devmem - Structure representing a GPU SVM device memory allocation 214 227 * ··· 246 233 struct dma_fence *pre_migrate_fence; 247 234 }; 248 235 236 + #if IS_ENABLED(CONFIG_ZONE_DEVICE) 237 + 249 238 int drm_pagemap_migrate_to_devmem(struct drm_pagemap_devmem *devmem_allocation, 250 239 struct mm_struct *mm, 251 240 unsigned long start, unsigned long end, ··· 257 242 int drm_pagemap_evict_to_ram(struct drm_pagemap_devmem *devmem_allocation); 258 243 259 244 const struct dev_pagemap_ops *drm_pagemap_pagemap_ops_get(void); 260 - 261 - struct drm_pagemap *drm_pagemap_page_to_dpagemap(struct page *page); 262 245 263 246 void drm_pagemap_devmem_init(struct drm_pagemap_devmem *devmem_allocation, 264 247 struct device *dev, struct mm_struct *mm, ··· 268 255 unsigned long start, unsigned long end, 269 256 struct mm_struct *mm, 270 257 unsigned long timeslice_ms); 258 + 259 + #endif /* IS_ENABLED(CONFIG_ZONE_DEVICE) */ 271 260 272 261 #endif