<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<br>
<br>
<div class="moz-cite-prefix">Am 02.06.21 um 15:29 schrieb philip
yang:<br>
</div>
<blockquote type="cite"
cite="mid:96d3eab3-ec3e-534b-28ae-17710b92fb80@amd.com">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<p><br>
</p>
<div class="moz-cite-prefix">On 2021-06-02 2:53 a.m., Christian
König wrote:<br>
</div>
<blockquote type="cite"
cite="mid:1b688ac5-e4cd-5c8b-7972-1f120186b502@gmail.com">Mostly
a question for Felix and Philip: <br>
<br>
I've been thinking for a bit about how that case happens in the
first place? <br>
<br>
I mean if we have a PDE which points to PTEs and then switch
that into a 2MiB PTE then why wasn't that range invalidated
before? <br>
<br>
In other words when the PDE points to the PTEs we should have
had an unmap operation on that range before which should have
invalidated the TLB. <br>
</blockquote>
<p>Because one cache line has 8 PDE0</p>
</blockquote>
<br>
Ah, of course! Yeah that makes totally sense now.<br>
<br>
Christian.<br>
<br>
<blockquote type="cite"
cite="mid:96d3eab3-ec3e-534b-28ae-17710b92fb80@amd.com">
<p>, after unmap flush tlb, access address on same PDE0 cache line
will load PDE0 back into tlb. For example:</p>
<p>1. map and access 0x7ffff6210000, unmap it, tlb flush<br>
</p>
<p>2. map and access 0x7ffff6400000, PDE0 for 0x7ffff6200000 into
tlb, which is P=0, V=1</p>
<p>3. map 0x7ffff6200000 update page table, access has vm fault
because tlb has PDE0 P=0,V=1, to recover this fault, map need
update page table and flush tlb.<br>
</p>
<p>Regards,</p>
<p>Philip<br>
</p>
<div>
<div style="box-sizing: border-box; font-family: "Segoe
UI", system-ui, "Apple Color Emoji",
"Segoe UI Emoji", sans-serif; font-size: 14px;
font-style: normal; font-variant-ligatures: normal;
font-variant-caps: normal; font-weight: 400; letter-spacing:
normal; orphans: 2; text-align: start; text-indent: 0px;
text-transform: none; white-space: normal; widows: 2;
word-spacing: 0px;">
<div data-tid="messageBodyContainer"> </div>
</div>
</div>
<blockquote type="cite"
cite="mid:1b688ac5-e4cd-5c8b-7972-1f120186b502@gmail.com"> <br>
Regards, <br>
Christian. <br>
<br>
Am 02.06.21 um 00:59 schrieb Eric Huang: <br>
<blockquote type="cite">It is to provide more tlb flush types
opotion for different <br>
case scenario. <br>
<br>
Signed-off-by: Eric Huang <a class="moz-txt-link-rfc2396E"
href="mailto:jinhuieric.huang@amd.com"
moz-do-not-send="true"><jinhuieric.huang@amd.com></a>
<br>
--- <br>
drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 2 +-
<br>
drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | 6
+++--- <br>
drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 2 +-
<br>
drivers/gpu/drm/amd/amdkfd/kfd_process.c | 4
++-- <br>
4 files changed, 7 insertions(+), 7 deletions(-) <br>
<br>
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c <br>
index 960913a35ee4..4da8aff3df27 100644 <br>
--- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c <br>
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c <br>
@@ -1666,7 +1666,7 @@ static int
kfd_ioctl_map_memory_to_gpu(struct file *filep, <br>
if (WARN_ON_ONCE(!peer_pdd)) <br>
continue; <br>
if (!amdgpu_read_lock(peer->ddev, true)) { <br>
- kfd_flush_tlb(peer_pdd); <br>
+ kfd_flush_tlb(peer_pdd, TLB_FLUSH_LEGACY); <br>
amdgpu_read_unlock(peer->ddev); <br>
} <br>
} <br>
diff --git
a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c <br>
index 2bd621eee4e0..904b8178c1d7 100644 <br>
--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c <br>
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c <br>
@@ -278,7 +278,7 @@ static int allocate_vmid(struct
device_queue_manager *dqm, <br>
qpd->vmid, <br>
qpd->page_table_base); <br>
/* invalidate the VM context after pasid and vmid
mapping is set up */ <br>
- kfd_flush_tlb(qpd_to_pdd(qpd)); <br>
+ kfd_flush_tlb(qpd_to_pdd(qpd), TLB_FLUSH_LEGACY); <br>
if
(dqm->dev->kfd2kgd->set_scratch_backing_va) <br>
dqm->dev->kfd2kgd->set_scratch_backing_va(dqm->dev->kgd,
<br>
@@ -314,7 +314,7 @@ static void deallocate_vmid(struct
device_queue_manager *dqm, <br>
if (flush_texture_cache_nocpsch(q->device, qpd))
<br>
pr_err("Failed to flush TC\n"); <br>
- kfd_flush_tlb(qpd_to_pdd(qpd)); <br>
+ kfd_flush_tlb(qpd_to_pdd(qpd), TLB_FLUSH_LEGACY); <br>
/* Release the vmid mapping */ <br>
set_pasid_vmid_mapping(dqm, 0, qpd->vmid); <br>
@@ -885,7 +885,7 @@ static int
restore_process_queues_nocpsch(struct device_queue_manager
*dqm, <br>
dqm->dev->kgd, <br>
qpd->vmid, <br>
qpd->page_table_base); <br>
- kfd_flush_tlb(pdd); <br>
+ kfd_flush_tlb(pdd, TLB_FLUSH_LEGACY); <br>
} <br>
/* Take a safe reference to the mm_struct, which may
otherwise <br>
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h <br>
index ecdd5e782b81..edce3ecf207d 100644 <br>
--- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h <br>
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h <br>
@@ -1338,7 +1338,7 @@ void kfd_signal_reset_event(struct
kfd_dev *dev); <br>
void kfd_signal_poison_consumed_event(struct kfd_dev *dev,
u32 pasid); <br>
-void kfd_flush_tlb(struct kfd_process_device *pdd); <br>
+void kfd_flush_tlb(struct kfd_process_device *pdd, enum
TLB_FLUSH_TYPE type); <br>
int dbgdev_wave_reset_wavefronts(struct kfd_dev *dev,
struct kfd_process *p); <br>
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
b/drivers/gpu/drm/amd/amdkfd/kfd_process.c <br>
index 3995002c582b..72741f6579d3 100644 <br>
--- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c <br>
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c <br>
@@ -2159,7 +2159,7 @@ int kfd_reserved_mem_mmap(struct kfd_dev
*dev, struct kfd_process *process, <br>
KFD_CWSR_TBA_TMA_SIZE,
vma->vm_page_prot); <br>
} <br>
-void kfd_flush_tlb(struct kfd_process_device *pdd) <br>
+void kfd_flush_tlb(struct kfd_process_device *pdd, enum
TLB_FLUSH_TYPE type) <br>
{ <br>
struct kfd_dev *dev = pdd->dev; <br>
@@ -2172,7 +2172,7 @@ void kfd_flush_tlb(struct
kfd_process_device *pdd) <br>
pdd->qpd.vmid); <br>
} else { <br>
amdgpu_amdkfd_flush_gpu_tlb_pasid(dev->kgd, <br>
- pdd->process->pasid,
TLB_FLUSH_LEGACY); <br>
+ pdd->process->pasid, type); <br>
} <br>
} <br>
</blockquote>
<br>
</blockquote>
</blockquote>
<br>
</body>
</html>