• Konrad Rzeszutek Wilk's avatar
    drm/ttm/dma: Only call set_pages_array_wb when the page is not in WB pool. · 36d7c537
    Konrad Rzeszutek Wilk authored
    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: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
    Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
    36d7c537
ttm_page_alloc_dma.c 29.5 KB