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

Commit 87f42026 authored by Prasad Sodagudi's avatar Prasad Sodagudi Committed by Patrick Daly
Browse files

debug-pagealloc: print physical address for detected corruption



It's sometimes useful to know the physical address which
has beencorrupted, especially in systems with multiple
bus masters and DMA engines the capability of writing
to memory. It's may also be useful for identifying the
location of failures of memory cells in cases of
device-specific corruption. So print the physical
start address of the page to help in these scenarios.

Change-Id: I081edd8b1c06913c0057a6cb9dda18077cfbdc30
Signed-off-by: default avatarMatt Wagantall <mattw@codeaurora.org>
Signed-off-by: default avatarPrasad Sodagudi <psodagud@codeaurora.org>
Signed-off-by: default avatarPatrick Daly <pdaly@codeaurora.org>
parent 6ba925c3
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -106,7 +106,8 @@ static bool single_bit_flip(unsigned char a, unsigned char b)
	return error && !(error & (error - 1));
}

static void check_poison_mem(unsigned char *mem, size_t bytes)
static void check_poison_mem(struct page *page,
			     unsigned char *mem, size_t bytes)
{
	static DEFINE_RATELIMIT_STATE(ratelimit, 5 * HZ, 10);
	unsigned char *start;
@@ -127,9 +128,11 @@ static void check_poison_mem(unsigned char *mem, size_t bytes)
	if (!__ratelimit(&ratelimit))
		return;
	else if (start == end && single_bit_flip(*start, PAGE_POISON))
		pr_err("pagealloc: single bit error\n");
		pr_err("pagealloc: single bit error on page with phys start 0x%lx\n",
			(unsigned long)page_to_phys(page));
	else
		pr_err("pagealloc: memory corruption\n");
		pr_err("pagealloc: memory corruption on page with phys start 0x%lx\n",
			(unsigned long)page_to_phys(page));

	print_hex_dump(KERN_ERR, "", DUMP_PREFIX_ADDRESS, 16, 1, start,
			end - start + 1, 1);
@@ -145,7 +148,7 @@ static void unpoison_page(struct page *page)
		return;

	addr = kmap_atomic(page);
	check_poison_mem(addr, PAGE_SIZE);
	check_poison_mem(page, addr, PAGE_SIZE);
	clear_page_poison(page);
	kunmap_atomic(addr);
}