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

Commit 279398cf authored by Jordan Crouse's avatar Jordan Crouse
Browse files

msm: kgsl: Add 'strict memory' debug mode



Add a root only debug mode to force GFP_NORETRY for all page_alloc
memory allocations. This lets stress applications allocate lots of
memory and test error paths without worrying about getting on the
wrong side of the OOM killer.

Enable it like so:  "echo 1 > /d/kgsl/strict_memory"

Change-Id: Ic0dedbadbb627342640c90c589fa384eaaafe245
Signed-off-by: default avatarJordan Crouse <jcrouse@codeaurora.org>
parent 2df93458
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -52,6 +52,20 @@ KGSL_DEBUGFS_LOG(ctxt_log);
KGSL_DEBUGFS_LOG(mem_log);
KGSL_DEBUGFS_LOG(pwr_log);

static int _strict_set(void *data, u64 val)
{
	kgsl_sharedmem_set_noretry(val ? true : false);
	return 0;
}

static int _strict_get(void *data, u64 *val)
{
	*val = kgsl_sharedmem_get_noretry();
	return 0;
}

DEFINE_SIMPLE_ATTRIBUTE(_strict_fops, _strict_get, _strict_set, "%llu\n");

void kgsl_device_debugfs_init(struct kgsl_device *device)
{
	if (kgsl_debugfs_dir && !IS_ERR(kgsl_debugfs_dir))
@@ -240,7 +254,15 @@ void kgsl_process_init_debugfs(struct kgsl_process_private *private)

void kgsl_core_debugfs_init(void)
{
	struct dentry *debug_dir;

	kgsl_debugfs_dir = debugfs_create_dir("kgsl", NULL);

	debug_dir = debugfs_create_dir("debug", kgsl_debugfs_dir);

	debugfs_create_file("strict_memory", 0644, debug_dir, NULL,
		&_strict_fops);

	proc_d_debugfs = debugfs_create_dir("proc", kgsl_debugfs_dir);
}

+26 −3
Original line number Diff line number Diff line
@@ -28,6 +28,15 @@
#include "kgsl_log.h"
#include "adreno.h"

/*
 * The user can set this from debugfs to force failed memory allocations to
 * fail without trying OOM first.  This is a debug setting useful for
 * stress applications that want to test failure cases without pushing the
 * system into unrecoverable OOM panics
 */

static bool sharedmem_noretry_flag;

static DEFINE_MUTEX(kernel_map_global_lock);

struct cp2_mem_chunks {
@@ -739,6 +748,9 @@ _kgsl_sharedmem_page_alloc(struct kgsl_memdesc *memdesc,
		else
			gfp_mask |= GFP_KERNEL;

		if (sharedmem_noretry_flag == true)
			gfp_mask |= __GFP_NORETRY | __GFP_NOWARN;

		page = alloc_pages(gfp_mask, get_order(page_size));

		if (page == NULL) {
@@ -754,8 +766,9 @@ _kgsl_sharedmem_page_alloc(struct kgsl_memdesc *memdesc,
			 */
			memdesc->size = (size - len);

			if (sharedmem_noretry_flag != true)
				KGSL_CORE_ERR(
				"Out of memory: only allocated %llXKB of %llXKB requested\n",
					"Out of memory: only allocated %lldKB of %lldKB requested\n",
					(size - len) >> 10, size >> 10);

			ret = -ENOMEM;
@@ -1234,3 +1247,13 @@ static void kgsl_cma_unlock_secure(struct kgsl_memdesc *memdesc)
	if (!scm_lock_chunk(memdesc, 0))
		ClearPagePrivate(sg_page(memdesc->sgt->sgl));
}

void kgsl_sharedmem_set_noretry(bool val)
{
	sharedmem_noretry_flag = val;
}

bool kgsl_sharedmem_get_noretry(void)
{
	return sharedmem_noretry_flag;
}
+3 −0
Original line number Diff line number Diff line
@@ -325,4 +325,7 @@ static inline void kgsl_free_global(struct kgsl_memdesc *memdesc)
	kgsl_sharedmem_free(memdesc);
}

void kgsl_sharedmem_set_noretry(bool val);
bool kgsl_sharedmem_get_noretry(void);

#endif /* __KGSL_SHAREDMEM_H */