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

Commit cd42f4a3 authored by Tony Luck's avatar Tony Luck
Browse files

HWPOISON: Clean up memory_failure() vs. __memory_failure()



There is only one caller of memory_failure(), all other users call
__memory_failure() and pass in the flags argument explicitly. The
lone user of memory_failure() will soon need to pass flags too.

Add flags argument to the callsite in mce.c. Delete the old memory_failure()
function, and then rename __memory_failure() without the leading "__".

Provide clearer message when action optional memory errors are ignored.

Acked-by: default avatarBorislav Petkov <bp@amd64.org>
Signed-off-by: default avatarTony Luck <tony.luck@intel.com>
parent dc47ce90
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -1046,11 +1046,15 @@ void do_machine_check(struct pt_regs *regs, long error_code)
}
EXPORT_SYMBOL_GPL(do_machine_check);

/* dummy to break dependency. actual code is in mm/memory-failure.c */
void __attribute__((weak)) memory_failure(unsigned long pfn, int vector)
#ifndef CONFIG_MEMORY_FAILURE
int memory_failure(unsigned long pfn, int vector, int flags)
{
	printk(KERN_ERR "Action optional memory failure at %lx ignored\n", pfn);
	printk(KERN_ERR "Uncorrected memory error in page 0x%lx ignored\n"
		"Rebuild kernel with CONFIG_MEMORY_FAILURE=y for smarter handling\n", pfn);

	return 0;
}
#endif

/*
 * Called after mce notification in process context. This code
@@ -1068,7 +1072,7 @@ void mce_notify_process(void)
	unsigned long pfn;
	mce_notify_irq();
	while (mce_ring_get(&pfn))
		memory_failure(pfn, MCE_VECTOR);
		memory_failure(pfn, MCE_VECTOR, 0);
}

static void mce_process_work(struct work_struct *dummy)
+1 −1
Original line number Diff line number Diff line
@@ -474,7 +474,7 @@ store_hard_offline_page(struct class *class,
	if (strict_strtoull(buf, 0, &pfn) < 0)
		return -EINVAL;
	pfn >>= PAGE_SHIFT;
	ret = __memory_failure(pfn, 0, 0);
	ret = memory_failure(pfn, 0, 0);
	return ret ? ret : count;
}

+1 −2
Original line number Diff line number Diff line
@@ -1607,8 +1607,7 @@ void vmemmap_populate_print_last(void);
enum mf_flags {
	MF_COUNT_INCREASED = 1 << 0,
};
extern void memory_failure(unsigned long pfn, int trapno);
extern int __memory_failure(unsigned long pfn, int trapno, int flags);
extern int memory_failure(unsigned long pfn, int trapno, int flags);
extern void memory_failure_queue(unsigned long pfn, int trapno, int flags);
extern int unpoison_memory(unsigned long pfn);
extern int sysctl_memory_failure_early_kill;
+2 −2
Original line number Diff line number Diff line
@@ -45,7 +45,7 @@ static int hwpoison_inject(void *data, u64 val)
	 * do a racy check with elevated page count, to make sure PG_hwpoison
	 * will only be set for the targeted owner (or on a free page).
	 * We temporarily take page lock for try_get_mem_cgroup_from_page().
	 * __memory_failure() will redo the check reliably inside page lock.
	 * memory_failure() will redo the check reliably inside page lock.
	 */
	lock_page(hpage);
	err = hwpoison_filter(hpage);
@@ -55,7 +55,7 @@ static int hwpoison_inject(void *data, u64 val)

inject:
	printk(KERN_INFO "Injecting memory failure at pfn %lx\n", pfn);
	return __memory_failure(pfn, 18, MF_COUNT_INCREASED);
	return memory_failure(pfn, 18, MF_COUNT_INCREASED);
}

static int hwpoison_unpoison(void *data, u64 val)
+1 −1
Original line number Diff line number Diff line
@@ -251,7 +251,7 @@ static int madvise_hwpoison(int bhv, unsigned long start, unsigned long end)
		printk(KERN_INFO "Injecting memory failure for page %lx at %lx\n",
		       page_to_pfn(p), start);
		/* Ignore return value for now */
		__memory_failure(page_to_pfn(p), 0, MF_COUNT_INCREASED);
		memory_failure(page_to_pfn(p), 0, MF_COUNT_INCREASED);
	}
	return ret;
}
Loading