<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <p><br>
    </p>
    <div class="moz-cite-prefix">On 2021-10-07 2:23 p.m., Alex Sierra
      wrote:<br>
    </div>
    <blockquote type="cite" cite="mid:20211007182335.17152-1-alex.sierra@amd.com">
      <pre class="moz-quote-pre" wrap="">This fix the deadlock with the BO reservations during SVM_BO evictions
while allocations in VRAM are concurrently performed. More specific,
while the ttm waits for the fence to be signaled (ttm_bo_wait), it
already has the BO reserved. In parallel, the restore worker might be
running, prefetching memory to VRAM. This also requires to reserve the
BO, but blocks the mmap semaphore first. The deadlock happens when the
SVM_BO eviction worker kicks in and waits for the mmap semaphore held
in restore worker. Preventing signal the fence back, causing the
deadlock until the ttm times out.
</pre>
    </blockquote>
    <p>Please add this to comment, <br>
    </p>
    <p>svm_range_restore_work hold prange->migrate_mutex, to prevent
      range is migrated while updating GPU page table<br>
    </p>
    <blockquote type="cite" cite="mid:20211007182335.17152-1-alex.sierra@amd.com">
      <pre class="moz-quote-pre" wrap="">
We don't need to hold the BO reservation anymore during validation
and mapping. Now the physical addresses are taken from hmm_range_fault.

Signed-off-by: Alex Sierra <a class="moz-txt-link-rfc2396E" href="mailto:alex.sierra@amd.com"><alex.sierra@amd.com></a>
---
 drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
index c4de7ce2f21c..6de3fb5266bf 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
@@ -1326,11 +1326,6 @@ static int svm_range_reserve_bos(struct svm_validate_context *ctx)
                ctx->tv[gpuidx].num_shared = 4;
                list_add(&ctx->tv[gpuidx].head, &ctx->validate_list);
        }
-       if (ctx->prange->svm_bo && ctx->prange->ttm_res) {
-               ctx->tv[MAX_GPU_INSTANCE].bo = &ctx->prange->svm_bo->bo->tbo;
-               ctx->tv[MAX_GPU_INSTANCE].num_shared = 1;
-               list_add(&ctx->tv[MAX_GPU_INSTANCE].head, &ctx->validate_list);
-       }</pre>
    </blockquote>
    with this is removed, this data structure can change from<br>
      struct ttm_validate_buffer tv[MAX_GPU_INSTANCE+1];<br>
    <p>to</p>
    <p> struct ttm_validate_buffer tv[MAX_GPU_INSTANCE];</p>
    <p>Regards,</p>
    <p>Philip<br>
    </p>
    <blockquote type="cite" cite="mid:20211007182335.17152-1-alex.sierra@amd.com">
      <pre class="moz-quote-pre" wrap="">
 
        r = ttm_eu_reserve_buffers(&ctx->ticket, &ctx->validate_list,
                                   ctx->intr, NULL);
</pre>
    </blockquote>
  </body>
</html>