[PATCH 3/4] drm/amdgpu: Determing PTE flags separately for each mapping (v2)

Koenig, Christian Christian.Koenig at amd.com
Tue Aug 27 09:00:19 UTC 2019


Am 27.08.19 um 01:07 schrieb Kuehling, Felix:
> The same BO can be mapped with different PTE flags by different GPUs.
> Therefore determine the PTE flags separately for each mapping instead
> of storing them in the KFD buffer object.
>
> Add a helper function to determine the PTE flags to be extended with
> ASIC and memory-type-specific logic in subsequent commits.
>
> v2: Split Arcturus-specific MTYPE changes into separate commit
>
> Signed-off-by: Felix Kuehling <Felix.Kuehling at amd.com>

Acked-by: Christian K├Ânig <christian.koenig at amd.com>

> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h    |  2 +-
>   .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c  | 39 +++++++++++--------
>   2 files changed, 24 insertions(+), 17 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
> index e519df3fd2b6..1af8f83f7e02 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
> @@ -57,7 +57,7 @@ struct kgd_mem {
>   	unsigned int mapped_to_gpu_memory;
>   	uint64_t va;
>   
> -	uint32_t mapping_flags;
> +	uint32_t alloc_flags;
>   
>   	atomic_t invalid;
>   	struct amdkfd_process_info *process_info;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
> index 44a52b09cc58..1b7340a18f67 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
> @@ -355,6 +355,23 @@ static int vm_update_pds(struct amdgpu_vm *vm, struct amdgpu_sync *sync)
>   	return amdgpu_sync_fence(NULL, sync, vm->last_update, false);
>   }
>   
> +static uint32_t get_pte_flags(struct amdgpu_device *adev, struct kgd_mem *mem)
> +{
> +	bool coherent = mem->alloc_flags & ALLOC_MEM_FLAGS_COHERENT;
> +	uint32_t mapping_flags;
> +
> +	mapping_flags = AMDGPU_VM_PAGE_READABLE;
> +	if (mem->alloc_flags & ALLOC_MEM_FLAGS_WRITABLE)
> +		mapping_flags |= AMDGPU_VM_PAGE_WRITEABLE;
> +	if (mem->alloc_flags & ALLOC_MEM_FLAGS_EXECUTABLE)
> +		mapping_flags |= AMDGPU_VM_PAGE_EXECUTABLE;
> +
> +	mapping_flags |= coherent ?
> +		AMDGPU_VM_MTYPE_UC : AMDGPU_VM_MTYPE_NC;
> +
> +	return amdgpu_gmc_get_pte_flags(adev, mapping_flags);
> +}
> +
>   /* add_bo_to_vm - Add a BO to a VM
>    *
>    * Everything that needs to bo done only once when a BO is first added
> @@ -403,8 +420,7 @@ static int add_bo_to_vm(struct amdgpu_device *adev, struct kgd_mem *mem,
>   	}
>   
>   	bo_va_entry->va = va;
> -	bo_va_entry->pte_flags = amdgpu_gmc_get_pte_flags(adev,
> -							 mem->mapping_flags);
> +	bo_va_entry->pte_flags = get_pte_flags(adev, mem);
>   	bo_va_entry->kgd_dev = (void *)adev;
>   	list_add(&bo_va_entry->bo_list, list_bo_va);
>   
> @@ -1081,7 +1097,6 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
>   	int byte_align;
>   	u32 domain, alloc_domain;
>   	u64 alloc_flags;
> -	uint32_t mapping_flags;
>   	int ret;
>   
>   	/*
> @@ -1143,16 +1158,7 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
>   			adev->asic_type != CHIP_VEGAM) ?
>   			VI_BO_SIZE_ALIGN : 1;
>   
> -	mapping_flags = AMDGPU_VM_PAGE_READABLE;
> -	if (flags & ALLOC_MEM_FLAGS_WRITABLE)
> -		mapping_flags |= AMDGPU_VM_PAGE_WRITEABLE;
> -	if (flags & ALLOC_MEM_FLAGS_EXECUTABLE)
> -		mapping_flags |= AMDGPU_VM_PAGE_EXECUTABLE;
> -	if (flags & ALLOC_MEM_FLAGS_COHERENT)
> -		mapping_flags |= AMDGPU_VM_MTYPE_UC;
> -	else
> -		mapping_flags |= AMDGPU_VM_MTYPE_NC;
> -	(*mem)->mapping_flags = mapping_flags;
> +	(*mem)->alloc_flags = flags;
>   
>   	amdgpu_sync_create(&(*mem)->sync);
>   
> @@ -1625,9 +1631,10 @@ int amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev *kgd,
>   
>   	INIT_LIST_HEAD(&(*mem)->bo_va_list);
>   	mutex_init(&(*mem)->lock);
> -	(*mem)->mapping_flags =
> -		AMDGPU_VM_PAGE_READABLE | AMDGPU_VM_PAGE_WRITEABLE |
> -		AMDGPU_VM_PAGE_EXECUTABLE | AMDGPU_VM_MTYPE_NC;
> +	(*mem)->alloc_flags =
> +		((bo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM) ?
> +		 ALLOC_MEM_FLAGS_VRAM : ALLOC_MEM_FLAGS_GTT) |
> +		ALLOC_MEM_FLAGS_WRITABLE | ALLOC_MEM_FLAGS_EXECUTABLE;
>   
>   	(*mem)->bo = amdgpu_bo_ref(bo);
>   	(*mem)->va = va;



More information about the amd-gfx mailing list