From 376f66c119a01424d7f044b2e6bdef0bbafdeef2 Mon Sep 17 00:00:00 2001 From: SecureCRT Date: Fri, 22 Jun 2012 16:08:12 +0800 Subject: [PATCH] msm: kgsl: convert sg allocation to vmalloc kmalloc allocates physically contiguous memory and may fail for larger allocations due to fragmentation. The large allocations are caused by the fact that the scatterlist structure is 24 bytes and the array size is proportional to the number of pages being mapped. --- drivers/gpu/msm/adreno.c | 1 + drivers/gpu/msm/kgsl.c | 5 ++--- drivers/gpu/msm/kgsl_cffdump.c | 2 +- drivers/gpu/msm/kgsl_sharedmem.c | 4 ++-- drivers/gpu/msm/kgsl_sharedmem.h | 3 ++- 5 files changed, 8 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/msm/adreno.c b/drivers/gpu/msm/adreno.c index 50c8f223..adc3456a 100755 --- a/drivers/gpu/msm/adreno.c +++ b/drivers/gpu/msm/adreno.c @@ -72,6 +72,7 @@ | (MMU_CONFIG << MH_MMU_CONFIG__PA_W_CLNT_BEHAVIOR__SHIFT)) static const struct kgsl_functable adreno_functable; +unsigned int kgsl_cff_dump_enable=0; static struct adreno_device device_3d0 = { .dev = { diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index 22132197..7b6d4aa9 100755 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -1291,8 +1291,7 @@ static int memdesc_sg_virt(struct kgsl_memdesc *memdesc, int sglen = PAGE_ALIGN(size) / PAGE_SIZE; unsigned long paddr = (unsigned long) addr; - memdesc->sg = kmalloc(sglen * sizeof(struct scatterlist), - GFP_KERNEL); + memdesc->sg = vmalloc(sglen * sizeof(struct scatterlist)); if (memdesc->sg == NULL) return -ENOMEM; @@ -1332,7 +1331,7 @@ static int memdesc_sg_virt(struct kgsl_memdesc *memdesc, err: spin_unlock(¤t->mm->page_table_lock); - kfree(memdesc->sg); + vfree(memdesc->sg); memdesc->sg = NULL; return -EINVAL; diff --git a/drivers/gpu/msm/kgsl_cffdump.c b/drivers/gpu/msm/kgsl_cffdump.c index fb1ecac7..945b535d 100755 --- a/drivers/gpu/msm/kgsl_cffdump.c +++ b/drivers/gpu/msm/kgsl_cffdump.c @@ -20,7 +20,7 @@ #include #include #include -#include +//#include #include "kgsl.h" #include "kgsl_cffdump.h" diff --git a/drivers/gpu/msm/kgsl_sharedmem.c b/drivers/gpu/msm/kgsl_sharedmem.c index 8c4f7814..17c26c5f 100755 --- a/drivers/gpu/msm/kgsl_sharedmem.c +++ b/drivers/gpu/msm/kgsl_sharedmem.c @@ -425,7 +425,7 @@ _kgsl_sharedmem_vmalloc(struct kgsl_memdesc *memdesc, memdesc->ops = &kgsl_vmalloc_ops; memdesc->hostptr = (void *) ptr; - memdesc->sg = kmalloc(sglen * sizeof(struct scatterlist), GFP_KERNEL); + memdesc->sg = vmalloc(sglen * sizeof(struct scatterlist)); if (memdesc->sg == NULL) { ret = -ENOMEM; goto done; @@ -564,7 +564,7 @@ void kgsl_sharedmem_free(struct kgsl_memdesc *memdesc) if (memdesc->ops && memdesc->ops->free) memdesc->ops->free(memdesc); - kfree(memdesc->sg); + vfree(memdesc->sg); memset(memdesc, 0, sizeof(*memdesc)); } diff --git a/drivers/gpu/msm/kgsl_sharedmem.h b/drivers/gpu/msm/kgsl_sharedmem.h index ae77aec2..63e12e66 100755 --- a/drivers/gpu/msm/kgsl_sharedmem.h +++ b/drivers/gpu/msm/kgsl_sharedmem.h @@ -16,6 +16,7 @@ #include #include +#include #include /* @@ -87,7 +88,7 @@ memdesc_sg_phys(struct kgsl_memdesc *memdesc, { struct page *page = phys_to_page(physaddr); - memdesc->sg = kmalloc(sizeof(struct scatterlist) * 1, GFP_KERNEL); + memdesc->sg = vmalloc(sizeof(struct scatterlist) * 1); if (memdesc->sg == NULL) return -ENOMEM;