[PATCH v4 7/8] drm/v3d: Use gemfs/THP in BO creation if available

Maíra Canal mcanal at igalia.com
Mon Apr 29 16:52:50 UTC 2024


Hi Iago,

On 4/29/24 02:22, Iago Toral wrote:
> Hi Maíra,
> 
> a question below:
> 
> El dom, 28-04-2024 a las 09:40 -0300, Maíra Canal escribió:
>> Although Big/Super Pages could appear naturally, it would be quite
>> hard
>> to have 1MB or 64KB allocated contiguously naturally. Therefore, we
>> can
>> force the creation of large pages allocated contiguously by using a
>> mountpoint with "huge=within_size" enabled.
>>
>> Therefore, as V3D has a mountpoint with "huge=within_size" (if user
>> has
>> THP enabled), use this mountpoint for BO creation if available. This
>> will allow us to create large pages allocated contiguously and make
>> use
>> of Big/Super Pages.
>>
>> Signed-off-by: Maíra Canal <mcanal at igalia.com>
>> Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at igalia.com>
>> ---
>>
> 
> (...)
> 
>> @@ -130,10 +140,17 @@ struct v3d_bo *v3d_bo_create(struct drm_device
>> *dev, struct drm_file *file_priv,
>>   			     size_t unaligned_size)
>>   {
>>   	struct drm_gem_shmem_object *shmem_obj;
>> +	struct v3d_dev *v3d = to_v3d_dev(dev);
>>   	struct v3d_bo *bo;
>>   	int ret;
>>   
>> -	shmem_obj = drm_gem_shmem_create(dev, unaligned_size);
>> +	/* Let the user opt out of allocating the BOs with THP */
>> +	if (v3d->gemfs)
>> +		shmem_obj = drm_gem_shmem_create_with_mnt(dev,
>> unaligned_size,
>> +							  v3d-
>>> gemfs);
>> +	else
>> +		shmem_obj = drm_gem_shmem_create(dev,
>> unaligned_size);
>> +
>>   	if (IS_ERR(shmem_obj))
>>   		return ERR_CAST(shmem_obj);
>>   	bo = to_v3d_bo(&shmem_obj->base);
> 
> 
> if I read this correctly when we have THP we always allocate with that,
> Even objects that are smaller than 64KB. I was wondering if there is
> any benefit/downside to this or if the behavior for small allocations
> is the same we had without the new mount point.

I'm assuming that your concern is related to memory pressure and memory
fragmentation.

As we are using `huge=within_size`, we only allocate a huge page if it
will be fully within `i_size`. When using `huge=within_size`, we can
optimize the performance for smaller files without forcing larger files
to also use huge pages. I don't understand `huge=within_size` in full
details, but it is possible to check that it is able to avoid the system
(even the RPi) to go OOM. Although it is slightly less performant than
`huge=always` (used in v1), I believe it is more ideal for a system such
as the RPi due to the memory requirements.

Best Regards,
- Maíra

> 
> Iago


More information about the dri-devel mailing list