Re: [PATCH 2/5] drm/amdkfd: check child range to drain retry fault

2021-11-11 Thread philip yang

  


On 2021-11-09 10:26 p.m., Felix
  Kuehling wrote:


  
  On 2021-11-09 6:04 p.m., Philip Yang wrote:
  
  If unmapping partial range, the parent
prange list op is update

notifier, child range list op is unmap range, need check child
range to

set drain retry fault flag.


Signed-off-by: Philip Yang 

  
  
  I think this could be simplified by simply setting
  svms->drain_pagefaults in svm_range_unmap_from_cpu. The mmap
  lock ensures that this is serialized with the deferred list worker
  reading and clearing svms->drain_pagefaults. You can also use
  READ_ONCE and WRITE_ONCE to be safe.
  

Good idea, change will be in v2 patch.
Thanks,
Philip


  
  Regards,
  
    Felix
  
  
  
  ---

  drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 13 -

  1 file changed, 12 insertions(+), 1 deletion(-)


diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c

index 77239b06b236..64f642935600 100644

--- a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c

+++ b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c

@@ -2049,8 +2049,19 @@ svm_range_add_list_work(struct
svm_range_list *svms, struct svm_range *prange,

   * before the range is freed to avoid straggler interrupts
on

   * unmapped memory causing "phantom faults".

   */

-    if (op == SVM_OP_UNMAP_RANGE)

+    if (op == SVM_OP_UNMAP_RANGE) {

+    pr_debug("set range drain_pagefaults true\n");

  svms->drain_pagefaults = true;

+    } else {

+    struct svm_range *pchild;

+

+    list_for_each_entry(pchild, &prange->child_list,
child_list)

+    if (pchild->work_item.op == SVM_OP_UNMAP_RANGE)
{

+    pr_debug("set child drain_pagefaults true\n");

+    svms->drain_pagefaults = true;

+    }

+    }

+

  /* if prange is on the deferred list */

  if (!list_empty(&prange->deferred_list)) {

  pr_debug("update exist prange 0x%p work op %d\n",
prange, op);

  

  



Re: [PATCH 2/5] drm/amdkfd: check child range to drain retry fault

2021-11-09 Thread Felix Kuehling



On 2021-11-09 6:04 p.m., Philip Yang wrote:

If unmapping partial range, the parent prange list op is update
notifier, child range list op is unmap range, need check child range to
set drain retry fault flag.

Signed-off-by: Philip Yang 


I think this could be simplified by simply setting 
svms->drain_pagefaults in svm_range_unmap_from_cpu. The mmap lock 
ensures that this is serialized with the deferred list worker reading 
and clearing svms->drain_pagefaults. You can also use READ_ONCE and 
WRITE_ONCE to be safe.


Regards,
  Felix



---
  drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 13 -
  1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
index 77239b06b236..64f642935600 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
@@ -2049,8 +2049,19 @@ svm_range_add_list_work(struct svm_range_list *svms, 
struct svm_range *prange,
 * before the range is freed to avoid straggler interrupts on
 * unmapped memory causing "phantom faults".
 */
-   if (op == SVM_OP_UNMAP_RANGE)
+   if (op == SVM_OP_UNMAP_RANGE) {
+   pr_debug("set range drain_pagefaults true\n");
svms->drain_pagefaults = true;
+   } else {
+   struct svm_range *pchild;
+
+   list_for_each_entry(pchild, &prange->child_list, child_list)
+   if (pchild->work_item.op == SVM_OP_UNMAP_RANGE) {
+   pr_debug("set child drain_pagefaults true\n");
+   svms->drain_pagefaults = true;
+   }
+   }
+
/* if prange is on the deferred list */
if (!list_empty(&prange->deferred_list)) {
pr_debug("update exist prange 0x%p work op %d\n", prange, op);


[PATCH 2/5] drm/amdkfd: check child range to drain retry fault

2021-11-09 Thread Philip Yang
If unmapping partial range, the parent prange list op is update
notifier, child range list op is unmap range, need check child range to
set drain retry fault flag.

Signed-off-by: Philip Yang 
---
 drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 13 -
 1 file changed, 12 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
index 77239b06b236..64f642935600 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
@@ -2049,8 +2049,19 @@ svm_range_add_list_work(struct svm_range_list *svms, 
struct svm_range *prange,
 * before the range is freed to avoid straggler interrupts on
 * unmapped memory causing "phantom faults".
 */
-   if (op == SVM_OP_UNMAP_RANGE)
+   if (op == SVM_OP_UNMAP_RANGE) {
+   pr_debug("set range drain_pagefaults true\n");
svms->drain_pagefaults = true;
+   } else {
+   struct svm_range *pchild;
+
+   list_for_each_entry(pchild, &prange->child_list, child_list)
+   if (pchild->work_item.op == SVM_OP_UNMAP_RANGE) {
+   pr_debug("set child drain_pagefaults true\n");
+   svms->drain_pagefaults = true;
+   }
+   }
+
/* if prange is on the deferred list */
if (!list_empty(&prange->deferred_list)) {
pr_debug("update exist prange 0x%p work op %d\n", prange, op);
-- 
2.17.1