Commit a6e3e6f1 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'mm-nonmm-stable-2022-12-17-20-32' of...

Merge tag 'mm-nonmm-stable-2022-12-17-20-32' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm

Pull fault-injection updates from Andrew Morton:
 "Some fault-injection improvements from Wei Yongjun which enable
  stacktrace filtering on x86_64"

* tag 'mm-nonmm-stable-2022-12-17-20-32' of git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm:
  fault-injection: make stacktrace filter works as expected
  fault-injection: make some stack filter attrs more readable
  fault-injection: skip stacktrace filtering by default
  fault-injection: allow stacktrace filter for x86-64
parents 1ea9d333 f9eeef59
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -1983,7 +1983,6 @@ config FAIL_SUNRPC
config FAULT_INJECTION_STACKTRACE_FILTER
	bool "stacktrace filter for fault-injection capabilities"
	depends on FAULT_INJECTION_DEBUG_FS && STACKTRACE_SUPPORT
	depends on !X86_64
	select STACKTRACE
	depends on FRAME_POINTER || MIPS || PPC || S390 || MICROBLAZE || ARM || ARC || X86
	help
+14 −8
Original line number Diff line number Diff line
@@ -71,7 +71,7 @@ static bool fail_stacktrace(struct fault_attr *attr)
	int n, nr_entries;
	bool found = (attr->require_start == 0 && attr->require_end == ULONG_MAX);

	if (depth == 0)
	if (depth == 0 || (found && !attr->reject_start && !attr->reject_end))
		return found;

	nr_entries = stack_trace_save(entries, depth, 1);
@@ -102,10 +102,16 @@ static inline bool fail_stacktrace(struct fault_attr *attr)

bool should_fail_ex(struct fault_attr *attr, ssize_t size, int flags)
{
	bool stack_checked = false;

	if (in_task()) {
		unsigned int fail_nth = READ_ONCE(current->fail_nth);

		if (fail_nth) {
			if (!fail_stacktrace(attr))
				return false;

			stack_checked = true;
			fail_nth--;
			WRITE_ONCE(current->fail_nth, fail_nth);
			if (!fail_nth)
@@ -125,6 +131,9 @@ bool should_fail_ex(struct fault_attr *attr, ssize_t size, int flags)
	if (atomic_read(&attr->times) == 0)
		return false;

	if (!stack_checked && !fail_stacktrace(attr))
		return false;

	if (atomic_read(&attr->space) > size) {
		atomic_sub(size, &attr->space);
		return false;
@@ -139,9 +148,6 @@ bool should_fail_ex(struct fault_attr *attr, ssize_t size, int flags)
	if (attr->probability <= get_random_u32_below(100))
		return false;

	if (!fail_stacktrace(attr))
		return false;

fail:
	if (!(flags & FAULT_NOWARN))
		fail_dump(attr);
@@ -226,10 +232,10 @@ struct dentry *fault_create_debugfs_attr(const char *name,
#ifdef CONFIG_FAULT_INJECTION_STACKTRACE_FILTER
	debugfs_create_stacktrace_depth("stacktrace-depth", mode, dir,
					&attr->stacktrace_depth);
	debugfs_create_ul("require-start", mode, dir, &attr->require_start);
	debugfs_create_ul("require-end", mode, dir, &attr->require_end);
	debugfs_create_ul("reject-start", mode, dir, &attr->reject_start);
	debugfs_create_ul("reject-end", mode, dir, &attr->reject_end);
	debugfs_create_xul("require-start", mode, dir, &attr->require_start);
	debugfs_create_xul("require-end", mode, dir, &attr->require_end);
	debugfs_create_xul("reject-start", mode, dir, &attr->reject_start);
	debugfs_create_xul("reject-end", mode, dir, &attr->reject_end);
#endif /* CONFIG_FAULT_INJECTION_STACKTRACE_FILTER */

	attr->dname = dget(dir);