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

Commit 70d43642 authored by Shubhraprakash Das's avatar Shubhraprakash Das
Browse files

msm: kgsl: Continue looking for free address map after overflows



If address range overflow is detected when looking for a free
address map then don't discontinue after this failure because
the search can continue after changing options like alignment/
top-down/bottom-up.

Change-Id: I96214a88e3e9c05c16ecd08440e37508bb238094
Signed-off-by: default avatarShubhraprakash Das <sadas@codeaurora.org>
parent 8187a8a8
Loading
Loading
Loading
Loading
+22 −4
Original line number Diff line number Diff line
@@ -3613,7 +3613,8 @@ err_put:
static inline bool
mmap_range_valid(unsigned long addr, unsigned long len)
{
	return ((ULONG_MAX - addr) > len) && ((addr + len) < TASK_SIZE);
	return ((ULONG_MAX - addr) > len) && ((addr + len) <
		KGSL_SVM_UPPER_BOUND);
}

/**
@@ -3690,7 +3691,15 @@ static int kgsl_check_gpu_addr_collision(
			if (flag_top_down) {
				addr = collision_entry->memdesc.gpuaddr - len;
				if (addr > collision_entry->memdesc.gpuaddr) {
					ret = -EOVERFLOW;
					KGSL_CORE_ERR_ONCE(
					"Underflow err ent:%x/%zx, addr:%lx/%lx align:%u",
					collision_entry->memdesc.gpuaddr,
					kgsl_memdesc_mmapsize(
						&collision_entry->memdesc),
					addr, len, align);
					*gpumap_free_addr =
						KGSL_SVM_UPPER_BOUND;
					ret = -EAGAIN;
					break;
				}
			} else {
@@ -3698,8 +3707,17 @@ static int kgsl_check_gpu_addr_collision(
					kgsl_memdesc_mmapsize(
						&collision_entry->memdesc);
				/* overflow check */
				if (addr < collision_entry->memdesc.gpuaddr) {
					ret = -EOVERFLOW;
				if (addr < collision_entry->memdesc.gpuaddr ||
					!mmap_range_valid(addr, len)) {
					KGSL_CORE_ERR_ONCE(
					"Overflow err ent:%x/%zx, addr:%lx/%lx align:%u",
					collision_entry->memdesc.gpuaddr,
					kgsl_memdesc_mmapsize(
						&collision_entry->memdesc),
					addr, len, align);
					*gpumap_free_addr =
						KGSL_SVM_UPPER_BOUND;
					ret = -EAGAIN;
					break;
				}
			}
+11 −1
Original line number Diff line number Diff line
/* Copyright (c) 2002,2008-2011,2013, The Linux Foundation. All rights reserved.
/* Copyright (c) 2002,2008-2011,2013-2014 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
@@ -116,4 +117,13 @@ KGSL_LOG_CRIT(_dev->dev, _dev->pwr_log, fmt, ##args)
#define KGSL_CORE_ERR(fmt, args...) \
pr_err("kgsl: %s: " fmt, __func__, ##args)

#define KGSL_CORE_ERR_ONCE(fmt, args...) \
({ \
	static bool kgsl_core_err_once; \
	if (!kgsl_core_err_once) { \
		kgsl_core_err_once = true; \
		pr_err("kgsl: %s: " fmt, __func__, ##args); \
	} \
})

#endif /* __KGSL_LOG_H */