diff options
author | Christian König <christian.koenig@amd.com> | 2017-09-19 09:20:42 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-10-09 16:30:17 -0400 |
commit | c6e839a3e299bbff991a3b4136f96ccaca4b276f (patch) | |
tree | ffecfd346a28188d45af833594afeba57c0edd97 | |
parent | a05502e5cfa9abe17a16592be82c2f5692c91f35 (diff) |
drm/ttm: allocate/free multiple pages in a single call
Totally surprisingly this is more efficient than doing it page by page.
Signed-off-by: Christian König <christian.koenig@amd.com>
Acked-by: Felix Kuehling <Felix.Kuehling@amd.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | drivers/gpu/drm/ttm/ttm_page_alloc.c | 29 |
1 files changed, 14 insertions, 15 deletions
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c index e11fd76e06f4..482dd9aa2c84 100644 --- a/drivers/gpu/drm/ttm/ttm_page_alloc.c +++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c | |||
@@ -873,15 +873,14 @@ int ttm_pool_populate(struct ttm_tt *ttm) | |||
873 | if (ttm->state != tt_unpopulated) | 873 | if (ttm->state != tt_unpopulated) |
874 | return 0; | 874 | return 0; |
875 | 875 | ||
876 | for (i = 0; i < ttm->num_pages; ++i) { | 876 | ret = ttm_get_pages(ttm->pages, ttm->num_pages, ttm->page_flags, |
877 | ret = ttm_get_pages(&ttm->pages[i], 1, | 877 | ttm->caching_state); |
878 | ttm->page_flags, | 878 | if (unlikely(ret != 0)) { |
879 | ttm->caching_state); | 879 | ttm_pool_unpopulate(ttm); |
880 | if (ret != 0) { | 880 | return ret; |
881 | ttm_pool_unpopulate(ttm); | 881 | } |
882 | return -ENOMEM; | ||
883 | } | ||
884 | 882 | ||
883 | for (i = 0; i < ttm->num_pages; ++i) { | ||
885 | ret = ttm_mem_global_alloc_page(mem_glob, ttm->pages[i], | 884 | ret = ttm_mem_global_alloc_page(mem_glob, ttm->pages[i], |
886 | PAGE_SIZE); | 885 | PAGE_SIZE); |
887 | if (unlikely(ret != 0)) { | 886 | if (unlikely(ret != 0)) { |
@@ -908,14 +907,14 @@ void ttm_pool_unpopulate(struct ttm_tt *ttm) | |||
908 | unsigned i; | 907 | unsigned i; |
909 | 908 | ||
910 | for (i = 0; i < ttm->num_pages; ++i) { | 909 | for (i = 0; i < ttm->num_pages; ++i) { |
911 | if (ttm->pages[i]) { | 910 | if (!ttm->pages[i]) |
912 | ttm_mem_global_free_page(ttm->glob->mem_glob, | 911 | continue; |
913 | ttm->pages[i], PAGE_SIZE); | 912 | |
914 | ttm_put_pages(&ttm->pages[i], 1, | 913 | ttm_mem_global_free_page(ttm->glob->mem_glob, ttm->pages[i], |
915 | ttm->page_flags, | 914 | PAGE_SIZE); |
916 | ttm->caching_state); | ||
917 | } | ||
918 | } | 915 | } |
916 | ttm_put_pages(ttm->pages, ttm->num_pages, ttm->page_flags, | ||
917 | ttm->caching_state); | ||
919 | ttm->state = tt_unpopulated; | 918 | ttm->state = tt_unpopulated; |
920 | } | 919 | } |
921 | EXPORT_SYMBOL(ttm_pool_unpopulate); | 920 | EXPORT_SYMBOL(ttm_pool_unpopulate); |