Commit b1dd0db1 authored by Sunil Khatri's avatar Sunil Khatri Committed by Alex Deucher
Browse files

drm/amdgpu: clean up amdgpu hmm range functions



Clean up the amdgpu hmm range functions for clearer
definition of each.

a. Split amdgpu_ttm_tt_get_user_pages_done into two:
   1. amdgpu_hmm_range_valid: To check if the user pages
      are valid and update seq num
   2. amdgpu_hmm_range_free: Clean up the hmm range
      and pfn memory.

b. amdgpu_ttm_tt_get_user_pages_done and
   amdgpu_ttm_tt_discard_user_pages are similar function so remove
   discard and directly use amdgpu_hmm_range_free to clean up the
   hmm range and pfn memory.

Suggested-by: default avatarChristian König <christian.koenig@amd.com>
Signed-off-by: default avatarSunil Khatri <sunil.khatri@amd.com>
Reviewed-by: default avatarChristian König <christian.koenig@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent e095b551
Loading
Loading
Loading
Loading
+9 −9
Original line number Diff line number Diff line
@@ -1089,7 +1089,7 @@ static int init_user_pages(struct kgd_mem *mem, uint64_t user_addr,
		return 0;
	}

	range = kzalloc(sizeof(*range), GFP_KERNEL);
	range = amdgpu_hmm_range_alloc();
	if (unlikely(!range)) {
		ret = -ENOMEM;
		goto unregister_out;
@@ -1097,7 +1097,7 @@ static int init_user_pages(struct kgd_mem *mem, uint64_t user_addr,

	ret = amdgpu_ttm_tt_get_user_pages(bo, range);
	if (ret) {
		kfree(range);
		amdgpu_hmm_range_free(range);
		if (ret == -EAGAIN)
			pr_debug("Failed to get user pages, try again\n");
		else
@@ -1120,7 +1120,7 @@ static int init_user_pages(struct kgd_mem *mem, uint64_t user_addr,
	amdgpu_bo_unreserve(bo);

release_out:
	amdgpu_ttm_tt_get_user_pages_done(bo->tbo.ttm, range);
	amdgpu_hmm_range_free(range);
unregister_out:
	if (ret)
		amdgpu_hmm_unregister(bo);
@@ -1923,7 +1923,7 @@ int amdgpu_amdkfd_gpuvm_free_memory_of_gpu(
	if (amdgpu_ttm_tt_get_usermm(mem->bo->tbo.ttm)) {
		amdgpu_hmm_unregister(mem->bo);
		mutex_lock(&process_info->notifier_lock);
		amdgpu_ttm_tt_discard_user_pages(mem->bo->tbo.ttm, mem->range);
		amdgpu_hmm_range_free(mem->range);
		mutex_unlock(&process_info->notifier_lock);
	}

@@ -2549,7 +2549,7 @@ static int update_invalid_user_pages(struct amdkfd_process_info *process_info,

		bo = mem->bo;

		amdgpu_ttm_tt_discard_user_pages(bo->tbo.ttm, mem->range);
		amdgpu_hmm_range_free(mem->range);
		mem->range = NULL;

		/* BO reservations and getting user pages (hmm_range_fault)
@@ -2573,13 +2573,13 @@ static int update_invalid_user_pages(struct amdkfd_process_info *process_info,
			}
		}

		mem->range = kzalloc(sizeof(*mem->range), GFP_KERNEL);
		mem->range = amdgpu_hmm_range_alloc();
		if (unlikely(!mem->range))
			return -ENOMEM;
		/* Get updated user pages */
		ret = amdgpu_ttm_tt_get_user_pages(bo, mem->range);
		if (ret) {
			kfree(mem->range);
			amdgpu_hmm_range_free(mem->range);
			mem->range = NULL;
			pr_debug("Failed %d to get user pages\n", ret);

@@ -2753,8 +2753,8 @@ static int confirm_valid_user_pages_locked(struct amdkfd_process_info *process_i
			continue;

		/* Only check mem with hmm range associated */
		valid = amdgpu_ttm_tt_get_user_pages_done(
					mem->bo->tbo.ttm, mem->range);
		valid = amdgpu_hmm_range_valid(mem->range);
		amdgpu_hmm_range_free(mem->range);

		mem->range = NULL;
		if (!valid) {
+5 −6
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@
#include "amdgpu_gmc.h"
#include "amdgpu_gem.h"
#include "amdgpu_ras.h"
#include "amdgpu_hmm.h"

static int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p,
				 struct amdgpu_device *adev,
@@ -891,7 +892,7 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
		bool userpage_invalidated = false;
		struct amdgpu_bo *bo = e->bo;

		e->range = kzalloc(sizeof(*e->range), GFP_KERNEL);
		e->range = amdgpu_hmm_range_alloc();
		if (unlikely(!e->range))
			return -ENOMEM;

@@ -994,9 +995,7 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,

out_free_user_pages:
	amdgpu_bo_list_for_each_userptr_entry(e, p->bo_list) {
		struct amdgpu_bo *bo = e->bo;

		amdgpu_ttm_tt_get_user_pages_done(bo->tbo.ttm, e->range);
		amdgpu_hmm_range_free(e->range);
		e->range = NULL;
	}
	mutex_unlock(&p->bo_list->bo_list_mutex);
@@ -1327,8 +1326,8 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
	 */
	r = 0;
	amdgpu_bo_list_for_each_userptr_entry(e, p->bo_list) {
		r |= !amdgpu_ttm_tt_get_user_pages_done(e->bo->tbo.ttm,
							e->range);
		r |= !amdgpu_hmm_range_valid(e->range);
		amdgpu_hmm_range_free(e->range);
		e->range = NULL;
	}
	if (r) {
+3 −4
Original line number Diff line number Diff line
@@ -572,12 +572,12 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data,
		goto release_object;

	if (args->flags & AMDGPU_GEM_USERPTR_VALIDATE) {
		range = kzalloc(sizeof(*range), GFP_KERNEL);
		range = amdgpu_hmm_range_alloc();
		if (unlikely(!range))
			return -ENOMEM;
		r = amdgpu_ttm_tt_get_user_pages(bo, range);
		if (r) {
			kfree(range);
			amdgpu_hmm_range_free(range);
			goto release_object;
		}
		r = amdgpu_bo_reserve(bo, true);
@@ -601,8 +601,7 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data,

user_pages_done:
	if (args->flags & AMDGPU_GEM_USERPTR_VALIDATE)
		amdgpu_ttm_tt_get_user_pages_done(bo->tbo.ttm, range);

		amdgpu_hmm_range_free(range);
release_object:
	drm_gem_object_put(gobj);

+17 −6
Original line number Diff line number Diff line
@@ -226,14 +226,25 @@ int amdgpu_hmm_range_get_pages(struct mmu_interval_notifier *notifier,
	return r;
}

bool amdgpu_hmm_range_get_pages_done(struct hmm_range *hmm_range)
bool amdgpu_hmm_range_valid(struct hmm_range *hmm_range)
{
	bool r;
	if (!hmm_range)
		return false;

	r = mmu_interval_read_retry(hmm_range->notifier,
	return !mmu_interval_read_retry(hmm_range->notifier,
					hmm_range->notifier_seq);
}

struct hmm_range *amdgpu_hmm_range_alloc(void)
{
	return kzalloc(sizeof(struct hmm_range), GFP_KERNEL);
}

void amdgpu_hmm_range_free(struct hmm_range *hmm_range)
{
	if (!hmm_range)
		return;

	kvfree(hmm_range->hmm_pfns);
	kfree(hmm_range);

	return r;
}
+16 −1
Original line number Diff line number Diff line
@@ -35,9 +35,11 @@ int amdgpu_hmm_range_get_pages(struct mmu_interval_notifier *notifier,
			       uint64_t start, uint64_t npages, bool readonly,
			       void *owner,
			       struct hmm_range *hmm_range);
bool amdgpu_hmm_range_get_pages_done(struct hmm_range *hmm_range);

#if defined(CONFIG_HMM_MIRROR)
bool amdgpu_hmm_range_valid(struct hmm_range *hmm_range);
struct hmm_range *amdgpu_hmm_range_alloc(void);
void amdgpu_hmm_range_free(struct hmm_range *hmm_range);
int amdgpu_hmm_register(struct amdgpu_bo *bo, unsigned long addr);
void amdgpu_hmm_unregister(struct amdgpu_bo *bo);
#else
@@ -47,7 +49,20 @@ static inline int amdgpu_hmm_register(struct amdgpu_bo *bo, unsigned long addr)
		      "add CONFIG_ZONE_DEVICE=y in config file to fix this\n");
	return -ENODEV;
}

static inline void amdgpu_hmm_unregister(struct amdgpu_bo *bo) {}

static inline bool amdgpu_hmm_range_valid(struct hmm_range *hmm_range)
{
	return false;
}

static inline struct hmm_range *amdgpu_hmm_range_alloc(void)
{
	return NULL;
}

static inline void amdgpu_hmm_range_free(struct hmm_range *hmm_range) {}
#endif

#endif
Loading