[Intel-gfx] [CI v4 12/13] drm/i915/ttm: disallow CPU fallback mode for ccs pages

Tvrtko Ursulin tvrtko.ursulin at linux.intel.com
Mon Jul 25 15:11:40 UTC 2022


On 25/07/2022 16:09, Matthew Auld wrote:
> Hi,
> 
> On 25/07/2022 15:55, Tvrtko Ursulin wrote:
>>
>> Hi Matt,
>>
>> On 29/06/2022 18:43, Matthew Auld wrote:
>>> Falling back to memcpy/memset shouldn't be allowed if we know we have
>>> CCS state to manage using the blitter. Otherwise we are potentially
>>> leaving the aux CCS state in an unknown state, which smells like an info
>>> leak.
>>>
>>> Fixes: 48760ffe923a ("drm/i915/gt: Clear compress metadata for 
>>> Flat-ccs objects")
>>
>> This is marking the patch for 5.19-rc, but it not apply since the code 
>> seems a bit different. There is no i915_ttm_memcpy_allowed to start 
>> with, which only comes in bfe53be268af ("drm/i915/ttm: handle blitter 
>> failure on DG2"), which is for 5.20.
>>
>> Do you think a version of this patch for 5.19 is needed and if so 
>> could you, or someone in the know, cook one up today or tomorrow at 
>> the latest?
> 
> It needs almost everything in bfe53be268af to close all the holes, 
> AFAIK. But then again this is only for DG2, which is still hidden behind 
> the force_probe stuff (I think), so perhaps not strictly needed for 
> 5.19? What do you think?

It is under force probe. Good point - I agree we then do not have to be 
concerned by it. Thanks!

Regards,

Tvrtko

> 
>>
>> Regards,
>>
>> Tvrtko
>>
>>> Signed-off-by: Matthew Auld <matthew.auld at intel.com>
>>> Cc: Thomas Hellström <thomas.hellstrom at linux.intel.com>
>>> Cc: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
>>> Cc: Tvrtko Ursulin <tvrtko.ursulin at linux.intel.com>
>>> Cc: Jon Bloomfield <jon.bloomfield at intel.com>
>>> Cc: Daniel Vetter <daniel.vetter at ffwll.ch>
>>> Cc: Jordan Justen <jordan.l.justen at intel.com>
>>> Cc: Kenneth Graunke <kenneth at whitecape.org>
>>> Cc: Akeem G Abodunrin <akeem.g.abodunrin at intel.com>
>>> Cc: Ramalingam C <ramalingam.c at intel.com>
>>> ---
>>>   drivers/gpu/drm/i915/gem/i915_gem_object.c   | 26 ++++++++++++++++++++
>>>   drivers/gpu/drm/i915/gem/i915_gem_object.h   |  2 ++
>>>   drivers/gpu/drm/i915/gem/i915_gem_ttm.c      | 18 --------------
>>>   drivers/gpu/drm/i915/gem/i915_gem_ttm_move.c |  3 +++
>>>   4 files changed, 31 insertions(+), 18 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.c 
>>> b/drivers/gpu/drm/i915/gem/i915_gem_object.c
>>> index 642a5d59ce26..ccec4055fde3 100644
>>> --- a/drivers/gpu/drm/i915/gem/i915_gem_object.c
>>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object.c
>>> @@ -717,6 +717,32 @@ bool i915_gem_object_placement_possible(struct 
>>> drm_i915_gem_object *obj,
>>>       return false;
>>>   }
>>> +/**
>>> + * i915_gem_object_needs_ccs_pages - Check whether the object 
>>> requires extra
>>> + * pages when placed in system-memory, in order to save and later 
>>> restore the
>>> + * flat-CCS aux state when the object is moved between local-memory and
>>> + * system-memory
>>> + * @obj: Pointer to the object
>>> + *
>>> + * Return: True if the object needs extra ccs pages. False otherwise.
>>> + */
>>> +bool i915_gem_object_needs_ccs_pages(struct drm_i915_gem_object *obj)
>>> +{
>>> +    bool lmem_placement = false;
>>> +    int i;
>>> +
>>> +    for (i = 0; i < obj->mm.n_placements; i++) {
>>> +        /* Compression is not allowed for the objects with smem 
>>> placement */
>>> +        if (obj->mm.placements[i]->type == INTEL_MEMORY_SYSTEM)
>>> +            return false;
>>> +        if (!lmem_placement &&
>>> +            obj->mm.placements[i]->type == INTEL_MEMORY_LOCAL)
>>> +            lmem_placement = true;
>>> +    }
>>> +
>>> +    return lmem_placement;
>>> +}
>>> +
>>>   void i915_gem_init__objects(struct drm_i915_private *i915)
>>>   {
>>>       INIT_DELAYED_WORK(&i915->mm.free_work, __i915_gem_free_work);
>>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.h 
>>> b/drivers/gpu/drm/i915/gem/i915_gem_object.h
>>> index 0bf3ee27a2a8..6f0a3ce35567 100644
>>> --- a/drivers/gpu/drm/i915/gem/i915_gem_object.h
>>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object.h
>>> @@ -618,6 +618,8 @@ int i915_gem_object_wait_migration(struct 
>>> drm_i915_gem_object *obj,
>>>   bool i915_gem_object_placement_possible(struct drm_i915_gem_object 
>>> *obj,
>>>                       enum intel_memory_type type);
>>> +bool i915_gem_object_needs_ccs_pages(struct drm_i915_gem_object *obj);
>>> +
>>>   int shmem_sg_alloc_table(struct drm_i915_private *i915, struct 
>>> sg_table *st,
>>>                size_t size, struct intel_memory_region *mr,
>>>                struct address_space *mapping,
>>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c 
>>> b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
>>> index 098409a33e10..7e1f8b83077f 100644
>>> --- a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
>>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
>>> @@ -266,24 +266,6 @@ static const struct i915_refct_sgt_ops 
>>> tt_rsgt_ops = {
>>>       .release = i915_ttm_tt_release
>>>   };
>>> -static inline bool
>>> -i915_gem_object_needs_ccs_pages(struct drm_i915_gem_object *obj)
>>> -{
>>> -    bool lmem_placement = false;
>>> -    int i;
>>> -
>>> -    for (i = 0; i < obj->mm.n_placements; i++) {
>>> -        /* Compression is not allowed for the objects with smem 
>>> placement */
>>> -        if (obj->mm.placements[i]->type == INTEL_MEMORY_SYSTEM)
>>> -            return false;
>>> -        if (!lmem_placement &&
>>> -            obj->mm.placements[i]->type == INTEL_MEMORY_LOCAL)
>>> -            lmem_placement = true;
>>> -    }
>>> -
>>> -    return lmem_placement;
>>> -}
>>> -
>>>   static struct ttm_tt *i915_ttm_tt_create(struct ttm_buffer_object *bo,
>>>                        uint32_t page_flags)
>>>   {
>>> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm_move.c 
>>> b/drivers/gpu/drm/i915/gem/i915_gem_ttm_move.c
>>> index df14ac81c128..9a7e50534b84 100644
>>> --- a/drivers/gpu/drm/i915/gem/i915_gem_ttm_move.c
>>> +++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm_move.c
>>> @@ -435,6 +435,9 @@ i915_ttm_memcpy_work_arm(struct 
>>> i915_ttm_memcpy_work *work,
>>>   static bool i915_ttm_memcpy_allowed(struct ttm_buffer_object *bo,
>>>                       struct ttm_resource *dst_mem)
>>>   {
>>> +    if (i915_gem_object_needs_ccs_pages(i915_ttm_to_gem(bo)))
>>> +        return false;
>>> +
>>>       if (!(i915_ttm_resource_mappable(bo->resource) &&
>>>             i915_ttm_resource_mappable(dst_mem)))
>>>           return false;


More information about the Intel-gfx mailing list