Place highmem pages last in the ttm page array.
authorThomas Hellstrom <thomas-at-tungstengraphics-dot-com>
Sun, 6 Apr 2008 09:21:22 +0000 (11:21 +0200)
committerThomas Hellstrom <thomas-at-tungstengraphics-dot-com>
Sun, 6 Apr 2008 09:21:22 +0000 (11:21 +0200)
linux-core/drm_objects.h
linux-core/drm_ttm.c

index 9bd04ff..c32edac 100644 (file)
@@ -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;
index da202a5..c306a2c 100644 (file)
@@ -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;