static struct page *__ttm_tt_get_page(struct ttm_tt *ttm, int index) { struct page *p; struct list_head h; struct ttm_mem_global *mem_glob = ttm->glob->mem_glob; int ret; while (NULL == (p = ttm->pages[index])) { INIT_LIST_HEAD(&h); ret = ttm_get_pages(&h, ttm->page_flags, ttm->caching_state, 1); if (ret != 0) return NULL; p = list_first_entry(&h, struct page, lru); ret = ttm_mem_global_alloc_page(mem_glob, p, false, false); if (unlikely(ret != 0)) goto out_err; if (PageHighMem(p)) ttm->pages[--ttm->first_himem_page] = p; else ttm->pages[++ttm->last_lomem_page] = p; } return p; out_err: put_page(p); return NULL; }
int ttm_pool_populate(struct ttm_tt *ttm) { struct ttm_mem_global *mem_glob = ttm->glob->mem_glob; unsigned i; int ret; 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, ttm->caching_state); if (ret != 0) { ttm_pool_unpopulate(ttm); return -ENOMEM; } } ttm->state = tt_unbound; return 0; }