[Intel-gfx] [PATCH 2/2] drm/i915: Allow compaction upto SWIOTLB max segment size

Tvrtko Ursulin tvrtko.ursulin at linux.intel.com
Mon Oct 10 13:39:09 UTC 2016


On 10/10/2016 14:30, Tvrtko Ursulin wrote:
>
> On 10/10/2016 12:49, Chris Wilson wrote:
>> commit 1625e7e549c5 ("drm/i915: make compact dma scatter lists creation
>> work with SWIOTLB backend") took a heavy handed approach to undo the
>> scatterlist compaction in the face of SWIOTLB. (The compaction hit a bug
>> whereby we tried to pass a segment larger than SWIOTLB could handle.) We
>> can be a little more intelligent and try compacting the scatterlist up
>> to the maximum SWIOTLB segment size (when using SWIOTLB).
>>
>> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
>> CC: Imre Deak <imre.deak at intel.com>
>> CC: Daniel Vetter <daniel.vetter at ffwll.ch>
>> Cc: Konrad Rzeszutek Wilk <konrad.wilk at oracle.com>
>> ---
>>   drivers/gpu/drm/i915/i915_gem.c | 23 +++++++++++------------
>>   1 file changed, 11 insertions(+), 12 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/i915_gem.c 
>> b/drivers/gpu/drm/i915/i915_gem.c
>> index ca1a5a5c6f19..8b3474d215a5 100644
>> --- a/drivers/gpu/drm/i915/i915_gem.c
>> +++ b/drivers/gpu/drm/i915/i915_gem.c
>> @@ -2201,6 +2201,7 @@ i915_gem_object_get_pages_gtt(struct 
>> drm_i915_gem_object *obj)
>>       struct sgt_iter sgt_iter;
>>       struct page *page;
>>       unsigned long last_pfn = 0;    /* suppress gcc warning */
>> +    unsigned long max_segment;
>
> unsigned int would be enough.
>
>>       int ret;
>>       gfp_t gfp;
>>   @@ -2211,6 +2212,12 @@ i915_gem_object_get_pages_gtt(struct 
>> drm_i915_gem_object *obj)
>>       GEM_BUG_ON(obj->base.read_domains & I915_GEM_GPU_DOMAINS);
>>       GEM_BUG_ON(obj->base.write_domain & I915_GEM_GPU_DOMAINS);
>>   +    max_segment = obj->base.size;
>> +#ifdef CONFIG_SWIOTLB
>> +    if (swiotlb_nr_tbl())
>> +        max_segment = IO_TLB_SEGSIZE << PAGE_SHIFT;
>> +#endif
>> +
>
> Do you want to use IS_ENABLED here?
>
>>       st = kmalloc(sizeof(*st), GFP_KERNEL);
>>       if (st == NULL)
>>           return ERR_PTR(-ENOMEM);
>> @@ -2252,15 +2259,9 @@ i915_gem_object_get_pages_gtt(struct 
>> drm_i915_gem_object *obj)
>>                   goto err_pages;
>>               }
>>           }
>> -#ifdef CONFIG_SWIOTLB
>> -        if (swiotlb_nr_tbl()) {
>> -            st->nents++;
>> -            sg_set_page(sg, page, PAGE_SIZE, 0);
>> -            sg = sg_next(sg);
>> -            continue;
>> -        }
>> -#endif
>> -        if (!i || page_to_pfn(page) != last_pfn + 1) {
>> +        if (!i ||
>> +            sg->length >= max_segment ||
>
> I think this can overflow by a page, should be "sg->length >= 
> (max_segment - PAGE_SIZE)", or alternatively substract one page at the 
> max_segment assignment.
>

Or not. :)

Regards.

Tvrtko



More information about the Intel-gfx mailing list