[PATCH] drm/amdkfd: svm range always mapped flag not working on APU
Felix Kuehling
felix.kuehling at amd.com
Thu Dec 14 19:57:39 UTC 2023
On 2023-12-14 13:58, Philip Yang wrote:
> On gfx943 APU there is VRAM and page migration,
Is there a "no" missing here?
> queue CWSR area, svm
> range with always mapped flag, is not mapped to GPU correctly. This
> works fine if retry fault on CWSR area can be recovered, but could cause
> deadlock if there is another retry fault recover waiting for CWSR to
> finish.
>
> Fix this by mapping svm range with always mapped flag to GPU with ACCESS
> attribute if XNACK ON.
>
> There is side effect, because all GPUs have ACCESS attribute by default
> on new svm range with XNACK on, the CWSR area will be mapped to all GPUs
> after this change. This side effect will be fixed with Thunk change to
> set CWSR svm range with ACCESS_IN_PLACE attribute on the GPU that user
> queue is created.
>
> Signed-off-by: Philip Yang <Philip.Yang at amd.com>
With the commit description fixed, this patch is
Reviewed-by: Felix Kuehling <felix.kuehling at amd.com>
> ---
> drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 18 ++++++++++++------
> 1 file changed, 12 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
> index 2834fb351818..41656e85ee57 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
> @@ -1607,18 +1607,24 @@ static int svm_range_validate_and_map(struct mm_struct *mm,
> if (test_bit(gpuidx, prange->bitmap_access))
> bitmap_set(ctx->bitmap, gpuidx, 1);
> }
> +
> + /*
> + * If prange is already mapped or with always mapped flag,
> + * update mapping on GPUs with ACCESS attribute
> + */
> + if (bitmap_empty(ctx->bitmap, MAX_GPU_INSTANCE)) {
> + if (prange->mapped_to_gpu ||
> + prange->flags & KFD_IOCTL_SVM_FLAG_GPU_ALWAYS_MAPPED)
> + bitmap_copy(ctx->bitmap, prange->bitmap_access, MAX_GPU_INSTANCE);
> + }
> } else {
> bitmap_or(ctx->bitmap, prange->bitmap_access,
> prange->bitmap_aip, MAX_GPU_INSTANCE);
> }
>
> if (bitmap_empty(ctx->bitmap, MAX_GPU_INSTANCE)) {
> - bitmap_copy(ctx->bitmap, prange->bitmap_access, MAX_GPU_INSTANCE);
> - if (!prange->mapped_to_gpu ||
> - bitmap_empty(ctx->bitmap, MAX_GPU_INSTANCE)) {
> - r = 0;
> - goto free_ctx;
> - }
> + r = 0;
> + goto free_ctx;
> }
>
> if (prange->actual_loc && !prange->ttm_res) {
More information about the amd-gfx
mailing list