From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: "Philip Yang" <Philip.Yang@amd.com>,
"Christian König" <christian.koenig@amd.com>,
"Alex Deucher" <alexander.deucher@amd.com>,
"Sasha Levin" <sashal@kernel.org>,
airlied@gmail.com, simona@ffwll.ch, srinivasan.shanmugam@amd.com,
tvrtko.ursulin@igalia.com, xiaogang.chen@amd.com,
Yunxiang.Li@amd.com, xinhui.pan@amd.com, Hawking.Zhang@amd.com,
Longlong.Yao@amd.com, shane.xiao@amd.com, jesse.zhang@amd.com,
amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org
Subject: [PATCH AUTOSEL 6.14 11/44] drm/amdgpu: Unlocked unmap only clear page table leaves
Date: Thu, 3 Apr 2025 15:12:40 -0400 [thread overview]
Message-ID: <20250403191313.2679091-11-sashal@kernel.org> (raw)
In-Reply-To: <20250403191313.2679091-1-sashal@kernel.org>
From: Philip Yang <Philip.Yang@amd.com>
[ Upstream commit 23b645231eeffdaf44021debac881d2f26824150 ]
SVM migration unmap pages from GPU and then update mapping to GPU to
recover page fault. Currently unmap clears the PDE entry for range
length >= huge page and free PTB bo, update mapping to alloc new PT bo.
There is race bug that the freed entry bo maybe still on the pt_free
list, reused when updating mapping and then freed, leave invalid PDE
entry and cause GPU page fault.
By setting the update to clear only one PDE entry or clear PTB, to
avoid unmap to free PTE bo. This fixes the race bug and improve the
unmap and map to GPU performance. Update mapping to huge page will
still free the PTB bo.
With this change, the vm->pt_freed list and work is not needed. Add
WARN_ON(unlocked) in amdgpu_vm_pt_free_dfs to catch if unmap to free the
PTB.
Signed-off-by: Philip Yang <Philip.Yang@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 4 ---
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 4 ---
drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c | 43 +++++++----------------
3 files changed, 13 insertions(+), 38 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index 5c07777d3239e..22aa4a8f11891 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -2534,8 +2534,6 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm,
spin_lock_init(&vm->status_lock);
INIT_LIST_HEAD(&vm->freed);
INIT_LIST_HEAD(&vm->done);
- INIT_LIST_HEAD(&vm->pt_freed);
- INIT_WORK(&vm->pt_free_work, amdgpu_vm_pt_free_work);
INIT_KFIFO(vm->faults);
r = amdgpu_vm_init_entities(adev, vm);
@@ -2717,8 +2715,6 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm)
amdgpu_amdkfd_gpuvm_destroy_cb(adev, vm);
- flush_work(&vm->pt_free_work);
-
root = amdgpu_bo_ref(vm->root.bo);
amdgpu_bo_reserve(root, true);
amdgpu_vm_set_pasid(adev, vm, 0);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
index a3e128e373bc6..5010a3107bf89 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
@@ -374,10 +374,6 @@ struct amdgpu_vm {
/* BOs which are invalidated, has been updated in the PTs */
struct list_head done;
- /* PT BOs scheduled to free and fill with zero if vm_resv is not hold */
- struct list_head pt_freed;
- struct work_struct pt_free_work;
-
/* contains the page directory */
struct amdgpu_vm_bo_base root;
struct dma_fence *last_update;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c
index b0bf216821152..30022123b0bf6 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_pt.c
@@ -547,27 +547,6 @@ static void amdgpu_vm_pt_free(struct amdgpu_vm_bo_base *entry)
amdgpu_bo_unref(&entry->bo);
}
-void amdgpu_vm_pt_free_work(struct work_struct *work)
-{
- struct amdgpu_vm_bo_base *entry, *next;
- struct amdgpu_vm *vm;
- LIST_HEAD(pt_freed);
-
- vm = container_of(work, struct amdgpu_vm, pt_free_work);
-
- spin_lock(&vm->status_lock);
- list_splice_init(&vm->pt_freed, &pt_freed);
- spin_unlock(&vm->status_lock);
-
- /* flush_work in amdgpu_vm_fini ensure vm->root.bo is valid. */
- amdgpu_bo_reserve(vm->root.bo, true);
-
- list_for_each_entry_safe(entry, next, &pt_freed, vm_status)
- amdgpu_vm_pt_free(entry);
-
- amdgpu_bo_unreserve(vm->root.bo);
-}
-
/**
* amdgpu_vm_pt_free_list - free PD/PT levels
*
@@ -580,19 +559,15 @@ void amdgpu_vm_pt_free_list(struct amdgpu_device *adev,
struct amdgpu_vm_update_params *params)
{
struct amdgpu_vm_bo_base *entry, *next;
- struct amdgpu_vm *vm = params->vm;
bool unlocked = params->unlocked;
if (list_empty(¶ms->tlb_flush_waitlist))
return;
- if (unlocked) {
- spin_lock(&vm->status_lock);
- list_splice_init(¶ms->tlb_flush_waitlist, &vm->pt_freed);
- spin_unlock(&vm->status_lock);
- schedule_work(&vm->pt_free_work);
- return;
- }
+ /*
+ * unlocked unmap clear page table leaves, warning to free the page entry.
+ */
+ WARN_ON(unlocked);
list_for_each_entry_safe(entry, next, ¶ms->tlb_flush_waitlist, vm_status)
amdgpu_vm_pt_free(entry);
@@ -900,7 +875,15 @@ int amdgpu_vm_ptes_update(struct amdgpu_vm_update_params *params,
incr = (uint64_t)AMDGPU_GPU_PAGE_SIZE << shift;
mask = amdgpu_vm_pt_entries_mask(adev, cursor.level);
pe_start = ((cursor.pfn >> shift) & mask) * 8;
- entry_end = ((uint64_t)mask + 1) << shift;
+
+ if (cursor.level < AMDGPU_VM_PTB && params->unlocked)
+ /*
+ * MMU notifier callback unlocked unmap huge page, leave is PDE entry,
+ * only clear one entry. Next entry search again for PDE or PTE leave.
+ */
+ entry_end = 1ULL << shift;
+ else
+ entry_end = ((uint64_t)mask + 1) << shift;
entry_end += cursor.pfn & ~(entry_end - 1);
entry_end = min(entry_end, end);
--
2.39.5
next prev parent reply other threads:[~2025-04-03 19:13 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-04-03 19:12 [PATCH AUTOSEL 6.14 01/44] drm: allow encoder mode_set even when connectors change for crtc Sasha Levin
2025-04-03 19:12 ` [PATCH AUTOSEL 6.14 02/44] drm/virtio: Set missing bo->attached flag Sasha Levin
2025-04-03 19:12 ` [PATCH AUTOSEL 6.14 03/44] drm/rockchip: Don't change hdmi reference clock rate Sasha Levin
2025-04-03 19:12 ` [PATCH AUTOSEL 6.14 04/44] drm/xe/bmg: Add new PCI IDs Sasha Levin
2025-04-03 19:12 ` [PATCH AUTOSEL 6.14 05/44] drm/xe/ptl: Update the PTL pci id table Sasha Levin
2025-04-03 19:12 ` [PATCH AUTOSEL 6.14 06/44] drm/xe/pf: Don't send BEGIN_ID if VF has no context/doorbells Sasha Levin
2025-04-03 19:12 ` [PATCH AUTOSEL 6.14 07/44] drm/xe/vf: Don't try to trigger a full GT reset if VF Sasha Levin
2025-04-03 19:12 ` [PATCH AUTOSEL 6.14 08/44] drm/amd/display: Update Cursor request mode to the beginning prefetch always Sasha Levin
2025-04-03 19:12 ` [PATCH AUTOSEL 6.14 09/44] drm/amd/display: Guard Possible Null Pointer Dereference Sasha Levin
2025-04-03 19:12 ` [PATCH AUTOSEL 6.14 10/44] drm/amd/display: add workaround flag to link to force FFE preset Sasha Levin
2025-04-03 19:12 ` Sasha Levin [this message]
2025-04-03 19:12 ` [PATCH AUTOSEL 6.14 12/44] drm: panel-orientation-quirks: Add support for AYANEO 2S Sasha Levin
2025-04-03 19:12 ` [PATCH AUTOSEL 6.14 13/44] drm: panel-orientation-quirks: Add quirks for AYA NEO Flip DS and KB Sasha Levin
2025-04-03 19:12 ` [PATCH AUTOSEL 6.14 14/44] drm: panel-orientation-quirks: Add quirk for AYA NEO Slide Sasha Levin
2025-04-03 19:12 ` [PATCH AUTOSEL 6.14 15/44] drm: panel-orientation-quirks: Add new quirk for GPD Win 2 Sasha Levin
2025-04-03 19:12 ` [PATCH AUTOSEL 6.14 16/44] drm: panel-orientation-quirks: Add quirk for OneXPlayer Mini (Intel) Sasha Levin
2025-04-03 19:12 ` [PATCH AUTOSEL 6.14 17/44] drm/debugfs: fix printk format for bridge index Sasha Levin
2025-04-03 19:12 ` [PATCH AUTOSEL 6.14 18/44] drm/bridge: panel: forbid initializing a panel with unknown connector type Sasha Levin
2025-04-03 19:12 ` [PATCH AUTOSEL 6.14 19/44] drm/amd/display: Update FIXED_VS Link Rate Toggle Workaround Usage Sasha Levin
2025-04-03 19:12 ` [PATCH AUTOSEL 6.14 20/44] drm/amd/display: stop DML2 from removing pipes based on planes Sasha Levin
2025-04-03 19:12 ` [PATCH AUTOSEL 6.14 21/44] drivers: base: devres: Allow to release group on device release Sasha Levin
2025-04-03 19:12 ` [PATCH AUTOSEL 6.14 22/44] drm/amdkfd: clamp queue size to minimum Sasha Levin
2025-04-03 19:12 ` [PATCH AUTOSEL 6.14 23/44] drm/amdkfd: Fix mode1 reset crash issue Sasha Levin
2025-04-03 19:12 ` [PATCH AUTOSEL 6.14 24/44] drm/amdkfd: Fix pqm_destroy_queue race with GPU reset Sasha Levin
2025-04-03 19:12 ` [PATCH AUTOSEL 6.14 25/44] drm/amdkfd: debugfs hang_hws skip GPU with MES Sasha Levin
2025-04-03 19:12 ` [PATCH AUTOSEL 6.14 26/44] drm/xe/xelp: Move Wa_16011163337 from tunings to workarounds Sasha Levin
2025-04-03 19:12 ` [PATCH AUTOSEL 6.14 27/44] drm/mediatek: mtk_dpi: Move the input_2p_en bit to platform data Sasha Levin
2025-04-03 19:12 ` [PATCH AUTOSEL 6.14 28/44] drm/mediatek: mtk_dpi: Explicitly manage TVD clock in power on/off Sasha Levin
2025-04-03 19:12 ` [PATCH AUTOSEL 6.14 29/44] drm/rockchip: stop passing non struct drm_device to drm_err() and friends Sasha Levin
2025-04-03 19:12 ` [PATCH AUTOSEL 6.14 30/44] PCI: Add Rockchip Vendor ID Sasha Levin
2025-04-03 19:13 ` [PATCH AUTOSEL 6.14 31/44] drm/amdgpu: handle amdgpu_cgs_create_device() errors in amd_powerplay_create() Sasha Levin
2025-04-03 19:13 ` [PATCH AUTOSEL 6.14 32/44] drm/amd/display: Prevent VStartup Overflow Sasha Levin
2025-04-03 19:13 ` [PATCH AUTOSEL 6.14 33/44] PCI: Enable Configuration RRS SV early Sasha Levin
2025-04-03 19:13 ` [PATCH AUTOSEL 6.14 34/44] drm/amdgpu: Fix the race condition for draining retry fault Sasha Levin
2025-04-03 19:13 ` [PATCH AUTOSEL 6.14 35/44] PCI: Check BAR index for validity Sasha Levin
2025-04-03 19:13 ` [PATCH AUTOSEL 6.14 36/44] PCI: vmd: Make vmd_dev::cfg_lock a raw_spinlock_t type Sasha Levin
2025-04-03 19:13 ` [PATCH AUTOSEL 6.14 37/44] drm/amdgpu: grab an additional reference on the gang fence v2 Sasha Levin
2025-04-03 19:13 ` [PATCH AUTOSEL 6.14 38/44] s390/pci: Support mmap() of PCI resources except for ISM devices Sasha Levin
2025-04-03 19:13 ` [PATCH AUTOSEL 6.14 39/44] fbdev: omapfb: Add 'plane' value check Sasha Levin
2025-04-03 19:13 ` [PATCH AUTOSEL 6.14 40/44] tracing: probe-events: Log error for exceeding the number of arguments Sasha Levin
2025-04-03 19:13 ` [PATCH AUTOSEL 6.14 41/44] tracing: probe-events: Add comments about entry data storing code Sasha Levin
2025-04-03 19:13 ` [PATCH AUTOSEL 6.14 42/44] ktest: Fix Test Failures Due to Missing LOG_FILE Directories Sasha Levin
2025-04-03 19:13 ` [PATCH AUTOSEL 6.14 43/44] tpm, tpm_tis: Workaround failed command reception on Infineon devices Sasha Levin
2025-04-03 19:13 ` [PATCH AUTOSEL 6.14 44/44] tpm: End any active auth session before shutdown Sasha Levin
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=20250403191313.2679091-11-sashal@kernel.org \
--to=sashal@kernel.org \
--cc=Hawking.Zhang@amd.com \
--cc=Longlong.Yao@amd.com \
--cc=Philip.Yang@amd.com \
--cc=Yunxiang.Li@amd.com \
--cc=airlied@gmail.com \
--cc=alexander.deucher@amd.com \
--cc=amd-gfx@lists.freedesktop.org \
--cc=christian.koenig@amd.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=jesse.zhang@amd.com \
--cc=linux-kernel@vger.kernel.org \
--cc=shane.xiao@amd.com \
--cc=simona@ffwll.ch \
--cc=srinivasan.shanmugam@amd.com \
--cc=stable@vger.kernel.org \
--cc=tvrtko.ursulin@igalia.com \
--cc=xiaogang.chen@amd.com \
--cc=xinhui.pan@amd.com \
/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
all inboxes | Powered by JetHome®