[PATCH 1/2] drm/radeon: do not move bo to different placement at each cs

Alex Deucher alexdeucher at gmail.com
Tue Dec 11 09:18:38 PST 2012


On Mon, Dec 10, 2012 at 3:16 PM, Jerome Glisse <j.glisse at gmail.com> wrote:
> On Thu, Nov 29, 2012 at 10:35 AM,  <j.glisse at gmail.com> wrote:
>> From: Jerome Glisse <jglisse at redhat.com>
>>
>> The bo creation placement is where the bo will be. Instead of trying
>> to move bo at each command stream let this work to another worker
>> thread that will use more advance heuristic.
>>
>> Signed-off-by: Jerome Glisse <jglisse at redhat.com>
>
> What about including this for 3.8 it will mostly fix all regression
> performance and is a first valid step for proper bo placement.

Looks good to me.  I'll add it to my 3.8 tree unless there are any objections.

Alex

>
> Cheers,
> Jerome
>
>> ---
>>  drivers/gpu/drm/radeon/radeon.h        |  1 +
>>  drivers/gpu/drm/radeon/radeon_object.c | 17 ++++++++---------
>>  2 files changed, 9 insertions(+), 9 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
>> index 8c42d54..0a2664c 100644
>> --- a/drivers/gpu/drm/radeon/radeon.h
>> +++ b/drivers/gpu/drm/radeon/radeon.h
>> @@ -313,6 +313,7 @@ struct radeon_bo {
>>         struct list_head                list;
>>         /* Protected by tbo.reserved */
>>         u32                             placements[3];
>> +       u32                             busy_placements[3];
>>         struct ttm_placement            placement;
>>         struct ttm_buffer_object        tbo;
>>         struct ttm_bo_kmap_obj          kmap;
>> diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
>> index 3f9f3bb..e25ae20 100644
>> --- a/drivers/gpu/drm/radeon/radeon_object.c
>> +++ b/drivers/gpu/drm/radeon/radeon_object.c
>> @@ -84,7 +84,6 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
>>         rbo->placement.fpfn = 0;
>>         rbo->placement.lpfn = 0;
>>         rbo->placement.placement = rbo->placements;
>> -       rbo->placement.busy_placement = rbo->placements;
>>         if (domain & RADEON_GEM_DOMAIN_VRAM)
>>                 rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED |
>>                                         TTM_PL_FLAG_VRAM;
>> @@ -105,6 +104,14 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
>>         if (!c)
>>                 rbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
>>         rbo->placement.num_placement = c;
>> +
>> +       c = 0;
>> +       rbo->placement.busy_placement = rbo->busy_placements;
>> +       if (rbo->rdev->flags & RADEON_IS_AGP) {
>> +               rbo->busy_placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_TT;
>> +       } else {
>> +               rbo->busy_placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_TT;
>> +       }
>>         rbo->placement.num_busy_placement = c;
>>  }
>>
>> @@ -360,17 +367,9 @@ int radeon_bo_list_validate(struct list_head *head)
>>         list_for_each_entry(lobj, head, tv.head) {
>>                 bo = lobj->bo;
>>                 if (!bo->pin_count) {
>> -                       domain = lobj->wdomain ? lobj->wdomain : lobj->rdomain;
>> -
>> -               retry:
>> -                       radeon_ttm_placement_from_domain(bo, domain);
>>                         r = ttm_bo_validate(&bo->tbo, &bo->placement,
>>                                                 true, false, false);
>>                         if (unlikely(r)) {
>> -                               if (r != -ERESTARTSYS && domain == RADEON_GEM_DOMAIN_VRAM) {
>> -                                       domain |= RADEON_GEM_DOMAIN_GTT;
>> -                                       goto retry;
>> -                               }
>>                                 return r;
>>                         }
>>                 }
>> --
>> 1.7.11.7
>>


More information about the dri-devel mailing list