[Intel-xe] [PATCH v4 4/6] drm/xe/buddy: remove the virtualized start

Gwan-gyeong Mun gwan-gyeong.mun at intel.com
Mon Mar 20 08:44:01 UTC 2023



On 3/17/23 3:02 PM, Matthew Auld wrote:
> On 17/03/2023 11:52, Gwan-gyeong Mun wrote:
>>
>>
>> On 3/14/23 10:58 AM, Matthew Auld wrote:
>>> Hopefully not needed anymore. We can add a .compatible() hook once we
>>> need to differentiate between mappable and non-mappable vram. If the
>>> allocation is not contiguous then the start value is kind of
>>> meaningless, so rather just mark as invalid.
>>>
>>> In upstream, TTM wants to eventually remove the ttm_resource.start
>>> usage.
>> Hi Matt,
>> If there is a related rfc or discussion, could you please share a 
>> reference?
> 
> I think it was maybe discussed off list. But there have been patches 
> that try to move in that general direction like: 544432703b2f ("drm/ttm: 
> Add new callbacks to ttm res mgr"). Which gets rid of the main user in 
> ttm for base.start (drivers still make use of it though). Better is to 
> keep it at the resource manager level. The "virtualized" start here is 
> basically trying to workaround the fact that [res.start, res.size] can't 
> really represent a non-contiguous allocations.
> 
> For example, if you look at that patch, ttm was using [res.start, 
> res.size] to help determine if the existing resource was compatible with 
> the new placement. Basically if you want to move a resource from A -> B, 
> where both are the same VRAM, without the above it would always turn the 
> move into a noop, since A & B are the same resource type, and are 
> therefore "compatible".
> 
> However with small-bar, you also have mappable vs non-mappable VRAM, and 
> you might want to move between them, so the "virtualized" start ensures 
> that [res.start, res.end] <= mappable size, even for non-contiguous 
> allocations, if the entire resource is mappable, and vice versa. With 
> the .compatible() hook that is all pushed into the resource manager, so 
> we don't need such tricks. See also the i915 equivalent: da6198afb01d 
> ("drm/i915/ttm: remove the virtualized start hack").
> 
It seems that the part that is difficult to fully understand with this 
patch alone is explained well. Thank you for a detailed description.

And referring to the explanation, the commit where the use of 
ttm_resource.start in ttm_resource_compatible() was deleted was 
confirmed in the commit below.
commit 6d3c900c12d72667341bcff338c252e22728b942 ("drm/ttm: Switch to 
using the new res callback")

Not directly related to this patch, contiguous allocation (using 
TTM_PL_FLAG_CONTIGUOUS flag) allocates resources from one place?

Reviewed-by: Gwan-gyeong Mun <gwan-gyeong.mun at intel.com>
>>>
>>> Signed-off-by: Matthew Auld <matthew.auld at intel.com>
>>> Cc: Lucas De Marchi <lucas.demarchi at intel.com>
>>> Reviewed-by: Maarten Lankhorst <maarten.lankhorst at linux.intel.com>
>>> ---
>>>   drivers/gpu/drm/xe/xe_bo.c           |  6 ++++++
>>>   drivers/gpu/drm/xe/xe_ttm_vram_mgr.c | 29 ++++++++++++++--------------
>>>   2 files changed, 20 insertions(+), 15 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
>>> index 73a7f2cd4ad8..346573f406c2 100644
>>> --- a/drivers/gpu/drm/xe/xe_bo.c
>>> +++ b/drivers/gpu/drm/xe/xe_bo.c
>>> @@ -662,6 +662,12 @@ static int xe_bo_move(struct ttm_buffer_object 
>>> *ttm_bo, bool evict,
>>>                   void *new_addr = gt->mem.vram.mapping +
>>>                       (new_mem->start << PAGE_SHIFT);
>>> +                if (XE_WARN_ON(new_mem->start == 
>>> XE_BO_INVALID_OFFSET)) {
>> Are there really any use cases for moving to memory allocated with 
>> xe_ttm_gtt_mgr_func()?
> 
> The above is only for pinned VRAM objects, which are always contiguous, 
> and therefore have a valid start value. I just added the above sanity 
> check to double check that, and make the error more obvious if we ever 
> trigger it.
> yes, that makes sense.
>>
>> Br,
>> G.G.
>>> +                    ret = -EINVAL;
>>> +                    xe_device_mem_access_put(xe);
>>> +                    goto out;
>>> +                }
>>> +
>>>                   XE_BUG_ON(new_mem->start !=
>>>                         bo->placements->fpfn);
>>> diff --git a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c 
>>> b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
>>> index 159ca7105df1..bafcadaed6b0 100644
>>> --- a/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
>>> +++ b/drivers/gpu/drm/xe/xe_ttm_vram_mgr.c
>>> @@ -54,7 +54,6 @@ static int xe_ttm_vram_mgr_new(struct 
>>> ttm_resource_manager *man,
>>>       struct xe_ttm_vram_mgr_resource *vres;
>>>       u64 size, remaining_size, lpfn, fpfn;
>>>       struct drm_buddy *mm = &mgr->mm;
>>> -    struct drm_buddy_block *block;
>>>       unsigned long pages_per_block;
>>>       int r;
>>> @@ -186,24 +185,24 @@ static int xe_ttm_vram_mgr_new(struct 
>>> ttm_resource_manager *man,
>>>               list_splice_tail(trim_list, &vres->blocks);
>>>       }
>>> -    vres->base.start = 0;
>>> -    list_for_each_entry(block, &vres->blocks, link) {
>>> -        unsigned long start;
>>> +    if (!(vres->base.placement & TTM_PL_FLAG_CONTIGUOUS) &&
>>> +        xe_is_vram_mgr_blocks_contiguous(mm, &vres->blocks))
>>> +        vres->base.placement |= TTM_PL_FLAG_CONTIGUOUS;
>>> -        start = drm_buddy_block_offset(block) +
>>> -            drm_buddy_block_size(mm, block);
>>> -        start >>= PAGE_SHIFT;
>>> +    /*
>>> +     * For some kernel objects we still rely on the start when io 
>>> mapping
>>> +     * the object.
>>> +     */
>>> +    if (vres->base.placement & TTM_PL_FLAG_CONTIGUOUS) {
>>> +        struct drm_buddy_block *block = list_first_entry(&vres->blocks,
>>> +                                 typeof(*block),
>>> +                                 link);
>>> -        if (start > PFN_UP(vres->base.size))
>>> -            start -= PFN_UP(vres->base.size);
>>> -        else
>>> -            start = 0;
>>> -        vres->base.start = max(vres->base.start, start);
>>> +        vres->base.start = drm_buddy_block_offset(block) >> PAGE_SHIFT;
>>> +    } else {
>>> +        vres->base.start = XE_BO_INVALID_OFFSET;
>>>       }
>>> -    if (xe_is_vram_mgr_blocks_contiguous(mm, &vres->blocks))
>>> -        vres->base.placement |= TTM_PL_FLAG_CONTIGUOUS;
>>> -
>>>       *res = &vres->base;
>>>       return 0;


More information about the Intel-xe mailing list