drm/i915/gvt: Refine the combined intel_vgpu_oos_page struct to save memory
authorZhao Yakui <yakui.zhao@intel.com>
Wed, 20 Feb 2019 04:07:45 +0000 (12:07 +0800)
committerZhenyu Wang <zhenyuw@linux.intel.com>
Wed, 20 Feb 2019 09:05:36 +0000 (17:05 +0800)
The intel_vgpu_oos_page uses the combined structure, which embeds the
tracked page. As it is allocated by kmalloc, the size(4140) is aligned
to 8192. The 8192 oos_pages will waste about 32M memory.
So the tracked page is split from the intel_vgpu_oos_page. And this will
help to assure that the access of tracked page is cache aligned.

Another minor change is that it doesn't need to be cleared to zero as
it is writen firstly when one page is added to oos_page list.

Signed-off-by: Zhao Yakui <yakui.zhao@intel.com>
Reviewed-by: Zhenyu Wang <zhenyuw@linux.intel.com>
Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
drivers/gpu/drm/i915/gvt/gtt.c
drivers/gpu/drm/i915/gvt/gtt.h

index 58e166effa456426d7fe2ee4f059a0533b4bfe0c..115dc6829c2686b13f608f6ed5bddf53b52d60b6 100644 (file)
@@ -2488,6 +2488,7 @@ static void clean_spt_oos(struct intel_gvt *gvt)
        list_for_each_safe(pos, n, &gtt->oos_page_free_list_head) {
                oos_page = container_of(pos, struct intel_vgpu_oos_page, list);
                list_del(&oos_page->list);
+               free_page((unsigned long)oos_page->mem);
                kfree(oos_page);
        }
 }
@@ -2508,6 +2509,12 @@ static int setup_spt_oos(struct intel_gvt *gvt)
                        ret = -ENOMEM;
                        goto fail;
                }
+               oos_page->mem = (void *)__get_free_pages(GFP_KERNEL, 0);
+               if (!oos_page->mem) {
+                       ret = -ENOMEM;
+                       kfree(oos_page);
+                       goto fail;
+               }
 
                INIT_LIST_HEAD(&oos_page->list);
                INIT_LIST_HEAD(&oos_page->vm_list);
index d8cb04cc946dff3e19466ff387089db96c226d53..e9f72a6590148fb886aeb386f0b0c34977888474 100644 (file)
@@ -221,7 +221,7 @@ struct intel_vgpu_oos_page {
        struct list_head list;
        struct list_head vm_list;
        int id;
-       unsigned char mem[I915_GTT_PAGE_SIZE];
+       void *mem;
 };
 
 #define GTT_ENTRY_NUM_IN_ONE_PAGE 512