Commit 6b9c63a6 authored by Philip Yang's avatar Philip Yang Committed by Alex Deucher
Browse files

drm/amdkfd: Add SVM range mapped_to_gpu flag



To avoid unnecessary unmap SVM range from GPUs if range is not mapped on
GPUs when migrating the range. This flag will also be used to flush TLB
when updating the existing mapping on GPUs.

It is protected by prange->migrate_mutex and mmap read lock in MMU
notifier callback.

Signed-off-by: default avatarPhilip Yang <Philip.Yang@amd.com>
Reviewed-by: default avatarFelix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 398bb283
Loading
Loading
Loading
Loading
+16 −1
Original line number Diff line number Diff line
@@ -950,6 +950,7 @@ svm_range_split_adjust(struct svm_range *new, struct svm_range *old,
	new->prefetch_loc = old->prefetch_loc;
	new->actual_loc = old->actual_loc;
	new->granularity = old->granularity;
	new->mapped_to_gpu = old->mapped_to_gpu;
	bitmap_copy(new->bitmap_access, old->bitmap_access, MAX_GPU_INSTANCE);
	bitmap_copy(new->bitmap_aip, old->bitmap_aip, MAX_GPU_INSTANCE);

@@ -1203,6 +1204,17 @@ svm_range_unmap_from_gpus(struct svm_range *prange, unsigned long start,
	uint32_t gpuidx;
	int r = 0;

	if (!prange->mapped_to_gpu) {
		pr_debug("prange 0x%p [0x%lx 0x%lx] not mapped to GPU\n",
			 prange, prange->start, prange->last);
		return 0;
	}

	if (prange->start == start && prange->last == last) {
		pr_debug("unmap svms 0x%p prange 0x%p\n", prange->svms, prange);
		prange->mapped_to_gpu = false;
	}

	bitmap_or(bitmap, prange->bitmap_access, prange->bitmap_aip,
		  MAX_GPU_INSTANCE);
	p = container_of(prange->svms, struct kfd_process, svms);
@@ -1587,8 +1599,10 @@ static int svm_range_validate_and_map(struct mm_struct *mm,
		addr = next;
	}

	if (addr == end)
	if (addr == end) {
		prange->validated_once = true;
		prange->mapped_to_gpu = true;
	}

unreserve_out:
	svm_range_unreserve_bos(&ctx);
@@ -1819,6 +1833,7 @@ static struct svm_range *svm_range_clone(struct svm_range *old)
	new->prefetch_loc = old->prefetch_loc;
	new->actual_loc = old->actual_loc;
	new->granularity = old->granularity;
	new->mapped_to_gpu = old->mapped_to_gpu;
	bitmap_copy(new->bitmap_access, old->bitmap_access, MAX_GPU_INSTANCE);
	bitmap_copy(new->bitmap_aip, old->bitmap_aip, MAX_GPU_INSTANCE);

+1 −0
Original line number Diff line number Diff line
@@ -133,6 +133,7 @@ struct svm_range {
	DECLARE_BITMAP(bitmap_access, MAX_GPU_INSTANCE);
	DECLARE_BITMAP(bitmap_aip, MAX_GPU_INSTANCE);
	bool				validated_once;
	bool				mapped_to_gpu;
};

static inline void svm_range_lock(struct svm_range *prange)