From f99c263b56dbf6c7c57cf6edd7b3cbbdbc326bbc Mon Sep 17 00:00:00 2001 From: Harsh Vardhan Dwivedi Date: Thu, 15 Mar 2012 14:17:11 -0600 Subject: [PATCH] msm: kgsl: Change name of vmalloc allocator Change the vmalloc allocation name to something more appropriate since we do not allocate memory using vmalloc for userspace driver. We directly allocate physical pages and map that to user address space. The name is changed to page_alloc instead of vmalloc. Add sysfs files to track memory usage via both vmalloc and page_alloc. Change-Id: I239087435f4599b62b7da71ecea0a5878cda5037 Signed-off-by: Harsh Vardhan Dwivedi --- drivers/gpu/msm/kgsl.c | 6 +-- drivers/gpu/msm/kgsl.h | 2 + drivers/gpu/msm/kgsl_drm.c | 2 +- drivers/gpu/msm/kgsl_sharedmem.c | 63 ++++++++++++++++++++------------ drivers/gpu/msm/kgsl_sharedmem.h | 10 ++--- 5 files changed, 50 insertions(+), 33 deletions(-) diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index 693aa742f99..85d1d93ad51 100644 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -1349,7 +1349,7 @@ kgsl_ioctl_sharedmem_from_vmalloc(struct kgsl_device_private *dev_priv, goto error; } - result = kgsl_sharedmem_vmalloc_user(&entry->memdesc, + result = kgsl_sharedmem_page_alloc_user(&entry->memdesc, private->pagetable, len, param->flags); if (result != 0) @@ -1360,7 +1360,7 @@ kgsl_ioctl_sharedmem_from_vmalloc(struct kgsl_device_private *dev_priv, result = kgsl_sharedmem_map_vma(vma, &entry->memdesc); if (result) { KGSL_CORE_ERR("kgsl_sharedmem_map_vma failed: %d\n", result); - goto error_free_vmalloc; + goto error_free_alloc; } param->gpuaddr = entry->memdesc.gpuaddr; @@ -1376,7 +1376,7 @@ kgsl_ioctl_sharedmem_from_vmalloc(struct kgsl_device_private *dev_priv, kgsl_check_idle(dev_priv->device); return 0; -error_free_vmalloc: +error_free_alloc: kgsl_sharedmem_free(&entry->memdesc); error_free_entry: diff --git a/drivers/gpu/msm/kgsl.h b/drivers/gpu/msm/kgsl.h index fcd8448bf6d..e6552222e70 100644 --- a/drivers/gpu/msm/kgsl.h +++ b/drivers/gpu/msm/kgsl.h @@ -96,6 +96,8 @@ struct kgsl_driver { struct { unsigned int vmalloc; unsigned int vmalloc_max; + unsigned int page_alloc; + unsigned int page_alloc_max; unsigned int coherent; unsigned int coherent_max; unsigned int mapped; diff --git a/drivers/gpu/msm/kgsl_drm.c b/drivers/gpu/msm/kgsl_drm.c index 33f4b95910a..66ac08f61c2 100644 --- a/drivers/gpu/msm/kgsl_drm.c +++ b/drivers/gpu/msm/kgsl_drm.c @@ -263,7 +263,7 @@ kgsl_gem_alloc_memory(struct drm_gem_object *obj) priv->type & DRM_KGSL_GEM_CACHE_MASK) list_add(&priv->list, &kgsl_mem_list); - result = kgsl_sharedmem_vmalloc_user(&priv->memdesc, + result = kgsl_sharedmem_page_alloc_user(&priv->memdesc, priv->pagetable, obj->size * priv->bufcount, 0); diff --git a/drivers/gpu/msm/kgsl_sharedmem.c b/drivers/gpu/msm/kgsl_sharedmem.c index 63c24f18de6..a51f29f2802 100644 --- a/drivers/gpu/msm/kgsl_sharedmem.c +++ b/drivers/gpu/msm/kgsl_sharedmem.c @@ -203,6 +203,10 @@ static int kgsl_drv_memstat_show(struct device *dev, val = kgsl_driver.stats.vmalloc; else if (!strncmp(attr->attr.name, "vmalloc_max", 11)) val = kgsl_driver.stats.vmalloc_max; + else if (!strncmp(attr->attr.name, "page_alloc", 10)) + val = kgsl_driver.stats.page_alloc; + else if (!strncmp(attr->attr.name, "page_alloc_max", 14)) + val = kgsl_driver.stats.page_alloc_max; else if (!strncmp(attr->attr.name, "coherent", 8)) val = kgsl_driver.stats.coherent; else if (!strncmp(attr->attr.name, "coherent_max", 12)) @@ -232,6 +236,8 @@ static int kgsl_drv_histogram_show(struct device *dev, DEVICE_ATTR(vmalloc, 0444, kgsl_drv_memstat_show, NULL); DEVICE_ATTR(vmalloc_max, 0444, kgsl_drv_memstat_show, NULL); +DEVICE_ATTR(page_alloc, 0444, kgsl_drv_memstat_show, NULL); +DEVICE_ATTR(page_alloc_max, 0444, kgsl_drv_memstat_show, NULL); DEVICE_ATTR(coherent, 0444, kgsl_drv_memstat_show, NULL); DEVICE_ATTR(coherent_max, 0444, kgsl_drv_memstat_show, NULL); DEVICE_ATTR(mapped, 0444, kgsl_drv_memstat_show, NULL); @@ -241,6 +247,8 @@ DEVICE_ATTR(histogram, 0444, kgsl_drv_histogram_show, NULL); static const struct device_attribute *drv_attr_list[] = { &dev_attr_vmalloc, &dev_attr_vmalloc_max, + &dev_attr_page_alloc, + &dev_attr_page_alloc_max, &dev_attr_coherent, &dev_attr_coherent_max, &dev_attr_mapped, @@ -295,7 +303,7 @@ static void outer_cache_range_op_sg(struct scatterlist *sg, int sglen, int op) } #endif -static int kgsl_vmalloc_vmfault(struct kgsl_memdesc *memdesc, +static int kgsl_page_alloc_vmfault(struct kgsl_memdesc *memdesc, struct vm_area_struct *vma, struct vm_fault *vmf) { @@ -316,18 +324,20 @@ static int kgsl_vmalloc_vmfault(struct kgsl_memdesc *memdesc, return 0; } -static int kgsl_vmalloc_vmflags(struct kgsl_memdesc *memdesc) +static int kgsl_page_alloc_vmflags(struct kgsl_memdesc *memdesc) { return VM_RESERVED | VM_DONTEXPAND; } -static void kgsl_vmalloc_free(struct kgsl_memdesc *memdesc) +static void kgsl_page_alloc_free(struct kgsl_memdesc *memdesc) { int i = 0; struct scatterlist *sg; - kgsl_driver.stats.vmalloc -= memdesc->size; - if (memdesc->hostptr) + kgsl_driver.stats.page_alloc -= memdesc->size; + if (memdesc->hostptr) { vunmap(memdesc->hostptr); + kgsl_driver.stats.vmalloc -= memdesc->size; + } if (memdesc->sg) for_each_sg(memdesc->sg, sg, memdesc->sglen, i) __free_page(sg_page(sg)); @@ -339,13 +349,14 @@ static int kgsl_contiguous_vmflags(struct kgsl_memdesc *memdesc) } /* - * kgsl_vmalloc_map_kernel - Map the memory in memdesc to kernel address space + * kgsl_page_alloc_map_kernel - Map the memory in memdesc to kernel address + * space * * @memdesc - The memory descriptor which contains information about the memory * * Return: 0 on success else error code */ -static int kgsl_vmalloc_map_kernel(struct kgsl_memdesc *memdesc) +static int kgsl_page_alloc_map_kernel(struct kgsl_memdesc *memdesc) { if (!memdesc->hostptr) { pgprot_t page_prot = pgprot_writecombine(PAGE_KERNEL); @@ -363,6 +374,8 @@ static int kgsl_vmalloc_map_kernel(struct kgsl_memdesc *memdesc) pages[i] = sg_page(sg); memdesc->hostptr = vmap(pages, memdesc->sglen, VM_IOREMAP, page_prot); + KGSL_STATS_ADD(memdesc->size, kgsl_driver.stats.vmalloc, + kgsl_driver.stats.vmalloc_max); vfree(pages); } if (!memdesc->hostptr) @@ -410,13 +423,13 @@ static void kgsl_coherent_free(struct kgsl_memdesc *memdesc) } /* Global - also used by kgsl_drm.c */ -struct kgsl_memdesc_ops kgsl_vmalloc_ops = { - .free = kgsl_vmalloc_free, - .vmflags = kgsl_vmalloc_vmflags, - .vmfault = kgsl_vmalloc_vmfault, - .map_kernel_mem = kgsl_vmalloc_map_kernel, +struct kgsl_memdesc_ops kgsl_page_alloc_ops = { + .free = kgsl_page_alloc_free, + .vmflags = kgsl_page_alloc_vmflags, + .vmfault = kgsl_page_alloc_vmfault, + .map_kernel_mem = kgsl_page_alloc_map_kernel, }; -EXPORT_SYMBOL(kgsl_vmalloc_ops); +EXPORT_SYMBOL(kgsl_page_alloc_ops); static struct kgsl_memdesc_ops kgsl_ebimem_ops = { .free = kgsl_ebimem_free, @@ -450,7 +463,7 @@ void kgsl_cache_range_op(struct kgsl_memdesc *memdesc, int op) EXPORT_SYMBOL(kgsl_cache_range_op); static int -_kgsl_sharedmem_vmalloc(struct kgsl_memdesc *memdesc, +_kgsl_sharedmem_page_alloc(struct kgsl_memdesc *memdesc, struct kgsl_pagetable *pagetable, size_t size, unsigned int protflags) { @@ -461,11 +474,13 @@ _kgsl_sharedmem_vmalloc(struct kgsl_memdesc *memdesc, memdesc->size = size; memdesc->pagetable = pagetable; memdesc->priv = KGSL_MEMFLAGS_CACHED; - memdesc->ops = &kgsl_vmalloc_ops; + memdesc->ops = &kgsl_page_alloc_ops; memdesc->sg = kgsl_sg_alloc(sglen); if (memdesc->sg == NULL) { + KGSL_CORE_ERR("vmalloc(%d) failed\n", + sglen * sizeof(struct scatterlist)); ret = -ENOMEM; goto done; } @@ -494,8 +509,8 @@ _kgsl_sharedmem_vmalloc(struct kgsl_memdesc *memdesc, if (ret) goto done; - KGSL_STATS_ADD(size, kgsl_driver.stats.vmalloc, - kgsl_driver.stats.vmalloc_max); + KGSL_STATS_ADD(size, kgsl_driver.stats.page_alloc, + kgsl_driver.stats.page_alloc_max); order = get_order(size); @@ -510,7 +525,7 @@ done: } int -kgsl_sharedmem_vmalloc(struct kgsl_memdesc *memdesc, +kgsl_sharedmem_page_alloc(struct kgsl_memdesc *memdesc, struct kgsl_pagetable *pagetable, size_t size) { int ret = 0; @@ -518,18 +533,18 @@ kgsl_sharedmem_vmalloc(struct kgsl_memdesc *memdesc, size = ALIGN(size, PAGE_SIZE * 2); - ret = _kgsl_sharedmem_vmalloc(memdesc, pagetable, size, + ret = _kgsl_sharedmem_page_alloc(memdesc, pagetable, size, GSL_PT_PAGE_RV | GSL_PT_PAGE_WV); if (!ret) - ret = kgsl_vmalloc_map_kernel(memdesc); + ret = kgsl_page_alloc_map_kernel(memdesc); if (ret) kgsl_sharedmem_free(memdesc); return ret; } -EXPORT_SYMBOL(kgsl_sharedmem_vmalloc); +EXPORT_SYMBOL(kgsl_sharedmem_page_alloc); int -kgsl_sharedmem_vmalloc_user(struct kgsl_memdesc *memdesc, +kgsl_sharedmem_page_alloc_user(struct kgsl_memdesc *memdesc, struct kgsl_pagetable *pagetable, size_t size, int flags) { @@ -541,10 +556,10 @@ kgsl_sharedmem_vmalloc_user(struct kgsl_memdesc *memdesc, if (!(flags & KGSL_MEMFLAGS_GPUREADONLY)) protflags |= GSL_PT_PAGE_WV; - return _kgsl_sharedmem_vmalloc(memdesc, pagetable, size, + return _kgsl_sharedmem_page_alloc(memdesc, pagetable, size, protflags); } -EXPORT_SYMBOL(kgsl_sharedmem_vmalloc_user); +EXPORT_SYMBOL(kgsl_sharedmem_page_alloc_user); int kgsl_sharedmem_alloc_coherent(struct kgsl_memdesc *memdesc, size_t size) diff --git a/drivers/gpu/msm/kgsl_sharedmem.h b/drivers/gpu/msm/kgsl_sharedmem.h index def29b38721..fb8dd95bb1d 100644 --- a/drivers/gpu/msm/kgsl_sharedmem.h +++ b/drivers/gpu/msm/kgsl_sharedmem.h @@ -32,12 +32,12 @@ struct kgsl_process_private; /** Set if the memdesc is mapped into all pagetables */ #define KGSL_MEMFLAGS_GLOBAL 0x00000002 -extern struct kgsl_memdesc_ops kgsl_vmalloc_ops; +extern struct kgsl_memdesc_ops kgsl_page_alloc_ops; -int kgsl_sharedmem_vmalloc(struct kgsl_memdesc *memdesc, +int kgsl_sharedmem_page_alloc(struct kgsl_memdesc *memdesc, struct kgsl_pagetable *pagetable, size_t size); -int kgsl_sharedmem_vmalloc_user(struct kgsl_memdesc *memdesc, +int kgsl_sharedmem_page_alloc_user(struct kgsl_memdesc *memdesc, struct kgsl_pagetable *pagetable, size_t size, int flags); @@ -134,7 +134,7 @@ kgsl_allocate(struct kgsl_memdesc *memdesc, { if (kgsl_mmu_get_mmutype() == KGSL_MMU_TYPE_NONE) return kgsl_sharedmem_ebimem(memdesc, pagetable, size); - return kgsl_sharedmem_vmalloc(memdesc, pagetable, size); + return kgsl_sharedmem_page_alloc(memdesc, pagetable, size); } static inline int @@ -145,7 +145,7 @@ kgsl_allocate_user(struct kgsl_memdesc *memdesc, if (kgsl_mmu_get_mmutype() == KGSL_MMU_TYPE_NONE) return kgsl_sharedmem_ebimem_user(memdesc, pagetable, size, flags); - return kgsl_sharedmem_vmalloc_user(memdesc, pagetable, size, flags); + return kgsl_sharedmem_page_alloc_user(memdesc, pagetable, size, flags); } static inline int