aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoger He <Hongbo.He@amd.com>2017-11-21 01:24:48 -0500
committerAlex Deucher <alexander.deucher@amd.com>2017-12-06 12:48:15 -0500
commit444f8ef3f8f175f0c8bb8a436b1752b1d2d3f5a8 (patch)
treeda65d173060f99486e29d1a4ff618456afed7d2c
parent154683dd39f0591e1c52745cba62156ab946958c (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.c26
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. */
299static void ttm_pages_put(struct page *pages[], unsigned npages) 299static 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
308static void ttm_pool_update_free_locked(struct ttm_page_pool *pool, 318static 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);
404out: 414out:
405 if (pages_to_free != static_buf) 415 if (pages_to_free != static_buf)
406 kfree(pages_to_free); 416 kfree(pages_to_free);