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

Commit cf056d1f authored by Deepak Kumar's avatar Deepak Kumar
Browse files

msm: kgsl: Use only compat VA range for compat tasks



Set KGSL_MEMFLAGS_FORCE_32BIT for compat tasks in
IOCTL_KGSL_GPUOBJ_ALLOC and IOCTL_KGSL_GPUOBJ_IMPORT
to make sure compat VA range is used. This is required
to avoid allocating a 64bit GPU VA for a 32bit application
running on a 64bit kernel.

Change-Id: I5cc526efd513e099fc7cda747e85e5fd6a8f1a32
Signed-off-by: default avatarDeepak Kumar <dkumar@codeaurora.org>
parent 5c705745
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -749,6 +749,9 @@ int a6xx_preemption_context_init(struct kgsl_context *context)
	if (context->flags & KGSL_CONTEXT_SECURE)
		flags |= KGSL_MEMFLAGS_SECURE;

	if (kgsl_is_compat_task())
		flags |= KGSL_MEMFLAGS_FORCE_32BIT;

	/*
	 * gpumem_alloc_entry takes an extra refcount. Put it only when
	 * destroying the context to keep the context record valid
+15 −4
Original line number Diff line number Diff line
@@ -2419,6 +2419,9 @@ long kgsl_ioctl_gpuobj_import(struct kgsl_device_private *dev_priv,
	if (!MMU_FEATURE(mmu, KGSL_MMU_IO_COHERENT))
		param->flags &= ~((uint64_t)KGSL_MEMFLAGS_IOCOHERENT);

	if (kgsl_is_compat_task())
		param->flags |= KGSL_MEMFLAGS_FORCE_32BIT;

	entry->memdesc.flags = param->flags;

	if (MMU_FEATURE(mmu, KGSL_MMU_NEED_GUARD_PAGE))
@@ -2709,8 +2712,10 @@ long kgsl_ioctl_map_user_mem(struct kgsl_device_private *dev_priv,
	if (!MMU_FEATURE(mmu, KGSL_MMU_IO_COHERENT))
		param->flags &= ~((uint64_t)KGSL_MEMFLAGS_IOCOHERENT);

	entry->memdesc.flags = ((uint64_t) param->flags)
		| KGSL_MEMFLAGS_FORCE_32BIT;
	entry->memdesc.flags = (uint64_t) param->flags;

	if (kgsl_is_compat_task())
		entry->memdesc.flags |= KGSL_MEMFLAGS_FORCE_32BIT;

	if (!kgsl_mmu_use_cpu_map(mmu))
		entry->memdesc.flags &= ~((uint64_t) KGSL_MEMFLAGS_USE_CPU_MAP);
@@ -3214,6 +3219,9 @@ long kgsl_ioctl_gpuobj_alloc(struct kgsl_device_private *dev_priv,
	struct kgsl_gpuobj_alloc *param = data;
	struct kgsl_mem_entry *entry;

	if (kgsl_is_compat_task())
		param->flags |= KGSL_MEMFLAGS_FORCE_32BIT;

	entry = gpumem_alloc_entry(dev_priv, param->size, param->flags);

	if (IS_ERR(entry))
@@ -3241,6 +3249,8 @@ long kgsl_ioctl_gpumem_alloc(struct kgsl_device_private *dev_priv,

	/* Legacy functions doesn't support these advanced features */
	flags &= ~((uint64_t) KGSL_MEMFLAGS_USE_CPU_MAP);

	if (kgsl_is_compat_task())
		flags |= KGSL_MEMFLAGS_FORCE_32BIT;

	entry = gpumem_alloc_entry(dev_priv, (uint64_t) param->size, flags);
@@ -3265,6 +3275,7 @@ long kgsl_ioctl_gpumem_alloc_id(struct kgsl_device_private *dev_priv,
	struct kgsl_mem_entry *entry;
	uint64_t flags = param->flags;

	if (kgsl_is_compat_task())
		flags |= KGSL_MEMFLAGS_FORCE_32BIT;

	entry = gpumem_alloc_entry(dev_priv, (uint64_t) param->size, flags);
+7 −1
Original line number Diff line number Diff line
/* Copyright (c) 2008-2017, The Linux Foundation. All rights reserved.
/* Copyright (c) 2008-2018, The Linux Foundation. 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
@@ -27,6 +27,7 @@
#include <linux/uaccess.h>
#include <linux/kthread.h>
#include <asm/cacheflush.h>
#include <linux/compat.h>

/*
 * --- kgsl drawobj flags ---
@@ -628,4 +629,9 @@ static inline void kgsl_gpu_sysfs_add_link(struct kobject *dst,

	kernfs_create_link(dst->sd, dst_name, old);
}

static inline bool kgsl_is_compat_task(void)
{
	return (BITS_PER_LONG == 32) || is_compat_task();
}
#endif /* __KGSL_H */
+1 −1
Original line number Diff line number Diff line
@@ -1052,7 +1052,7 @@ static void setup_64bit_pagetable(struct kgsl_mmu *mmu,

	if (pagetable->name != KGSL_MMU_GLOBAL_PT &&
		pagetable->name != KGSL_MMU_SECURE_PT) {
		if ((BITS_PER_LONG == 32) || is_compat_task()) {
		if (kgsl_is_compat_task()) {
			pt->svm_start = KGSL_IOMMU_SVM_BASE32;
			pt->svm_end = KGSL_IOMMU_SECURE_BASE(mmu);
		} else {