Commit a6e3e6f1 authored by Linus Torvalds's avatar Linus Torvalds

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
...@@ -1983,7 +1983,6 @@ config FAIL_SUNRPC ...@@ -1983,7 +1983,6 @@ config FAIL_SUNRPC
config FAULT_INJECTION_STACKTRACE_FILTER config FAULT_INJECTION_STACKTRACE_FILTER
bool "stacktrace filter for fault-injection capabilities" bool "stacktrace filter for fault-injection capabilities"
depends on FAULT_INJECTION_DEBUG_FS && STACKTRACE_SUPPORT depends on FAULT_INJECTION_DEBUG_FS && STACKTRACE_SUPPORT
depends on !X86_64
select STACKTRACE select STACKTRACE
depends on FRAME_POINTER || MIPS || PPC || S390 || MICROBLAZE || ARM || ARC || X86 depends on FRAME_POINTER || MIPS || PPC || S390 || MICROBLAZE || ARM || ARC || X86
help help
......
...@@ -71,7 +71,7 @@ static bool fail_stacktrace(struct fault_attr *attr) ...@@ -71,7 +71,7 @@ static bool fail_stacktrace(struct fault_attr *attr)
int n, nr_entries; int n, nr_entries;
bool found = (attr->require_start == 0 && attr->require_end == ULONG_MAX); 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; return found;
nr_entries = stack_trace_save(entries, depth, 1); nr_entries = stack_trace_save(entries, depth, 1);
...@@ -102,10 +102,16 @@ static inline bool fail_stacktrace(struct fault_attr *attr) ...@@ -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 should_fail_ex(struct fault_attr *attr, ssize_t size, int flags)
{ {
bool stack_checked = false;
if (in_task()) { if (in_task()) {
unsigned int fail_nth = READ_ONCE(current->fail_nth); unsigned int fail_nth = READ_ONCE(current->fail_nth);
if (fail_nth) { if (fail_nth) {
if (!fail_stacktrace(attr))
return false;
stack_checked = true;
fail_nth--; fail_nth--;
WRITE_ONCE(current->fail_nth, fail_nth); WRITE_ONCE(current->fail_nth, fail_nth);
if (!fail_nth) if (!fail_nth)
...@@ -125,6 +131,9 @@ bool should_fail_ex(struct fault_attr *attr, ssize_t size, int flags) ...@@ -125,6 +131,9 @@ bool should_fail_ex(struct fault_attr *attr, ssize_t size, int flags)
if (atomic_read(&attr->times) == 0) if (atomic_read(&attr->times) == 0)
return false; return false;
if (!stack_checked && !fail_stacktrace(attr))
return false;
if (atomic_read(&attr->space) > size) { if (atomic_read(&attr->space) > size) {
atomic_sub(size, &attr->space); atomic_sub(size, &attr->space);
return false; return false;
...@@ -139,9 +148,6 @@ bool should_fail_ex(struct fault_attr *attr, ssize_t size, int flags) ...@@ -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)) if (attr->probability <= get_random_u32_below(100))
return false; return false;
if (!fail_stacktrace(attr))
return false;
fail: fail:
if (!(flags & FAULT_NOWARN)) if (!(flags & FAULT_NOWARN))
fail_dump(attr); fail_dump(attr);
...@@ -226,10 +232,10 @@ struct dentry *fault_create_debugfs_attr(const char *name, ...@@ -226,10 +232,10 @@ struct dentry *fault_create_debugfs_attr(const char *name,
#ifdef CONFIG_FAULT_INJECTION_STACKTRACE_FILTER #ifdef CONFIG_FAULT_INJECTION_STACKTRACE_FILTER
debugfs_create_stacktrace_depth("stacktrace-depth", mode, dir, debugfs_create_stacktrace_depth("stacktrace-depth", mode, dir,
&attr->stacktrace_depth); &attr->stacktrace_depth);
debugfs_create_ul("require-start", mode, dir, &attr->require_start); debugfs_create_xul("require-start", mode, dir, &attr->require_start);
debugfs_create_ul("require-end", mode, dir, &attr->require_end); debugfs_create_xul("require-end", mode, dir, &attr->require_end);
debugfs_create_ul("reject-start", mode, dir, &attr->reject_start); debugfs_create_xul("reject-start", mode, dir, &attr->reject_start);
debugfs_create_ul("reject-end", mode, dir, &attr->reject_end); debugfs_create_xul("reject-end", mode, dir, &attr->reject_end);
#endif /* CONFIG_FAULT_INJECTION_STACKTRACE_FILTER */ #endif /* CONFIG_FAULT_INJECTION_STACKTRACE_FILTER */
attr->dname = dget(dir); attr->dname = dget(dir);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment