Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c6e839a3 authored by Christian König's avatar Christian König Committed by Alex Deucher
Browse files

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: default avatarChristian König <christian.koenig@amd.com>
Acked-by: default avatarFelix Kuehling <Felix.Kuehling@amd.com>
Acked-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent a05502e5
Loading
Loading
Loading
Loading
+14 −15
Original line number Diff line number Diff line
@@ -873,15 +873,14 @@ int ttm_pool_populate(struct ttm_tt *ttm)
	if (ttm->state != tt_unpopulated)
		return 0;

	for (i = 0; i < ttm->num_pages; ++i) {
		ret = ttm_get_pages(&ttm->pages[i], 1,
				    ttm->page_flags,
	ret = ttm_get_pages(ttm->pages, ttm->num_pages, ttm->page_flags,
			    ttm->caching_state);
		if (ret != 0) {
	if (unlikely(ret != 0)) {
		ttm_pool_unpopulate(ttm);
			return -ENOMEM;
		return ret;
	}

	for (i = 0; i < ttm->num_pages; ++i) {
		ret = ttm_mem_global_alloc_page(mem_glob, ttm->pages[i],
						PAGE_SIZE);
		if (unlikely(ret != 0)) {
@@ -908,14 +907,14 @@ void ttm_pool_unpopulate(struct ttm_tt *ttm)
	unsigned i;

	for (i = 0; i < ttm->num_pages; ++i) {
		if (ttm->pages[i]) {
			ttm_mem_global_free_page(ttm->glob->mem_glob,
						 ttm->pages[i], PAGE_SIZE);
			ttm_put_pages(&ttm->pages[i], 1,
				      ttm->page_flags,
				      ttm->caching_state);
		}
		if (!ttm->pages[i])
			continue;

		ttm_mem_global_free_page(ttm->glob->mem_glob, ttm->pages[i],
					 PAGE_SIZE);
	}
	ttm_put_pages(ttm->pages, ttm->num_pages, ttm->page_flags,
		      ttm->caching_state);
	ttm->state = tt_unpopulated;
}
EXPORT_SYMBOL(ttm_pool_unpopulate);