Skip to content

Commit

Permalink
pstore/ftrace: Allow immediate recording
Browse files Browse the repository at this point in the history
Without a module param knob there was no way to enable pstore ftrace
recording early enough to debug hangs happening during the boot process
before userspace is up enough to enable it via the regular debugfs
knobs.

Signed-off-by: Uwe Kleine-König <[email protected]>
Co-developed-by: Kees Cook <[email protected]>
Signed-off-by: Kees Cook <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
  • Loading branch information
Uwe Kleine-König authored and kees committed Nov 18, 2021
1 parent fa55b7d commit a5d05b0
Showing 1 changed file with 30 additions and 16 deletions.
46 changes: 30 additions & 16 deletions fs/pstore/ftrace.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,20 +64,12 @@ static struct ftrace_ops pstore_ftrace_ops __read_mostly = {
static DEFINE_MUTEX(pstore_ftrace_lock);
static bool pstore_ftrace_enabled;

static ssize_t pstore_ftrace_knob_write(struct file *f, const char __user *buf,
size_t count, loff_t *ppos)
static int pstore_set_ftrace_enabled(bool on)
{
u8 on;
ssize_t ret;

ret = kstrtou8_from_user(buf, count, 2, &on);
if (ret)
return ret;

mutex_lock(&pstore_ftrace_lock);

if (!on ^ pstore_ftrace_enabled)
goto out;
if (on == pstore_ftrace_enabled)
return 0;

if (on) {
ftrace_ops_set_global_filter(&pstore_ftrace_ops);
Expand All @@ -89,15 +81,30 @@ static ssize_t pstore_ftrace_knob_write(struct file *f, const char __user *buf,
if (ret) {
pr_err("%s: unable to %sregister ftrace ops: %zd\n",
__func__, on ? "" : "un", ret);
goto err;
} else {
pstore_ftrace_enabled = on;
}

pstore_ftrace_enabled = on;
out:
ret = count;
err:
return ret;
}

static ssize_t pstore_ftrace_knob_write(struct file *f, const char __user *buf,
size_t count, loff_t *ppos)
{
u8 on;
ssize_t ret;

ret = kstrtou8_from_user(buf, count, 2, &on);
if (ret)
return ret;

mutex_lock(&pstore_ftrace_lock);
ret = pstore_set_ftrace_enabled(on);
mutex_unlock(&pstore_ftrace_lock);

if (ret == 0)
ret = count;

return ret;
}

Expand All @@ -117,13 +124,20 @@ static const struct file_operations pstore_knob_fops = {

static struct dentry *pstore_ftrace_dir;

static bool record_ftrace;
module_param(record_ftrace, bool, 0400);
MODULE_PARM_DESC(record_ftrace,
"enable ftrace recording immediately (default: off)");

void pstore_register_ftrace(void)
{
if (!psinfo->write)
return;

pstore_ftrace_dir = debugfs_create_dir("pstore", NULL);

pstore_set_ftrace_enabled(record_ftrace);

debugfs_create_file("record_ftrace", 0600, pstore_ftrace_dir, NULL,
&pstore_knob_fops);
}
Expand Down

0 comments on commit a5d05b0

Please sign in to comment.