Commit bf2084a7 authored by Xiaogang Chen's avatar Xiaogang Chen Committed by Alex Deucher
Browse files

drm/amdkfd: Use huge page size to check split svm range alignment



When split svm ranges that have been mapped using huge page should use huge
page size(2MB) to check split range alignment, not prange->granularity that
means migration granularity.

Fixes: 7ef6b2d4 ("drm/amdkfd: remap unaligned svm ranges that have split")
Signed-off-by: default avatarXiaogang Chen <xiaogang.chen@amd.com>
Reviewed-by: default avatarPhilip Yang <Philip.Yang@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
(cherry picked from commit 448ee453)
parent c7685d11
Loading
Loading
Loading
Loading
+32 −14
Original line number Diff line number Diff line
@@ -1144,30 +1144,48 @@ static int
svm_range_split_tail(struct svm_range *prange, uint64_t new_last,
		     struct list_head *insert_list, struct list_head *remap_list)
{
	unsigned long last_align_down = ALIGN_DOWN(prange->last, 512);
	unsigned long start_align = ALIGN(prange->start, 512);
	bool huge_page_mapping = last_align_down > start_align;
	struct svm_range *tail = NULL;
	int r = svm_range_split(prange, prange->start, new_last, &tail);
	int r;

	r = svm_range_split(prange, prange->start, new_last, &tail);

	if (r)
		return r;

	if (!r) {
	list_add(&tail->list, insert_list);
		if (!IS_ALIGNED(new_last + 1, 1UL << prange->granularity))

	if (huge_page_mapping && tail->start > start_align &&
	    tail->start < last_align_down && (!IS_ALIGNED(tail->start, 512)))
		list_add(&tail->update_list, remap_list);
	}
	return r;

	return 0;
}

static int
svm_range_split_head(struct svm_range *prange, uint64_t new_start,
		     struct list_head *insert_list, struct list_head *remap_list)
{
	unsigned long last_align_down = ALIGN_DOWN(prange->last, 512);
	unsigned long start_align = ALIGN(prange->start, 512);
	bool huge_page_mapping = last_align_down > start_align;
	struct svm_range *head = NULL;
	int r = svm_range_split(prange, new_start, prange->last, &head);
	int r;

	r = svm_range_split(prange, new_start, prange->last, &head);

	if (r)
		return r;

	if (!r) {
	list_add(&head->list, insert_list);
		if (!IS_ALIGNED(new_start, 1UL << prange->granularity))

	if (huge_page_mapping && head->last + 1 > start_align &&
	    head->last + 1 < last_align_down && (!IS_ALIGNED(head->last, 512)))
		list_add(&head->update_list, remap_list);
	}
	return r;

	return 0;
}

static void