Add the helper function to get all GPUs bitmap that need access the svm range. This helper will be used in the following patch to check if prange is mapped to all gpus. Refactor svm_range_validate_and_map to use the helper function, no functional change. Signed-off-by: Philip Yang <Philip.Yang@xxxxxxx> Reviewed-by: Felix Kuehling <Felix.Kuehling@xxxxxxx> --- drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 74 ++++++++++++++++------------ 1 file changed, 43 insertions(+), 31 deletions(-) diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c index 18f8c82a849c..14dbc0fd51a9 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c @@ -1169,6 +1169,44 @@ svm_range_add_child(struct svm_range *prange, struct mm_struct *mm, list_add_tail(&pchild->child_list, &prange->child_list); } +static int +svm_range_need_access_gpus(unsigned long *bitmap, struct svm_range *prange) +{ + struct kfd_process *p = container_of(prange->svms, struct kfd_process, svms); + u32 gpuidx; + + if (p->xnack_enabled) { + bitmap_copy(bitmap, prange->bitmap_aip, MAX_GPU_INSTANCE); + + /* If prefetch range to GPU, or GPU retry fault migrate range to + * GPU, which has ACCESS attribute to the range, create mapping + * on that GPU. + */ + if (prange->actual_loc) { + gpuidx = kfd_process_gpuidx_from_gpuid(p, prange->actual_loc); + if (gpuidx < 0) + return -EINVAL; + + if (test_bit(gpuidx, prange->bitmap_access)) + bitmap_set(bitmap, gpuidx, 1); + } + + /* + * If prange is already mapped or with always mapped flag, + * update mapping on GPUs with ACCESS attribute + */ + if (bitmap_empty(bitmap, MAX_GPU_INSTANCE)) { + if (prange->mapped_to_gpu || + prange->flags & KFD_IOCTL_SVM_FLAG_GPU_ALWAYS_MAPPED) + bitmap_copy(bitmap, prange->bitmap_access, MAX_GPU_INSTANCE); + } + } else { + bitmap_or(bitmap, prange->bitmap_access, + prange->bitmap_aip, MAX_GPU_INSTANCE); + } + return 0; +} + static bool svm_nodes_in_same_hive(struct kfd_node *node_a, struct kfd_node *node_b) { @@ -1609,38 +1647,12 @@ static int svm_range_validate_and_map(struct mm_struct *mm, if (gpuidx < MAX_GPU_INSTANCE) { bitmap_zero(ctx->bitmap, MAX_GPU_INSTANCE); bitmap_set(ctx->bitmap, gpuidx, 1); - } else if (ctx->process->xnack_enabled) { - bitmap_copy(ctx->bitmap, prange->bitmap_aip, MAX_GPU_INSTANCE); - - /* If prefetch range to GPU, or GPU retry fault migrate range to - * GPU, which has ACCESS attribute to the range, create mapping - * on that GPU. - */ - if (prange->actual_loc) { - gpuidx = kfd_process_gpuidx_from_gpuid(ctx->process, - prange->actual_loc); - if (gpuidx < 0) { - WARN_ONCE(1, "failed get device by id 0x%x\n", - prange->actual_loc); - r = -EINVAL; - goto free_ctx; - } - 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); + r = svm_range_need_access_gpus(ctx->bitmap, prange); + if (r) { + WARN_ONCE(1, "failed get device by id 0x%x\n", prange->actual_loc); + goto free_ctx; + } } if (bitmap_empty(ctx->bitmap, MAX_GPU_INSTANCE)) { -- 2.35.1