From 28afec421e4c35b295e4ae652febf2fdee13eb88 Mon Sep 17 00:00:00 2001 From: Jeff Boody Date: Wed, 18 Jan 2012 15:47:46 -0700 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. CRs-fixed: 327066 Change-Id: Ic7d15ca0399aa5c1fa01b7892cff736b3d1e4236 Signed-off-by: Jeff Boody --- drivers/gpu/msm/kgsl.c | 5 ++--- drivers/gpu/msm/kgsl_sharedmem.c | 6 +++--- drivers/gpu/msm/kgsl_sharedmem.h | 5 +++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index 34e83a0dc40..c6e78dd3498 100644 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -1318,8 +1318,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; @@ -1359,7 +1358,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_sharedmem.c b/drivers/gpu/msm/kgsl_sharedmem.c index ec91b399f8a..7211879b2e1 100644 --- a/drivers/gpu/msm/kgsl_sharedmem.c +++ b/drivers/gpu/msm/kgsl_sharedmem.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2002,2007-2011, Code Aurora Forum. All rights reserved. +/* Copyright (c) 2002,2007-2012, Code Aurora Forum. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -421,7 +421,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; @@ -554,7 +554,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 d345ff34072..67a1c2d7b51 100644 --- a/drivers/gpu/msm/kgsl_sharedmem.h +++ b/drivers/gpu/msm/kgsl_sharedmem.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2002,2007-2011, Code Aurora Forum. All rights reserved. +/* Copyright (c) 2002,2007-2012, Code Aurora Forum. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -15,6 +15,7 @@ #include #include +#include #include "kgsl_mmu.h" struct kgsl_device; @@ -81,7 +82,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;