drm/ttm: reset user pages to WB if modified by ttm
authorLi Zeng <li.zeng@intel.com>
Fri, 8 Jun 2012 12:31:16 +0000 (20:31 +0800)
committerbuildbot <buildbot@intel.com>
Sun, 24 Jun 2012 05:19:39 +0000 (22:19 -0700)
BZ: 37816

Set user pages to UC/WC to improve vec performance, need to reset user pages to WB when release TTM buffer object

Change-Id: I110c3dfd1a77d2a60f3d1b0be43563f8c033c7c4
Signed-off-by: Li Zeng <li.zeng@intel.com>
Reviewed-on: http://android.intel.com:8080/52473
Reviewed-by: Ding, Haitao <haitao.ding@intel.com>
Tested-by: Ding, Haitao <haitao.ding@intel.com>
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
drivers/gpu/drm/ttm/ttm_tt.c

index 8067600..7739625 100644 (file)
@@ -68,6 +68,7 @@ static void ttm_tt_free_user_pages(struct ttm_tt *ttm)
        int write;
        int dirty;
        struct page *page;
+       struct page **pages_to_wb;
        int i;
        struct ttm_backend *be = ttm->be;
 
@@ -78,6 +79,27 @@ static void ttm_tt_free_user_pages(struct ttm_tt *ttm)
        if (be)
                be->func->clear(be);
 
+       pages_to_wb = kmalloc(ttm->num_pages * sizeof(struct page *),
+                       GFP_KERNEL);
+
+       if (pages_to_wb && ttm->caching_state != tt_cached) {
+               int num_pages_wb = 0;
+
+               for (i = 0; i < ttm->num_pages; ++i) {
+                       page = ttm->pages[i];
+                       if (page == NULL)
+                               continue;
+                       pages_to_wb[num_pages_wb++] = page;
+               }
+
+               if (set_pages_array_wb(pages_to_wb, num_pages_wb))
+                       printk(KERN_ERR TTM_PFX "Failed to set pages to wb\n");
+
+       } else {
+               printk(KERN_ERR TTM_PFX
+                      "Failed to allocate memory for set wb operation.\n");
+       }
+
        for (i = 0; i < ttm->num_pages; ++i) {
                page = ttm->pages[i];
                if (page == NULL)
@@ -98,6 +120,7 @@ static void ttm_tt_free_user_pages(struct ttm_tt *ttm)
        ttm->state = tt_unpopulated;
        ttm->first_himem_page = ttm->num_pages;
        ttm->last_lomem_page = -1;
+       kfree(pages_to_wb);
 }
 
 static struct page *__ttm_tt_get_page(struct ttm_tt *ttm, int index)