[PATCH v2 2/7] drm/amdkfd: Add helper function svm_range_need_access_gpus
Felix Kuehling
felix.kuehling at amd.com
Tue Oct 17 17:59:38 UTC 2023
On 2023-10-10 10:40, Philip Yang wrote:
> Refactor svm_range_validate_and_map to add and use the helper function
> to get all GPUs bitmap that need access the svm range. No functional
> change. This helper will be used in the following patch.
>
> Signed-off-by: Philip Yang <Philip.Yang at amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling at amd.com>
> ---
> drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 55 +++++++++++++++++-----------
> 1 file changed, 34 insertions(+), 21 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
> index e195106a77cb..fb22b857adbc 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c
> @@ -1191,6 +1191,34 @@ svm_range_split_by_granularity(struct kfd_process *p, struct mm_struct *mm,
> }
> return 0;
> }
> +
> +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);
> + uint32_t 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);
> + }
> + } 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)
> {
> @@ -1631,28 +1659,13 @@ 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);
> - }
> } 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)) {
More information about the amd-gfx
mailing list