From: Junhua Shen <Junhua.Shen@amd.com>
To: <Alexander.Deucher@amd.com>, <Felix.Kuehling@amd.com>,
<Christian.Koenig@amd.com>, <Oak.Zeng@amd.com>,
<Jenny-Jing.Liu@amd.com>, <Philip.Yang@amd.com>,
<Xiaogang.Chen@amd.com>, <Ray.Huang@amd.com>,
<honglei1.huang@amd.com>, <Lingshan.Zhu@amd.com>,
<simona@ffwll.ch>
Cc: <amd-gfx@lists.freedesktop.org>,
<dri-devel@lists.freedesktop.org>, <Junhua.Shen@amd.com>
Subject: [PATCH v5 6/8] drm/amdgpu: refactor SVM attr devmem_possible and prefer_vram API
Date: Fri, 5 Jun 2026 15:53:38 +0800 [thread overview]
Message-ID: <20260605075340.20199-7-Junhua.Shen@amd.com> (raw)
In-Reply-To: <20260605075340.20199-1-Junhua.Shen@amd.com>
- 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 <Junhua.Shen@amd.com>
---
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
next prev parent reply other threads:[~2026-06-05 7:54 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-05 7:53 [PATCH v5 0/8] drm/amdgpu: SVM VRAM migration via drm_pagemap (unified XNACK on/off) Junhua Shen
2026-06-05 7:53 ` [PATCH v5 1/8] drm/amdgpu: add VRAM migration infrastructure for drm_pagemap Junhua Shen
2026-06-05 7:53 ` [PATCH v5 2/8] drm/amdgpu: implement drm_pagemap SDMA migration callbacks Junhua Shen
2026-06-05 7:53 ` [PATCH v5 3/8] drm/amdgpu: implement synchronous TTM eviction for SVM BOs Junhua Shen
2026-06-05 7:53 ` [PATCH v5 4/8] drm/amdgpu: hook up ZONE_DEVICE registration in device init and reset Junhua Shen
2026-06-05 7:53 ` [PATCH v5 5/8] drm/amdgpu: add SVM range migration helpers for drm_pagemap Junhua Shen
2026-06-05 7:53 ` Junhua Shen [this message]
2026-06-05 7:53 ` [PATCH v5 7/8] drm/amdgpu: integrate VRAM migration into SVM fault and prefetch paths Junhua Shen
2026-06-05 7:53 ` [PATCH v5 8/8] drm/amdgpu: integrate VRAM migration into SVM restore and realign paths Junhua Shen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260605075340.20199-7-Junhua.Shen@amd.com \
--to=junhua.shen@amd.com \
--cc=Alexander.Deucher@amd.com \
--cc=Christian.Koenig@amd.com \
--cc=Felix.Kuehling@amd.com \
--cc=Jenny-Jing.Liu@amd.com \
--cc=Lingshan.Zhu@amd.com \
--cc=Oak.Zeng@amd.com \
--cc=Philip.Yang@amd.com \
--cc=Ray.Huang@amd.com \
--cc=Xiaogang.Chen@amd.com \
--cc=amd-gfx@lists.freedesktop.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=honglei1.huang@amd.com \
--cc=simona@ffwll.ch \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox