mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 04:31:50 +00:00
Some fault-injection improvements from Wei Yongjun which enable stacktrace
filtering on x86_64. -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQTTMBEPP41GrTpTJgfdBJ7gKXxAjgUCY56YjgAKCRDdBJ7gKXxA jni0AQCXYCZE1pOVXnB+IA1G1xkM0f1xDS/D63uJVl7Lyurv5QEAvJWX25DsTbLR c0bq3y2PPpHzrcDyPhciVlY/iplHQQM= =tfs8 -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
a6e3e6f138
@ -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
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user