Re: [PATCH 1/3] drm/ttm/dma: Only call set_pages_array_wb when thepage is not in WB pool.
From: Jerome Glisse
Date: Thu Jan 05 2012 - 10:52:04 EST
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
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/