mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
drm/gpusvm, drm/xe: Allow mixed mappings for userptr
Compute kernels often issue memory copies immediately after completion. If the memory being copied is an SVM pointer that was faulted into the device and then bound via userptr, it is undesirable to move that memory. Worse, if userptr is mixed between system and device memory, the bind operation may be rejected. Xe already has the necessary plumbing to support userptr with mixed mappings. This update modifies GPUSVM's get_pages to correctly locate pages in such mixed mapping scenarios. v2: - Rebase (Thomas Hellström) v3: - Remove Fixes tag. v4: - Break out from series since the other patch was merged. - Update patch subject, ensure dri-devel and Maarten are CC'd. Cc: Maarten Lankhorst <maarten.lankhorst@intel.com> Cc: dri-devel@lists.freedesktop.org Signed-off-by: Matthew Brost <matthew.brost@intel.com> Reviewed-by: Thomas Hellström <thomas.hellstrom@linux.intel.com> Reviewed-by: Matthew Auld <matthew.auld@intel.com> Reviewed-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com> Link: https://lore.kernel.org/r/20251015120320.176338-1-thomas.hellstrom@linux.intel.com Acked-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
This commit is contained in:
committed by
Thomas Hellström
parent
95af815574
commit
bce13d6ecd
@@ -1363,7 +1363,8 @@ map_pages:
|
||||
order = drm_gpusvm_hmm_pfn_to_order(pfns[i], i, npages);
|
||||
if (is_device_private_page(page) ||
|
||||
is_device_coherent_page(page)) {
|
||||
if (zdd != page->zone_device_data && i > 0) {
|
||||
if (!ctx->allow_mixed &&
|
||||
zdd != page->zone_device_data && i > 0) {
|
||||
err = -EOPNOTSUPP;
|
||||
goto err_unmap;
|
||||
}
|
||||
@@ -1399,7 +1400,8 @@ map_pages:
|
||||
} else {
|
||||
dma_addr_t addr;
|
||||
|
||||
if (is_zone_device_page(page) || pagemap) {
|
||||
if (is_zone_device_page(page) ||
|
||||
(pagemap && !ctx->allow_mixed)) {
|
||||
err = -EOPNOTSUPP;
|
||||
goto err_unmap;
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
* Copyright © 2025 Intel Corporation
|
||||
*/
|
||||
|
||||
#include "xe_svm.h"
|
||||
#include "xe_userptr.h"
|
||||
|
||||
#include <linux/mm.h>
|
||||
@@ -54,7 +55,8 @@ int xe_vma_userptr_pin_pages(struct xe_userptr_vma *uvma)
|
||||
struct xe_device *xe = vm->xe;
|
||||
struct drm_gpusvm_ctx ctx = {
|
||||
.read_only = xe_vma_read_only(vma),
|
||||
.device_private_page_owner = NULL,
|
||||
.device_private_page_owner = xe_svm_devm_owner(xe),
|
||||
.allow_mixed = true,
|
||||
};
|
||||
|
||||
lockdep_assert_held(&vm->lock);
|
||||
|
||||
@@ -235,6 +235,9 @@ struct drm_gpusvm {
|
||||
* @read_only: operating on read-only memory
|
||||
* @devmem_possible: possible to use device memory
|
||||
* @devmem_only: use only device memory
|
||||
* @allow_mixed: Allow mixed mappings in get pages. Mixing between system and
|
||||
* single dpagemap is supported, mixing between multiple dpagemap
|
||||
* is unsupported.
|
||||
*
|
||||
* Context that is DRM GPUSVM is operating in (i.e. user arguments).
|
||||
*/
|
||||
@@ -246,6 +249,7 @@ struct drm_gpusvm_ctx {
|
||||
unsigned int read_only :1;
|
||||
unsigned int devmem_possible :1;
|
||||
unsigned int devmem_only :1;
|
||||
unsigned int allow_mixed :1;
|
||||
};
|
||||
|
||||
int drm_gpusvm_init(struct drm_gpusvm *gpusvm,
|
||||
|
||||
Reference in New Issue
Block a user