Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5c205e81 authored by Deepak Kumar's avatar Deepak Kumar
Browse files

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: default avatarNeeraja P <neerp@codeaurora.org>
Signed-off-by: default avatarDeepak Kumar <dkumar@codeaurora.org>
parent 147bb826
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
// 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>
@@ -2506,6 +2506,7 @@ static int kgsl_setup_anon_useraddr(struct kgsl_pagetable *pagetable,
	size_t offset, size_t size)
{
	/* Map an anonymous memory chunk */
	int ret;

	if (size == 0 || offset != 0 ||
		!IS_ALIGNED(size, PAGE_SIZE))
@@ -2516,8 +2517,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,
			(uint64_t) hostptr, (uint64_t) size);
@@ -2528,7 +2527,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
+3 −2
Original line number Diff line number Diff line
// 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>
@@ -425,7 +425,8 @@ void kgsl_mmu_put_gpuaddr(struct kgsl_memdesc *memdesc)
		return;

	if (!kgsl_memdesc_is_global(memdesc) &&
			!kgsl_memdesc_is_reclaimed(memdesc))
			!kgsl_memdesc_is_reclaimed(memdesc) &&
			(KGSL_MEMDESC_MAPPED & memdesc->priv))
		unmap_fail = kgsl_mmu_unmap(pagetable, memdesc);

	/*