Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 329771
b: refs/heads/master
c: 2e37abb
h: refs/heads/master
i:
  329769: 65b8cc3
  329767: f7e5b1c
v: v3
  • Loading branch information
Fernando Guzman Lugo authored and Ohad Ben-Cohen committed Sep 18, 2012
1 parent 7b3c62f commit dd7a518
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 2 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 70b85ef83ce3523f709b622d2c4cb31778686338
refs/heads/master: 2e37abb89a2ef13c524b0728bb9893f996a10b6b
3 changes: 2 additions & 1 deletion trunk/drivers/remoteproc/remoteproc_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -965,7 +965,8 @@ static void rproc_crash_handler_work(struct work_struct *work)

mutex_unlock(&rproc->lock);

rproc_trigger_recovery(rproc);
if (!rproc->recovery_disabled)
rproc_trigger_recovery(rproc);
}

/**
Expand Down
81 changes: 81 additions & 0 deletions trunk/drivers/remoteproc/remoteproc_debugfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@
#include <linux/debugfs.h>
#include <linux/remoteproc.h>
#include <linux/device.h>
#include <linux/uaccess.h>

#include "remoteproc_internal.h"

/* remoteproc debugfs parent dir */
static struct dentry *rproc_dbg;
Expand Down Expand Up @@ -111,6 +114,82 @@ static const struct file_operations rproc_name_ops = {
.llseek = generic_file_llseek,
};

/* expose recovery flag via debugfs */
static ssize_t rproc_recovery_read(struct file *filp, char __user *userbuf,
size_t count, loff_t *ppos)
{
struct rproc *rproc = filp->private_data;
char *buf = rproc->recovery_disabled ? "disabled\n" : "enabled\n";

return simple_read_from_buffer(userbuf, count, ppos, buf, strlen(buf));
}

/*
* By writing to the 'recovery' debugfs entry, we control the behavior of the
* recovery mechanism dynamically. The default value of this entry is "enabled".
*
* The 'recovery' debugfs entry supports these commands:
*
* enabled: When enabled, the remote processor will be automatically
* recovered whenever it crashes. Moreover, if the remote
* processor crashes while recovery is disabled, it will
* be automatically recovered too as soon as recovery is enabled.
*
* disabled: When disabled, a remote processor will remain in a crashed
* state if it crashes. This is useful for debugging purposes;
* without it, debugging a crash is substantially harder.
*
* recover: This function will trigger an immediate recovery if the
* remote processor is in a crashed state, without changing
* or checking the recovery state (enabled/disabled).
* This is useful during debugging sessions, when one expects
* additional crashes to happen after enabling recovery. In this
* case, enabling recovery will make it hard to debug subsequent
* crashes, so it's recommended to keep recovery disabled, and
* instead use the "recover" command as needed.
*/
static ssize_t
rproc_recovery_write(struct file *filp, const char __user *user_buf,
size_t count, loff_t *ppos)
{
struct rproc *rproc = filp->private_data;
char buf[10];
int ret;

if (count > sizeof(buf))
return count;

ret = copy_from_user(buf, user_buf, count);
if (ret)
return ret;

/* remove end of line */
if (buf[count - 1] == '\n')
buf[count - 1] = '\0';

if (!strncmp(buf, "enabled", count)) {
rproc->recovery_disabled = false;
/* if rproc has crashed, trigger recovery */
if (rproc->state == RPROC_CRASHED)
rproc_trigger_recovery(rproc);
} else if (!strncmp(buf, "disabled", count)) {
rproc->recovery_disabled = true;
} else if (!strncmp(buf, "recover", count)) {
/* if rproc has crashed, trigger recovery */
if (rproc->state == RPROC_CRASHED)
rproc_trigger_recovery(rproc);
}

return count;
}

static const struct file_operations rproc_recovery_ops = {
.read = rproc_recovery_read,
.write = rproc_recovery_write,
.open = simple_open,
.llseek = generic_file_llseek,
};

void rproc_remove_trace_file(struct dentry *tfile)
{
debugfs_remove(tfile);
Expand Down Expand Up @@ -154,6 +233,8 @@ void rproc_create_debug_dir(struct rproc *rproc)
rproc, &rproc_name_ops);
debugfs_create_file("state", 0400, rproc->dbg_dir,
rproc, &rproc_state_ops);
debugfs_create_file("recovery", 0400, rproc->dbg_dir,
rproc, &rproc_recovery_ops);
}

void __init rproc_init_debugfs(void)
Expand Down
2 changes: 2 additions & 0 deletions trunk/include/linux/remoteproc.h
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,7 @@ enum rproc_crash_type {
* @crash_handler: workqueue for handling a crash
* @crash_cnt: crash counter
* @crash_comp: completion used to sync crash handler and the rproc reload
* @recovery_disabled: flag that state if recovery was disabled
*/
struct rproc {
struct klist_node node;
Expand All @@ -425,6 +426,7 @@ struct rproc {
struct work_struct crash_handler;
unsigned crash_cnt;
struct completion crash_comp;
bool recovery_disabled;
};

/* we currently support only two vrings per rvdev */
Expand Down

0 comments on commit dd7a518

Please sign in to comment.