mirror of https://gitee.com/openkylin/linux.git
PM / wakeup: Use seq_open() to show wakeup stats
single_open() interface requires that the whole output must fit into a single buffer. This will lead to timeout when system memory is not in a good situation. This patch use seq_open() to show wakeup stats. This method need only one page, so timeout will not be observed. Signed-off-by: Ganesh Mahendran <opensource.ganesh@gmail.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
7f817ba942
commit
00ee22c289
|
@ -1029,32 +1029,75 @@ static int print_wakeup_source_stats(struct seq_file *m,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
static void *wakeup_sources_stats_seq_start(struct seq_file *m,
|
||||||
* wakeup_sources_stats_show - Print wakeup sources statistics information.
|
loff_t *pos)
|
||||||
* @m: seq_file to print the statistics into.
|
|
||||||
*/
|
|
||||||
static int wakeup_sources_stats_show(struct seq_file *m, void *unused)
|
|
||||||
{
|
{
|
||||||
struct wakeup_source *ws;
|
struct wakeup_source *ws;
|
||||||
int srcuidx;
|
loff_t n = *pos;
|
||||||
|
int *srcuidx = m->private;
|
||||||
|
|
||||||
seq_puts(m, "name\t\tactive_count\tevent_count\twakeup_count\t"
|
if (n == 0) {
|
||||||
"expire_count\tactive_since\ttotal_time\tmax_time\t"
|
seq_puts(m, "name\t\tactive_count\tevent_count\twakeup_count\t"
|
||||||
"last_change\tprevent_suspend_time\n");
|
"expire_count\tactive_since\ttotal_time\tmax_time\t"
|
||||||
|
"last_change\tprevent_suspend_time\n");
|
||||||
|
}
|
||||||
|
|
||||||
srcuidx = srcu_read_lock(&wakeup_srcu);
|
*srcuidx = srcu_read_lock(&wakeup_srcu);
|
||||||
list_for_each_entry_rcu(ws, &wakeup_sources, entry)
|
list_for_each_entry_rcu(ws, &wakeup_sources, entry) {
|
||||||
print_wakeup_source_stats(m, ws);
|
if (n-- <= 0)
|
||||||
srcu_read_unlock(&wakeup_srcu, srcuidx);
|
return ws;
|
||||||
|
}
|
||||||
|
|
||||||
print_wakeup_source_stats(m, &deleted_ws);
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void *wakeup_sources_stats_seq_next(struct seq_file *m,
|
||||||
|
void *v, loff_t *pos)
|
||||||
|
{
|
||||||
|
struct wakeup_source *ws = v;
|
||||||
|
struct wakeup_source *next_ws = NULL;
|
||||||
|
|
||||||
|
++(*pos);
|
||||||
|
|
||||||
|
list_for_each_entry_continue_rcu(ws, &wakeup_sources, entry) {
|
||||||
|
next_ws = ws;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return next_ws;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void wakeup_sources_stats_seq_stop(struct seq_file *m, void *v)
|
||||||
|
{
|
||||||
|
int *srcuidx = m->private;
|
||||||
|
|
||||||
|
srcu_read_unlock(&wakeup_srcu, *srcuidx);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wakeup_sources_stats_seq_show - Print wakeup sources statistics information.
|
||||||
|
* @m: seq_file to print the statistics into.
|
||||||
|
* @v: wakeup_source of each iteration
|
||||||
|
*/
|
||||||
|
static int wakeup_sources_stats_seq_show(struct seq_file *m, void *v)
|
||||||
|
{
|
||||||
|
struct wakeup_source *ws = v;
|
||||||
|
|
||||||
|
print_wakeup_source_stats(m, ws);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const struct seq_operations wakeup_sources_stats_seq_ops = {
|
||||||
|
.start = wakeup_sources_stats_seq_start,
|
||||||
|
.next = wakeup_sources_stats_seq_next,
|
||||||
|
.stop = wakeup_sources_stats_seq_stop,
|
||||||
|
.show = wakeup_sources_stats_seq_show,
|
||||||
|
};
|
||||||
|
|
||||||
static int wakeup_sources_stats_open(struct inode *inode, struct file *file)
|
static int wakeup_sources_stats_open(struct inode *inode, struct file *file)
|
||||||
{
|
{
|
||||||
return single_open(file, wakeup_sources_stats_show, NULL);
|
return seq_open_private(file, &wakeup_sources_stats_seq_ops, sizeof(int));
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct file_operations wakeup_sources_stats_fops = {
|
static const struct file_operations wakeup_sources_stats_fops = {
|
||||||
|
@ -1062,7 +1105,7 @@ static const struct file_operations wakeup_sources_stats_fops = {
|
||||||
.open = wakeup_sources_stats_open,
|
.open = wakeup_sources_stats_open,
|
||||||
.read = seq_read,
|
.read = seq_read,
|
||||||
.llseek = seq_lseek,
|
.llseek = seq_lseek,
|
||||||
.release = single_release,
|
.release = seq_release_private,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init wakeup_sources_debugfs_init(void)
|
static int __init wakeup_sources_debugfs_init(void)
|
||||||
|
|
Loading…
Reference in New Issue