[PATCH 1/2] drm/radeon: do not move bo to different placement at each cs
On Mon, Dec 10, 2012 at 3:16 PM, Jerome Glisse wrote: > On Thu, Nov 29, 2012 at 10:35 AM, wrote: >> From: Jerome Glisse >> >> 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 > > 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_headlist; >> /* Protected by tbo.reserved */ >> u32 placements[3]; >> + u32 busy_placements[3]; >> struct ttm_placementplacement; >> struct ttm_buffer_objecttbo; >> 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(>tbo, >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 >>
Re: [PATCH 1/2] drm/radeon: do not move bo to different placement at each cs
On Mon, Dec 10, 2012 at 3:16 PM, Jerome Glisse j.gli...@gmail.com wrote: On Thu, Nov 29, 2012 at 10:35 AM, j.gli...@gmail.com wrote: From: Jerome Glisse jgli...@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 jgli...@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_headlist; /* Protected by tbo.reserved */ u32 placements[3]; + u32 busy_placements[3]; struct ttm_placementplacement; struct ttm_buffer_objecttbo; 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 ___ dri-devel mailing list dri-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/dri-devel
[PATCH 1/2] drm/radeon: do not move bo to different placement at each cs
On Thu, Nov 29, 2012 at 10:35 AM, wrote: > From: Jerome Glisse > > 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 What about including this for 3.8 it will mostly fix all regression performance and is a first valid step for proper bo placement. 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_headlist; > /* Protected by tbo.reserved */ > u32 placements[3]; > + u32 busy_placements[3]; > struct ttm_placementplacement; > struct ttm_buffer_objecttbo; > 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(>tbo, >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 >
Re: [PATCH 1/2] drm/radeon: do not move bo to different placement at each cs
On Thu, Nov 29, 2012 at 10:35 AM, j.gli...@gmail.com wrote: From: Jerome Glisse jgli...@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 jgli...@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. 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_headlist; /* Protected by tbo.reserved */ u32 placements[3]; + u32 busy_placements[3]; struct ttm_placementplacement; struct ttm_buffer_objecttbo; 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 ___ dri-devel mailing list dri-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/dri-devel
[PATCH 1/2] drm/radeon: do not move bo to different placement at each cs
From: Jerome GlisseThe 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 --- 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_headlist; /* Protected by tbo.reserved */ u32 placements[3]; + u32 busy_placements[3]; struct ttm_placementplacement; struct ttm_buffer_objecttbo; 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(>tbo, >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
[PATCH 1/2] drm/radeon: do not move bo to different placement at each cs
From: Jerome Glisse jgli...@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 jgli...@redhat.com --- 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_headlist; /* Protected by tbo.reserved */ u32 placements[3]; + u32 busy_placements[3]; struct ttm_placementplacement; struct ttm_buffer_objecttbo; 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 ___ dri-devel mailing list dri-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/dri-devel