drm/ttm: Memory accounting rework.
[safe/jmp/linux-2.6] / drivers / gpu / drm / ttm / ttm_tt.c
index c27ab3a..4e1e256 100644 (file)
@@ -28,7 +28,6 @@
  * Authors: Thomas Hellstrom <thellstrom-at-vmware-dot-com>
  */
 
-#include <linux/version.h>
 #include <linux/vmalloc.h>
 #include <linux/sched.h>
 #include <linux/highmem.h>
@@ -68,7 +67,7 @@ static void ttm_tt_cache_flush_clflush(struct page *pages[],
                ttm_tt_clflush_page(*pages++);
        mb();
 }
-#else
+#elif !defined(__powerpc__)
 static void ttm_tt_ipi_handler(void *null)
 {
        ;
@@ -83,6 +82,15 @@ void ttm_tt_cache_flush(struct page *pages[], unsigned long num_pages)
                ttm_tt_cache_flush_clflush(pages, num_pages);
                return;
        }
+#elif defined(__powerpc__)
+       unsigned long i;
+
+       for (i = 0; i < num_pages; ++i) {
+               if (pages[i]) {
+                       unsigned long start = (unsigned long)page_address(pages[i]);
+                       flush_dcache_range(start, start + PAGE_SIZE);
+               }
+       }
 #else
        if (on_each_cpu(ttm_tt_ipi_handler, NULL, 1) != 0)
                printk(KERN_ERR TTM_PFX
@@ -158,7 +166,7 @@ static void ttm_tt_free_user_pages(struct ttm_tt *ttm)
                        set_page_dirty_lock(page);
 
                ttm->pages[i] = NULL;
-               ttm_mem_global_free(ttm->bdev->mem_glob, PAGE_SIZE, false);
+               ttm_mem_global_free(ttm->bdev->mem_glob, PAGE_SIZE);
                put_page(page);
        }
        ttm->state = tt_unpopulated;
@@ -179,21 +187,14 @@ static struct page *__ttm_tt_get_page(struct ttm_tt *ttm, int index)
                if (!p)
                        return NULL;
 
-               if (PageHighMem(p)) {
-                       ret =
-                           ttm_mem_global_alloc(mem_glob, PAGE_SIZE,
-                                                false, false, true);
-                       if (unlikely(ret != 0))
-                               goto out_err;
+               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 {
-                       ret =
-                           ttm_mem_global_alloc(mem_glob, PAGE_SIZE,
-                                                false, false, false);
-                       if (unlikely(ret != 0))
-                               goto out_err;
+               else
                        ttm->pages[++ttm->last_lomem_page] = p;
-               }
        }
        return p;
 out_err:
@@ -347,8 +348,8 @@ static void ttm_tt_free_alloced_pages(struct ttm_tt *ttm)
                                printk(KERN_ERR TTM_PFX
                                       "Erroneous page count. "
                                       "Leaking pages.\n");
-                       ttm_mem_global_free(ttm->bdev->mem_glob, PAGE_SIZE,
-                                           PageHighMem(cur_page));
+                       ttm_mem_global_free_page(ttm->bdev->mem_glob,
+                                                cur_page);
                        __free_page(cur_page);
                }
        }
@@ -403,7 +404,7 @@ int ttm_tt_set_user(struct ttm_tt *ttm,
         */
 
        ret = ttm_mem_global_alloc(mem_glob, num_pages * PAGE_SIZE,
-                                  false, false, false);
+                                  false, false);
        if (unlikely(ret != 0))
                return ret;
 
@@ -414,7 +415,7 @@ int ttm_tt_set_user(struct ttm_tt *ttm,
 
        if (ret != num_pages && write) {
                ttm_tt_free_user_pages(ttm);
-               ttm_mem_global_free(mem_glob, num_pages * PAGE_SIZE, false);
+               ttm_mem_global_free(mem_glob, num_pages * PAGE_SIZE);
                return -ENOMEM;
        }