msm: kgsl: Deregister gpu address on memdesc_sg_virt failure

When memdesc_sg_virt returns error in kgsl_setup_anon_useraddr function,
the gpu address registered in SVM region will not be deregistered.
This change deregisters the gpu address on memdesc_sg_virt failure.

Change-Id: Ic99167e283a0c6331bb9f5f0b608b6cdb3c918e4
Signed-off-by: Neeraja P <neerp@codeaurora.org>
This commit is contained in:
Neeraja P 2020-12-21 22:36:45 +05:30
commit 9d5f8de63c
2 changed files with 11 additions and 5 deletions

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2008-2020, The Linux Foundation. All rights reserved.
* Copyright (c) 2008-2021, The Linux Foundation. All rights reserved.
*/
#include <uapi/linux/sched/types.h>
@ -2451,6 +2451,8 @@ static int kgsl_setup_anon_useraddr(struct kgsl_pagetable *pagetable,
{
/* Map an anonymous memory chunk */
int ret;
if (size == 0 || offset != 0 ||
!IS_ALIGNED(size, PAGE_SIZE))
return -EINVAL;
@ -2460,7 +2462,6 @@ static int kgsl_setup_anon_useraddr(struct kgsl_pagetable *pagetable,
entry->memdesc.flags |= (uint64_t)KGSL_MEMFLAGS_USERMEM_ADDR;
if (kgsl_memdesc_use_cpu_map(&entry->memdesc)) {
int ret;
/* Register the address in the database */
ret = kgsl_mmu_set_svm_region(pagetable,
@ -2472,7 +2473,12 @@ static int kgsl_setup_anon_useraddr(struct kgsl_pagetable *pagetable,
entry->memdesc.gpuaddr = (uint64_t) hostptr;
}
return memdesc_sg_virt(&entry->memdesc, hostptr);
ret = memdesc_sg_virt(&entry->memdesc, hostptr);
if (ret && kgsl_memdesc_use_cpu_map(&entry->memdesc))
kgsl_mmu_put_gpuaddr(&entry->memdesc);
return ret;
}
#ifdef CONFIG_DMA_SHARED_BUFFER

View file

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2002,2007-2020, The Linux Foundation. All rights reserved.
* Copyright (c) 2002,2007-2021, The Linux Foundation. All rights reserved.
*/
#include <linux/slab.h>
@ -398,7 +398,7 @@ void kgsl_mmu_put_gpuaddr(struct kgsl_memdesc *memdesc)
if (memdesc->size == 0 || memdesc->gpuaddr == 0)
return;
if (!kgsl_memdesc_is_global(memdesc))
if (!kgsl_memdesc_is_global(memdesc) && (KGSL_MEMDESC_MAPPED & memdesc->priv))
unmap_fail = kgsl_mmu_unmap(pagetable, memdesc);
/*