Skip to content

Commit

Permalink
PM / devfreq: Add clearing transitions stats
Browse files Browse the repository at this point in the history
Add clearing transition table and time in states devfreq statistics
by writing 0 (zero) to trans_stat file in devfreq sysfs. An example use
is like following:

echo 0 > /sys/class/devfreq/devfreqX/trans_stat

Signed-off-by: Kamil Konieczny <k.konieczny@samsung.com>
[cw00.choi: Edit return value if entering the wrong value for reset
 and use arrary3_size() to get the size of 3-dimensional array]
Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
  • Loading branch information
Kamil Konieczny authored and chanwoochoi committed Dec 30, 2019
1 parent b76b347 commit 14a3439
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 5 deletions.
11 changes: 7 additions & 4 deletions Documentation/ABI/testing/sysfs-class-devfreq
Original file line number Diff line number Diff line change
Expand Up @@ -55,12 +55,15 @@ What: /sys/class/devfreq/.../trans_stat
Date: October 2012
Contact: MyungJoo Ham <myungjoo.ham@samsung.com>
Description:
This ABI shows the statistics of devfreq behavior on a
specific device. It shows the time spent in each state and
the number of transitions between states.
This ABI shows or clears the statistics of devfreq behavior
on a specific device. It shows the time spent in each state
and the number of transitions between states.
In order to activate this ABI, the devfreq target device
driver should provide the list of available frequencies
with its profile.
with its profile. If need to reset the statistics of devfreq
behavior on a specific device, enter 0(zero) to 'trans_stat'
as following:
echo 0 > /sys/class/devfreq/.../trans_stat

What: /sys/class/devfreq/.../userspace/set_freq
Date: September 2011
Expand Down
29 changes: 28 additions & 1 deletion drivers/devfreq/devfreq.c
Original file line number Diff line number Diff line change
Expand Up @@ -1597,7 +1597,34 @@ static ssize_t trans_stat_show(struct device *dev,
devfreq->total_trans);
return len;
}
static DEVICE_ATTR_RO(trans_stat);

static ssize_t trans_stat_store(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
{
struct devfreq *df = to_devfreq(dev);
int err, value;

if (df->profile->max_state == 0)
return count;

err = kstrtoint(buf, 10, &value);
if (err || value != 0)
return -EINVAL;

mutex_lock(&df->lock);
memset(df->time_in_state, 0, (df->profile->max_state *
sizeof(*df->time_in_state)));
memset(df->trans_table, 0, array3_size(sizeof(unsigned int),
df->profile->max_state,
df->profile->max_state));
df->total_trans = 0;
df->last_stat_updated = get_jiffies_64();
mutex_unlock(&df->lock);

return count;
}
static DEVICE_ATTR_RW(trans_stat);

static struct attribute *devfreq_attrs[] = {
&dev_attr_name.attr,
Expand Down

0 comments on commit 14a3439

Please sign in to comment.