diff options
author | Roger He <Hongbo.He@amd.com> | 2017-11-21 01:24:48 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-12-06 12:48:15 -0500 |
commit | 444f8ef3f8f175f0c8bb8a436b1752b1d2d3f5a8 (patch) | |
tree | da65d173060f99486e29d1a4ff618456afed7d2c | |
parent | 154683dd39f0591e1c52745cba62156ab946958c (diff) |
drm/ttm: add page order support in ttm_pages_put
Reviewed-by: Chunming Zhou <david1.zhou@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Roger He <Hongbo.He@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | drivers/gpu/drm/ttm/ttm_page_alloc.c | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c index 359a641d3211..337c228b44ad 100644 --- a/drivers/gpu/drm/ttm/ttm_page_alloc.c +++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c | |||
@@ -296,13 +296,23 @@ static struct ttm_page_pool *ttm_get_pool(int flags, bool huge, | |||
296 | } | 296 | } |
297 | 297 | ||
298 | /* set memory back to wb and free the pages. */ | 298 | /* set memory back to wb and free the pages. */ |
299 | static void ttm_pages_put(struct page *pages[], unsigned npages) | 299 | static void ttm_pages_put(struct page *pages[], unsigned npages, |
300 | unsigned int order) | ||
300 | { | 301 | { |
301 | unsigned i; | 302 | unsigned int i, pages_nr = (1 << order); |
302 | if (set_pages_array_wb(pages, npages)) | 303 | |
303 | pr_err("Failed to set %d pages to wb!\n", npages); | 304 | if (order == 0) { |
304 | for (i = 0; i < npages; ++i) | 305 | if (set_pages_array_wb(pages, npages)) |
305 | __free_page(pages[i]); | 306 | pr_err("Failed to set %d pages to wb!\n", npages); |
307 | } | ||
308 | |||
309 | for (i = 0; i < npages; ++i) { | ||
310 | if (order > 0) { | ||
311 | if (set_pages_wb(pages[i], pages_nr)) | ||
312 | pr_err("Failed to set %d pages to wb!\n", pages_nr); | ||
313 | } | ||
314 | __free_pages(pages[i], order); | ||
315 | } | ||
306 | } | 316 | } |
307 | 317 | ||
308 | static void ttm_pool_update_free_locked(struct ttm_page_pool *pool, | 318 | static void ttm_pool_update_free_locked(struct ttm_page_pool *pool, |
@@ -365,7 +375,7 @@ restart: | |||
365 | */ | 375 | */ |
366 | spin_unlock_irqrestore(&pool->lock, irq_flags); | 376 | spin_unlock_irqrestore(&pool->lock, irq_flags); |
367 | 377 | ||
368 | ttm_pages_put(pages_to_free, freed_pages); | 378 | ttm_pages_put(pages_to_free, freed_pages, pool->order); |
369 | if (likely(nr_free != FREE_ALL_PAGES)) | 379 | if (likely(nr_free != FREE_ALL_PAGES)) |
370 | nr_free -= freed_pages; | 380 | nr_free -= freed_pages; |
371 | 381 | ||
@@ -400,7 +410,7 @@ restart: | |||
400 | spin_unlock_irqrestore(&pool->lock, irq_flags); | 410 | spin_unlock_irqrestore(&pool->lock, irq_flags); |
401 | 411 | ||
402 | if (freed_pages) | 412 | if (freed_pages) |
403 | ttm_pages_put(pages_to_free, freed_pages); | 413 | ttm_pages_put(pages_to_free, freed_pages, pool->order); |
404 | out: | 414 | out: |
405 | if (pages_to_free != static_buf) | 415 | if (pages_to_free != static_buf) |
406 | kfree(pages_to_free); | 416 | kfree(pages_to_free); |