[PATCH] drm/amdgpu: Adjust the VM size based on system memory size

Christian König ckoenig.leichtzumerken at gmail.com
Wed Aug 22 06:55:20 UTC 2018


Am 21.08.2018 um 23:45 schrieb Felix Kuehling:
> This patch is meant for amd-staging-drm-next. It's part of my effort to
> reduce differences between kfd-staging and upstream and eventually
> replace all our memory manager hacks with upstream solutions.
>
> This commit should only affect GFXv8 and older. It should not have any
> negative impact, except bigger GPUVM page tables on systems with lots of
> memory. Conversely, this could actually allow making the GPUVM page
> tables smaller on systems with little memory, if we wanted to take
> advantage of that opportunity.
>
> The current minimum is 64GB, which I believe means 32KB page tables and
> page directories. The smallest VM size that makes sense with 2-levels of
> 4KB page tables would be 1GB. If we really want to go that small, I
> should also factor the local VRAM size into the equation.
>
> Regards,
>    Felix
>
>
> On 2018-08-21 05:25 PM, Felix Kuehling wrote:
>> Set the VM size based on system memory size between the ASIC-specific
>> limits given by min_vm_size and max_bits. GFXv9 GPUs will keep their
>> default VM size of 256TB (48 bit). Only older GPUs will adjust VM size
>> depending on system memory size.
>>
>> This makes more VM space available for ROCm applications on GFXv8 GPUs
>> that want to map all available VRAM and system memory in their SVM
>> address space.
>>
>> Signed-off-by: Felix Kuehling <Felix.Kuehling at amd.com>
>> ---
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 26 ++++++++++++++++++++++----
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h |  2 +-
>>   2 files changed, 23 insertions(+), 5 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
>> index 662e8a3..48971cc 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
>> @@ -2482,28 +2482,46 @@ static uint32_t amdgpu_vm_get_block_size(uint64_t vm_size)
>>    * amdgpu_vm_adjust_size - adjust vm size, block size and fragment size
>>    *
>>    * @adev: amdgpu_device pointer
>> - * @vm_size: the default vm size if it's set auto
>> + * @min_vm_size: the minimum vm size in GB if it's set auto
>>    * @fragment_size_default: Default PTE fragment size
>>    * @max_level: max VMPT level
>>    * @max_bits: max address space size in bits
>>    *
>>    */
>> -void amdgpu_vm_adjust_size(struct amdgpu_device *adev, uint32_t vm_size,
>> +void amdgpu_vm_adjust_size(struct amdgpu_device *adev, uint32_t min_vm_size,
>>   			   uint32_t fragment_size_default, unsigned max_level,
>>   			   unsigned max_bits)
>>   {
>> +	unsigned int max_size = 1 << (max_bits - 30);
>> +	unsigned int vm_size;
>>   	uint64_t tmp;
>>   
>>   	/* adjust vm size first */
>>   	if (amdgpu_vm_size != -1) {
>> -		unsigned max_size = 1 << (max_bits - 30);
>> -
>>   		vm_size = amdgpu_vm_size;
>>   		if (vm_size > max_size) {
>>   			dev_warn(adev->dev, "VM size (%d) too large, max is %u GB\n",
>>   				 amdgpu_vm_size, max_size);
>>   			vm_size = max_size;
>>   		}
>> +	} else {
>> +		struct sysinfo si;
>> +		unsigned int phys_ram_gb;
>> +
>> +		/* Optimal VM size depends on the amount of physical
>> +		 * RAM available. Underlying requirements and
>> +		 * assumptions:
>> +		 *
>> +		 *  - Need to map system memory and VRAM from all GPUs
>> +		 *     - VRAM from other GPUs not known here
>> +		 *     - Assume VRAM <= system memory
>> +		 *  - On GFX8 and older, VM space can be segmented for
>> +		 *    different MTYPEs
>> +		 *  - Need to allow room for fragmentation, guard pages etc.
>> +		 */
>> +		si_meminfo(&si);
>> +		phys_ram_gb = ((uint64_t)si.totalram * si.mem_unit) >> 30;

Looks good to me, but I would make sure that round that up before 
shifting it.

>> +		vm_size = min(max(phys_ram_gb * 3, min_vm_size), max_size);

Mhm, "phys_ram_gb * 3"? Maybe add a comment with the rational for that.

Christian.

>>   	}
>>   
>>   	adev->vm_manager.max_pfn = (uint64_t)vm_size << 18;
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
>> index 1162c2b..ab1d23e 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
>> @@ -345,7 +345,7 @@ struct amdgpu_bo_va_mapping *amdgpu_vm_bo_lookup_mapping(struct amdgpu_vm *vm,
>>   void amdgpu_vm_bo_trace_cs(struct amdgpu_vm *vm, struct ww_acquire_ctx *ticket);
>>   void amdgpu_vm_bo_rmv(struct amdgpu_device *adev,
>>   		      struct amdgpu_bo_va *bo_va);
>> -void amdgpu_vm_adjust_size(struct amdgpu_device *adev, uint32_t vm_size,
>> +void amdgpu_vm_adjust_size(struct amdgpu_device *adev, uint32_t min_vm_size,
>>   			   uint32_t fragment_size_default, unsigned max_level,
>>   			   unsigned max_bits);
>>   int amdgpu_vm_ioctl(struct drm_device *dev, void *data, struct drm_file *filp);
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx



More information about the amd-gfx mailing list