|
@@ -43,8 +43,6 @@
|
|
|
#include "ttm/ttm_placement.h"
|
|
|
#include "ttm/ttm_page_alloc.h"
|
|
|
|
|
|
-static int ttm_tt_swapin(struct ttm_tt *ttm);
|
|
|
-
|
|
|
/**
|
|
|
* Allocates storage for pointers to the pages that back the ttm.
|
|
|
*/
|
|
@@ -63,69 +61,6 @@ static void ttm_tt_free_page_directory(struct ttm_tt *ttm)
|
|
|
ttm->dma_address = NULL;
|
|
|
}
|
|
|
|
|
|
-static struct page *__ttm_tt_get_page(struct ttm_tt *ttm, int index)
|
|
|
-{
|
|
|
- struct page *p;
|
|
|
- struct ttm_mem_global *mem_glob = ttm->glob->mem_glob;
|
|
|
- int ret;
|
|
|
-
|
|
|
- if (NULL == (p = ttm->pages[index])) {
|
|
|
-
|
|
|
- ret = ttm_get_pages(&p, ttm->page_flags, ttm->caching_state, 1,
|
|
|
- &ttm->dma_address[index]);
|
|
|
- if (ret != 0)
|
|
|
- return NULL;
|
|
|
-
|
|
|
- ret = ttm_mem_global_alloc_page(mem_glob, p, false, false);
|
|
|
- if (unlikely(ret != 0))
|
|
|
- goto out_err;
|
|
|
-
|
|
|
- ttm->pages[index] = p;
|
|
|
- }
|
|
|
- return p;
|
|
|
-out_err:
|
|
|
- ttm_put_pages(&p, 1, ttm->page_flags,
|
|
|
- ttm->caching_state, &ttm->dma_address[index]);
|
|
|
- return NULL;
|
|
|
-}
|
|
|
-
|
|
|
-struct page *ttm_tt_get_page(struct ttm_tt *ttm, int index)
|
|
|
-{
|
|
|
- int ret;
|
|
|
-
|
|
|
- if (unlikely(ttm->page_flags & TTM_PAGE_FLAG_SWAPPED)) {
|
|
|
- ret = ttm_tt_swapin(ttm);
|
|
|
- if (unlikely(ret != 0))
|
|
|
- return NULL;
|
|
|
- }
|
|
|
- return __ttm_tt_get_page(ttm, index);
|
|
|
-}
|
|
|
-
|
|
|
-int ttm_tt_populate(struct ttm_tt *ttm)
|
|
|
-{
|
|
|
- struct page *page;
|
|
|
- unsigned long i;
|
|
|
- int ret;
|
|
|
-
|
|
|
- if (ttm->state != tt_unpopulated)
|
|
|
- return 0;
|
|
|
-
|
|
|
- if (unlikely(ttm->page_flags & TTM_PAGE_FLAG_SWAPPED)) {
|
|
|
- ret = ttm_tt_swapin(ttm);
|
|
|
- if (unlikely(ret != 0))
|
|
|
- return ret;
|
|
|
- }
|
|
|
-
|
|
|
- for (i = 0; i < ttm->num_pages; ++i) {
|
|
|
- page = __ttm_tt_get_page(ttm, i);
|
|
|
- if (!page)
|
|
|
- return -ENOMEM;
|
|
|
- }
|
|
|
- ttm->state = tt_unbound;
|
|
|
- return 0;
|
|
|
-}
|
|
|
-EXPORT_SYMBOL(ttm_tt_populate);
|
|
|
-
|
|
|
#ifdef CONFIG_X86
|
|
|
static inline int ttm_tt_set_page_caching(struct page *p,
|
|
|
enum ttm_caching_state c_old,
|
|
@@ -227,21 +162,6 @@ int ttm_tt_set_placement_caching(struct ttm_tt *ttm, uint32_t placement)
|
|
|
}
|
|
|
EXPORT_SYMBOL(ttm_tt_set_placement_caching);
|
|
|
|
|
|
-static void ttm_tt_free_alloced_pages(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]);
|
|
|
- ttm_put_pages(&ttm->pages[i], 1, ttm->page_flags,
|
|
|
- ttm->caching_state, &ttm->dma_address[i]);
|
|
|
- }
|
|
|
- }
|
|
|
- ttm->state = tt_unpopulated;
|
|
|
-}
|
|
|
-
|
|
|
void ttm_tt_destroy(struct ttm_tt *ttm)
|
|
|
{
|
|
|
if (unlikely(ttm == NULL))
|
|
@@ -252,7 +172,7 @@ void ttm_tt_destroy(struct ttm_tt *ttm)
|
|
|
}
|
|
|
|
|
|
if (likely(ttm->pages != NULL)) {
|
|
|
- ttm_tt_free_alloced_pages(ttm);
|
|
|
+ ttm->bdev->driver->ttm_tt_unpopulate(ttm);
|
|
|
ttm_tt_free_page_directory(ttm);
|
|
|
}
|
|
|
|
|
@@ -307,7 +227,7 @@ int ttm_tt_bind(struct ttm_tt *ttm, struct ttm_mem_reg *bo_mem)
|
|
|
if (ttm->state == tt_bound)
|
|
|
return 0;
|
|
|
|
|
|
- ret = ttm_tt_populate(ttm);
|
|
|
+ ret = ttm->bdev->driver->ttm_tt_populate(ttm);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
@@ -321,7 +241,7 @@ int ttm_tt_bind(struct ttm_tt *ttm, struct ttm_mem_reg *bo_mem)
|
|
|
}
|
|
|
EXPORT_SYMBOL(ttm_tt_bind);
|
|
|
|
|
|
-static int ttm_tt_swapin(struct ttm_tt *ttm)
|
|
|
+int ttm_tt_swapin(struct ttm_tt *ttm)
|
|
|
{
|
|
|
struct address_space *swap_space;
|
|
|
struct file *swap_storage;
|
|
@@ -343,7 +263,7 @@ static int ttm_tt_swapin(struct ttm_tt *ttm)
|
|
|
ret = PTR_ERR(from_page);
|
|
|
goto out_err;
|
|
|
}
|
|
|
- to_page = __ttm_tt_get_page(ttm, i);
|
|
|
+ to_page = ttm->pages[i];
|
|
|
if (unlikely(to_page == NULL))
|
|
|
goto out_err;
|
|
|
|
|
@@ -364,7 +284,6 @@ static int ttm_tt_swapin(struct ttm_tt *ttm)
|
|
|
|
|
|
return 0;
|
|
|
out_err:
|
|
|
- ttm_tt_free_alloced_pages(ttm);
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
@@ -416,7 +335,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistent_swap_storage)
|
|
|
page_cache_release(to_page);
|
|
|
}
|
|
|
|
|
|
- ttm_tt_free_alloced_pages(ttm);
|
|
|
+ ttm->bdev->driver->ttm_tt_unpopulate(ttm);
|
|
|
ttm->swap_storage = swap_storage;
|
|
|
ttm->page_flags |= TTM_PAGE_FLAG_SWAPPED;
|
|
|
if (persistent_swap_storage)
|