- Remove duplicate AMDGPU_INTERCONNECT_VRAM/P2P defines from amdgpu_svm.h - Move devmem_possible() from attr module to amdgpu_svm.c as amdgpu_svm_devmem_possible() since it is a device capability check, not an attribute-level decision - Add amdgpu_pagemap_capable() guard in devmem_possible() - Decouple prefer_vram() from devmem_possible(), caller combines both - Update all callers to new API signatures
Signed-off-by: Junhua Shen <[email protected]> --- drivers/gpu/drm/amd/amdgpu/amdgpu_svm.c | 12 ++++++++++++ drivers/gpu/drm/amd/amdgpu/amdgpu_svm.h | 4 +--- drivers/gpu/drm/amd/amdgpu/amdgpu_svm_attr.c | 18 +----------------- drivers/gpu/drm/amd/amdgpu/amdgpu_svm_attr.h | 5 +---- drivers/gpu/drm/amd/amdgpu/amdgpu_svm_fault.c | 9 +++++---- drivers/gpu/drm/amd/amdgpu/amdgpu_svm_range.c | 8 +++++--- drivers/gpu/drm/amd/amdgpu/amdgpu_userptr.c | 13 +++++++------ 7 files changed, 32 insertions(+), 37 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_svm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_svm.c index 626c5790e4d0..47e10e1401a6 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_svm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_svm.c @@ -33,6 +33,7 @@ #include "amdgpu_svm_attr.h" #include "amdgpu_svm_fault.h" #include "amdgpu_svm_range.h" +#include "amdgpu_svm_range_migrate.h" #include "amdgpu_vm.h" #if IS_ENABLED(CONFIG_DRM_AMDGPU_SVM) @@ -318,6 +319,17 @@ int amdgpu_svm_apply_attr_change(struct amdgpu_svm *svm, (last_page + 1) << PAGE_SHIFT); } +bool amdgpu_svm_devmem_possible(struct amdgpu_svm *svm) +{ + if (!amdgpu_pagemap_capable(svm)) + return false; + + if (svm->adev->apu_prefer_gtt) + return false; + + return true; +} + static bool amdgpu_svm_default_xnack_enabled(struct amdgpu_device *adev) { uint32_t gc_ver = amdgpu_ip_version(adev, GC_HWIP, 0); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_svm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_svm.h index 1ab9c84addf7..0dc04d1383f4 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_svm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_svm.h @@ -47,9 +47,6 @@ struct amdgpu_svm_attrs; struct drm_device; struct drm_file; -#define AMDGPU_INTERCONNECT_VRAM DRM_INTERCONNECT_DRIVER -#define AMDGPU_INTERCONNECT_P2P (AMDGPU_INTERCONNECT_VRAM + 1) - enum amdgpu_svm_xnack_mode { AMDGPU_SVM_XNACK_OFF, AMDGPU_SVM_XNACK_ON, @@ -154,6 +151,7 @@ int amdgpu_svm_apply_attr_change(struct amdgpu_svm *svm, const struct amdgpu_svm_attrs *new_attrs, unsigned long start_page, unsigned long last_page); +bool amdgpu_svm_devmem_possible(struct amdgpu_svm *svm); #else static inline int amdgpu_svm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_svm_attr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_svm_attr.c index 177eb3cd501b..26e33defb8b9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_svm_attr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_svm_attr.c @@ -52,24 +52,8 @@ struct attr_get_ctx { bool has_range; }; -bool amdgpu_svm_attr_devmem_possible(struct amdgpu_svm *svm, - const struct amdgpu_svm_attrs *attrs) +bool amdgpu_svm_attr_prefer_vram(const struct amdgpu_svm_attrs *attrs) { - if (svm->adev->apu_prefer_gtt) - return false; - - if (attrs->preferred_loc == AMDGPU_SVM_LOCATION_SYSMEM) - return false; - - return true; -} - -bool amdgpu_svm_attr_prefer_vram(struct amdgpu_svm *svm, - const struct amdgpu_svm_attrs *attrs) -{ - if (!amdgpu_svm_attr_devmem_possible(svm, attrs)) - return false; - if (attrs->preferred_loc != AMDGPU_SVM_LOCATION_UNDEFINED && attrs->preferred_loc != AMDGPU_SVM_LOCATION_SYSMEM) return true; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_svm_attr.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_svm_attr.h index ce7be1bc4ae8..36080405b504 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_svm_attr.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_svm_attr.h @@ -162,10 +162,7 @@ amdgpu_svm_attr_range_alloc(unsigned long start_page, const struct amdgpu_svm_attrs *attrs); void amdgpu_svm_attr_range_insert_locked(struct amdgpu_svm_attr_tree *attr_tree, struct amdgpu_svm_attr_range *range); -bool amdgpu_svm_attr_devmem_possible(struct amdgpu_svm *svm, - const struct amdgpu_svm_attrs *attrs); -bool amdgpu_svm_attr_prefer_vram(struct amdgpu_svm *svm, - const struct amdgpu_svm_attrs *attrs); +bool amdgpu_svm_attr_prefer_vram(const struct amdgpu_svm_attrs *attrs); struct vm_area_struct *amdgpu_svm_check_vma(struct mm_struct *mm, unsigned long addr); int amdgpu_svm_attr_check_vm_bo(struct amdgpu_svm_attr_tree *attr_tree, diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_svm_fault.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_svm_fault.c index eb0e14439762..3f0c010e4e35 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_svm_fault.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_svm_fault.c @@ -151,14 +151,15 @@ static int fault_map_range(struct amdgpu_svm *svm, bool write_fault) { const struct amdgpu_svm_attrs *attrs = &attr_range->attrs; - bool devmem_possible = false; /* TODO: add migration */ - bool need_vram_migration = amdgpu_svm_attr_prefer_vram(svm, attrs); + bool devmem_possible = amdgpu_svm_devmem_possible(svm); + bool need_vram_migration = devmem_possible && + amdgpu_svm_attr_prefer_vram(attrs); struct drm_gpusvm_ctx map_ctx = { .read_only = !!(attrs->flags & AMDGPU_SVM_ATTR_BIT_GPU_RO), .devmem_possible = devmem_possible, .check_pages_threshold = devmem_possible ? SZ_64K : 0, - .devmem_only = need_vram_migration && devmem_possible, - .timeslice_ms = need_vram_migration && devmem_possible ? 5 : 0, + .devmem_only = need_vram_migration, + .timeslice_ms = need_vram_migration ? 5 : 0, }; struct amdgpu_svm_range *range; ktime_t timestamp = ktime_get_boottime(); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_svm_range.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_svm_range.c index ef913a2363e3..21a2b0c49c53 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_svm_range.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_svm_range.c @@ -26,6 +26,7 @@ #include "amdgpu_svm_attr.h" #include "amdgpu_svm_range.h" #include "amdgpu_svm_fault.h" +#include "amdgpu_migrate.h" #include "amdgpu.h" #include "amdgpu_vm.h" @@ -423,11 +424,12 @@ amdgpu_svm_range_map_attrs(struct amdgpu_svm *svm, { unsigned long addr = start; int ret; - bool devmem_possible = false; /* TODO: add migration */ - bool need_vram_migration = amdgpu_svm_attr_prefer_vram(svm, attrs); + bool devmem_possible = amdgpu_svm_devmem_possible(svm); + bool need_vram_migration = devmem_possible && + amdgpu_svm_attr_prefer_vram(attrs); struct drm_gpusvm_ctx map_ctx = { .devmem_possible = devmem_possible, - .devmem_only = need_vram_migration && devmem_possible, + .devmem_only = need_vram_migration, .check_pages_threshold = devmem_possible ? SZ_64K : 0, }; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userptr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_userptr.c index 4582fb9453b2..8bf00aed7f15 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userptr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userptr.c @@ -247,9 +247,10 @@ svm_restore_range(struct amdgpu_svm *svm, struct amdgpu_svm_range *range) if (!attr_range || !amdgpu_svm_attr_has_access(attrs.access)) return 0; - devmem_possible = amdgpu_svm_attr_devmem_possible(svm, &attrs); - need_vram_migration = amdgpu_svm_attr_prefer_vram(svm, &attrs); - devmem_possible = false; /* TODO: add migration */ + devmem_possible = amdgpu_svm_devmem_possible(svm); + need_vram_migration = devmem_possible && + amdgpu_svm_attr_prefer_vram(&attrs); + map_ctx = (struct drm_gpusvm_ctx){ .read_only = !!(attrs.flags & AMDGPU_SVM_ATTR_BIT_GPU_RO), .devmem_possible = devmem_possible, @@ -502,12 +503,12 @@ svm_restore_find_or_insert_by_attrs(struct amdgpu_svm *svm, unsigned long start, unsigned long end) { unsigned long addr = start; - bool devmem_possible = amdgpu_svm_attr_devmem_possible(svm, attrs); - bool need_vram_migration = amdgpu_svm_attr_prefer_vram(svm, attrs); + bool devmem_possible = amdgpu_svm_devmem_possible(svm); + bool need_vram_migration = devmem_possible && amdgpu_svm_attr_prefer_vram(attrs); struct drm_gpusvm_ctx map_ctx = { .read_only = !!(attrs->flags & AMDGPU_SVM_ATTR_BIT_GPU_RO), .devmem_possible = devmem_possible, - .devmem_only = need_vram_migration && devmem_possible, + .devmem_only = need_vram_migration, .check_pages_threshold = devmem_possible ? SZ_64K : 0, }; -- 2.34.1
