Re: [PATCH 1/3] drm/ttm/dma: Only call set_pages_array_wb when the page is not in WB pool.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux