On Wed, Jan 04, 2012 at 04:35:14PM -0500, Konrad Rzeszutek Wilk wrote: > Otherwise we are doing redundant work. Especially since the 'unbind' > and 'unpopulate' have been merged and nouveau driver ends up calling > it quite excessivly. On a GeForce 8600 GT with Gnome Shell (GNOME 3) > we end up spending about 54% CPU time in __change_page_attr_set_clr > checking the page flags. > > The callgraph (annotated) looks as so before this patch: > > 53.29% gnome-shell [kernel.kallsyms] [k] static_protections > | > --- static_protections > | > |--91.80%-- __change_page_attr_set_clr > | change_page_attr_set_clr > | set_pages_array_wb > | | > | |--96.55%-- ttm_dma_unpopulate > | | nouveau_ttm_tt_unpopulate > | | ttm_tt_destroy > | | ttm_bo_cleanup_memtype_use > | | ttm_bo_release > | | kref_put > | | ttm_bo_unref > | | nouveau_gem_object_del > | | drm_gem_object_free > | | kref_put > | | drm_gem_object_unreference_unlocked > | | drm_gem_object_handle_unreference_unlocked.part.1 > | | drm_gem_handle_delete > | | drm_gem_close_ioctl > | | drm_ioctl > | | do_vfs_ioctl > | | sys_ioctl > | | system_call_fastpath > | | __GI___ioctl > | | > | --3.45%-- ttm_dma_pages_put > | ttm_dma_page_pool_free > | ttm_dma_unpopulate > | nouveau_ttm_tt_unpopulate > | ttm_tt_destroy > | ttm_bo_cleanup_memtype_use > | ttm_bo_release > | kref_put > | ttm_bo_unref > | nouveau_gem_object_del > | drm_gem_object_free > | kref_put > | drm_gem_object_unreference_unlocked > | drm_gem_object_handle_unreference_unlocked.part.1 > | drm_gem_handle_delete > | drm_gem_close_ioctl > | drm_ioctl > | do_vfs_ioctl > | sys_ioctl > | system_call_fastpath > | __GI___ioctl > | > --8.20%-- change_page_attr_set_clr > set_pages_array_wb > | > |--93.76%-- ttm_dma_unpopulate > | nouveau_ttm_tt_unpopulate > | ttm_tt_destroy > | ttm_bo_cleanup_memtype_use > | ttm_bo_release > | kref_put > | ttm_bo_unref > | nouveau_gem_object_del > | drm_gem_object_free > | kref_put > | drm_gem_object_unreference_unlocked > | drm_gem_object_handle_unreference_unlocked.part.1 > | drm_gem_handle_delete > | drm_gem_close_ioctl > | drm_ioctl > | do_vfs_ioctl > | sys_ioctl > | system_call_fastpath > | __GI___ioctl > | > --6.24%-- ttm_dma_pages_put > ttm_dma_page_pool_free > ttm_dma_unpopulate > nouveau_ttm_tt_unpopulate > ttm_tt_destroy > ttm_bo_cleanup_memtype_use > ttm_bo_release > kref_put > ttm_bo_unref > nouveau_gem_object_del > drm_gem_object_free > kref_put > drm_gem_object_unreference_unlocked > drm_gem_object_handle_unreference_unlocked.part.1 > drm_gem_handle_delete > drm_gem_close_ioctl > drm_ioctl > do_vfs_ioctl > sys_ioctl > system_call_fastpath > __GI___ioctl > > and after this patch all of that disappears. > > Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> Reviewed-by: Jerome Glisse <jglisse@xxxxxxxxxx> > --- > drivers/gpu/drm/ttm/ttm_page_alloc_dma.c | 7 +++++-- > 1 files changed, 5 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c > index 6678abc..6c06d0b 100644 > --- a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c > +++ b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c > @@ -384,7 +384,9 @@ static void ttm_dma_pages_put(struct dma_pool *pool, struct list_head *d_pages, > { > struct dma_page *d_page, *tmp; > > - if (npages && set_pages_array_wb(pages, npages)) > + /* Don't set WB on WB page pool. */ > + if (npages && !(pool->type & IS_CACHED) && > + set_pages_array_wb(pages, npages)) > pr_err(TTM_PFX "%s: Failed to set %d pages to wb!\n", > pool->dev_name, npages); > > @@ -396,7 +398,8 @@ static void ttm_dma_pages_put(struct dma_pool *pool, struct list_head *d_pages, > > static void ttm_dma_page_put(struct dma_pool *pool, struct dma_page *d_page) > { > - if (set_pages_array_wb(&d_page->p, 1)) > + /* Don't set WB on WB page pool. */ > + if (!(pool->type & IS_CACHED) && set_pages_array_wb(&d_page->p, 1)) > pr_err(TTM_PFX "%s: Failed to set %d pages to wb!\n", > pool->dev_name, 1); > > -- > 1.7.7.4 > _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel