Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Roger He and committed by
Alex Deucher
444f8ef3 154683dd

+18 -8
+18 -8
drivers/gpu/drm/ttm/ttm_page_alloc.c
··· 296 296 } 297 297 298 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 - if (set_pages_array_wb(pages, npages)) 303 - pr_err("Failed to set %d pages to wb!\n", npages); 304 - for (i = 0; i < npages; ++i) 305 - __free_page(pages[i]); 302 + unsigned int i, pages_nr = (1 << order); 303 + 304 + if (order == 0) { 305 + if (set_pages_array_wb(pages, npages)) 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 318 static void ttm_pool_update_free_locked(struct ttm_page_pool *pool, ··· 375 365 */ 376 366 spin_unlock_irqrestore(&pool->lock, irq_flags); 377 367 378 - ttm_pages_put(pages_to_free, freed_pages); 368 + ttm_pages_put(pages_to_free, freed_pages, pool->order); 379 369 if (likely(nr_free != FREE_ALL_PAGES)) 380 370 nr_free -= freed_pages; 381 371 ··· 410 400 spin_unlock_irqrestore(&pool->lock, irq_flags); 411 401 412 402 if (freed_pages) 413 - ttm_pages_put(pages_to_free, freed_pages); 403 + ttm_pages_put(pages_to_free, freed_pages, pool->order); 414 404 out: 415 405 if (pages_to_free != static_buf) 416 406 kfree(pages_to_free);