[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