From c5f2680903225e12bcb0ce1806b7efb0c91bf1d5 Mon Sep 17 00:00:00 2001 From: Jordan Crouse Date: Thu, 10 Sep 2020 09:59:48 -0600 Subject: [PATCH] msm: kgsl: Fix kvcalloc() calls Depending on user input the size of the page struct that we try to allocate with kvcalloc() could be way too big. Add __GFP_NOWARN and __GFP_NORETRY to keep from invoking the OOM killer in these cases. Also remove an unneeded usage of kvmalloc() since the maximum allocation size for the HFI command will only be 1k as enforced on the previous line. Change-Id: Ic0dedbad8d09544bdc0070b9b797616ee1f672d4 Signed-off-by: Jordan Crouse --- drivers/gpu/msm/adreno_a6xx_hwsched_hfi.c | 4 ++-- drivers/gpu/msm/kgsl.c | 3 ++- drivers/gpu/msm/kgsl_pool.c | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/msm/adreno_a6xx_hwsched_hfi.c b/drivers/gpu/msm/adreno_a6xx_hwsched_hfi.c index 10914ffe7e5b..1fe5af4075c6 100644 --- a/drivers/gpu/msm/adreno_a6xx_hwsched_hfi.c +++ b/drivers/gpu/msm/adreno_a6xx_hwsched_hfi.c @@ -1200,7 +1200,7 @@ int a6xx_hwsched_submit_cmdobj(struct adreno_device *adreno_dev, if (WARN_ON(cmd_sizebytes > HFI_MAX_MSG_SIZE)) return -EMSGSIZE; - cmd = kvmalloc(cmd_sizebytes, GFP_KERNEL); + cmd = kmalloc(cmd_sizebytes, GFP_KERNEL); if (cmd == NULL) return -ENOMEM; @@ -1264,7 +1264,7 @@ skipib: adreno_profile_submit_time(&time); free: - kvfree(cmd); + kfree(cmd); return ret; } diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index 3a466a20d8a6..c1ab0d79b616 100644 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -2346,7 +2346,8 @@ static int memdesc_sg_virt(struct kgsl_memdesc *memdesc, struct file *vmfile) if (sglen == 0 || sglen >= LONG_MAX) return -EINVAL; - pages = kvcalloc(sglen, sizeof(*pages), GFP_KERNEL); + pages = kvcalloc(sglen, sizeof(*pages), + GFP_KERNEL | __GFP_NORETRY | __GFP_NOWARN); if (pages == NULL) return -ENOMEM; diff --git a/drivers/gpu/msm/kgsl_pool.c b/drivers/gpu/msm/kgsl_pool.c index a6c726fbd990..7e7326ee304b 100644 --- a/drivers/gpu/msm/kgsl_pool.c +++ b/drivers/gpu/msm/kgsl_pool.c @@ -442,7 +442,8 @@ int kgsl_pool_alloc_pages(u64 size, struct page ***pages, struct device *dev) { int count = 0; int npages = size >> PAGE_SHIFT; - struct page **local = kvcalloc(npages, sizeof(*local), GFP_KERNEL); + struct page **local = kvcalloc(npages, sizeof(*local), + GFP_KERNEL | __GFP_NORETRY | __GFP_NOWARN); u32 page_size, align; u64 len = size;