diff options
-rw-r--r-- | linux-core/drm_objects.h | 2 | ||||
-rw-r--r-- | linux-core/drm_ttm.c | 12 |
2 files changed, 11 insertions, 3 deletions
diff --git a/linux-core/drm_objects.h b/linux-core/drm_objects.h index 9bd04fff..c32edacd 100644 --- a/linux-core/drm_objects.h +++ b/linux-core/drm_objects.h @@ -311,6 +311,8 @@ struct drm_ttm_backend { struct drm_ttm { struct page *dummy_read_page; struct page **pages; + long first_himem_page; + long last_lomem_page; uint32_t page_flags; unsigned long num_pages; atomic_t vma_count; diff --git a/linux-core/drm_ttm.c b/linux-core/drm_ttm.c index da202a58..c306a2c0 100644 --- a/linux-core/drm_ttm.c +++ b/linux-core/drm_ttm.c @@ -263,12 +263,16 @@ struct page *drm_ttm_get_page(struct drm_ttm *ttm, int index) struct page *p; struct drm_buffer_manager *bm = &ttm->dev->bm; - p = ttm->pages[index]; - if (!p) { + while(NULL == (p = ttm->pages[index])) { p = drm_ttm_alloc_page(); if (!p) return NULL; - ttm->pages[index] = p; + + if (PageHighMem(p)) + ttm->pages[--ttm->first_himem_page] = p; + else + ttm->pages[++ttm->last_lomem_page] = p; + ++bm->cur_pages; } return p; @@ -376,6 +380,8 @@ struct drm_ttm *drm_ttm_create(struct drm_device *dev, unsigned long size, ttm->destroy = 0; ttm->num_pages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT; + ttm->first_himem_page = ttm->num_pages; + ttm->last_lomem_page = -1; ttm->page_flags = page_flags; |