mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-04-15 21:47:40 +07:00
PM / devfreq: Move statistics to separate struct devfreq_stats
Count time and transitions between devfreq frequencies in separate struct devfreq_stats for improved code readability and maintenance. Signed-off-by: Kamil Konieczny <k.konieczny@samsung.com> Reviewed-by: Matthias Kaehlcke <mka@chromium.org> [cw00.choi: Fix the merge conflict in trasn_stat_store and use 'devfreq->stats.*' style for consistent coding style and restore the clean-up code of 'devfreq->profile->*'] Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
This commit is contained in:
parent
14a3439681
commit
1ebd0bc0e8
@ -224,8 +224,8 @@ int devfreq_update_status(struct devfreq *devfreq, unsigned long freq)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
devfreq->time_in_state[prev_lev] +=
|
devfreq->stats.time_in_state[prev_lev] +=
|
||||||
cur_time - devfreq->last_stat_updated;
|
cur_time - devfreq->stats.last_update;
|
||||||
|
|
||||||
lev = devfreq_get_freq_level(devfreq, freq);
|
lev = devfreq_get_freq_level(devfreq, freq);
|
||||||
if (lev < 0) {
|
if (lev < 0) {
|
||||||
@ -234,13 +234,13 @@ int devfreq_update_status(struct devfreq *devfreq, unsigned long freq)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (lev != prev_lev) {
|
if (lev != prev_lev) {
|
||||||
devfreq->trans_table[(prev_lev *
|
devfreq->stats.trans_table[
|
||||||
devfreq->profile->max_state) + lev]++;
|
(prev_lev * devfreq->profile->max_state) + lev]++;
|
||||||
devfreq->total_trans++;
|
devfreq->stats.total_trans++;
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
devfreq->last_stat_updated = cur_time;
|
devfreq->stats.last_update = cur_time;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(devfreq_update_status);
|
EXPORT_SYMBOL(devfreq_update_status);
|
||||||
@ -535,7 +535,7 @@ void devfreq_monitor_resume(struct devfreq *devfreq)
|
|||||||
msecs_to_jiffies(devfreq->profile->polling_ms));
|
msecs_to_jiffies(devfreq->profile->polling_ms));
|
||||||
|
|
||||||
out_update:
|
out_update:
|
||||||
devfreq->last_stat_updated = get_jiffies_64();
|
devfreq->stats.last_update = get_jiffies_64();
|
||||||
devfreq->stop_polling = false;
|
devfreq->stop_polling = false;
|
||||||
|
|
||||||
if (devfreq->profile->get_cur_freq &&
|
if (devfreq->profile->get_cur_freq &&
|
||||||
@ -807,28 +807,29 @@ struct devfreq *devfreq_add_device(struct device *dev,
|
|||||||
goto err_out;
|
goto err_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
devfreq->trans_table = devm_kzalloc(&devfreq->dev,
|
devfreq->stats.trans_table = devm_kzalloc(&devfreq->dev,
|
||||||
array3_size(sizeof(unsigned int),
|
array3_size(sizeof(unsigned int),
|
||||||
devfreq->profile->max_state,
|
devfreq->profile->max_state,
|
||||||
devfreq->profile->max_state),
|
devfreq->profile->max_state),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
if (!devfreq->trans_table) {
|
if (!devfreq->stats.trans_table) {
|
||||||
mutex_unlock(&devfreq->lock);
|
mutex_unlock(&devfreq->lock);
|
||||||
err = -ENOMEM;
|
err = -ENOMEM;
|
||||||
goto err_devfreq;
|
goto err_devfreq;
|
||||||
}
|
}
|
||||||
|
|
||||||
devfreq->time_in_state = devm_kcalloc(&devfreq->dev,
|
devfreq->stats.time_in_state = devm_kcalloc(&devfreq->dev,
|
||||||
devfreq->profile->max_state,
|
devfreq->profile->max_state,
|
||||||
sizeof(*devfreq->time_in_state),
|
sizeof(*devfreq->stats.time_in_state),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
if (!devfreq->time_in_state) {
|
if (!devfreq->stats.time_in_state) {
|
||||||
mutex_unlock(&devfreq->lock);
|
mutex_unlock(&devfreq->lock);
|
||||||
err = -ENOMEM;
|
err = -ENOMEM;
|
||||||
goto err_devfreq;
|
goto err_devfreq;
|
||||||
}
|
}
|
||||||
|
|
||||||
devfreq->last_stat_updated = get_jiffies_64();
|
devfreq->stats.total_trans = 0;
|
||||||
|
devfreq->stats.last_update = get_jiffies_64();
|
||||||
|
|
||||||
srcu_init_notifier_head(&devfreq->transition_notifier_list);
|
srcu_init_notifier_head(&devfreq->transition_notifier_list);
|
||||||
|
|
||||||
@ -1588,13 +1589,14 @@ static ssize_t trans_stat_show(struct device *dev,
|
|||||||
devfreq->profile->freq_table[i]);
|
devfreq->profile->freq_table[i]);
|
||||||
for (j = 0; j < max_state; j++)
|
for (j = 0; j < max_state; j++)
|
||||||
len += sprintf(buf + len, "%10u",
|
len += sprintf(buf + len, "%10u",
|
||||||
devfreq->trans_table[(i * max_state) + j]);
|
devfreq->stats.trans_table[(i * max_state) + j]);
|
||||||
|
|
||||||
len += sprintf(buf + len, "%10llu\n", (u64)
|
len += sprintf(buf + len, "%10llu\n", (u64)
|
||||||
jiffies64_to_msecs(devfreq->time_in_state[i]));
|
jiffies64_to_msecs(devfreq->stats.time_in_state[i]));
|
||||||
}
|
}
|
||||||
|
|
||||||
len += sprintf(buf + len, "Total transition : %u\n",
|
len += sprintf(buf + len, "Total transition : %u\n",
|
||||||
devfreq->total_trans);
|
devfreq->stats.total_trans);
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1613,13 +1615,13 @@ static ssize_t trans_stat_store(struct device *dev,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
mutex_lock(&df->lock);
|
mutex_lock(&df->lock);
|
||||||
memset(df->time_in_state, 0, (df->profile->max_state *
|
memset(df->stats.time_in_state, 0, (df->profile->max_state *
|
||||||
sizeof(*df->time_in_state)));
|
sizeof(*df->stats.time_in_state)));
|
||||||
memset(df->trans_table, 0, array3_size(sizeof(unsigned int),
|
memset(df->stats.trans_table, 0, array3_size(sizeof(unsigned int),
|
||||||
df->profile->max_state,
|
df->profile->max_state,
|
||||||
df->profile->max_state));
|
df->profile->max_state));
|
||||||
df->total_trans = 0;
|
df->stats.total_trans = 0;
|
||||||
df->last_stat_updated = get_jiffies_64();
|
df->stats.last_update = get_jiffies_64();
|
||||||
mutex_unlock(&df->lock);
|
mutex_unlock(&df->lock);
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
|
@ -107,6 +107,20 @@ struct devfreq_dev_profile {
|
|||||||
unsigned int max_state;
|
unsigned int max_state;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct devfreq_stats - Statistics of devfreq device behavior
|
||||||
|
* @total_trans: Number of devfreq transitions.
|
||||||
|
* @trans_table: Statistics of devfreq transitions.
|
||||||
|
* @time_in_state: Statistics of devfreq states.
|
||||||
|
* @last_update: The last time stats were updated.
|
||||||
|
*/
|
||||||
|
struct devfreq_stats {
|
||||||
|
unsigned int total_trans;
|
||||||
|
unsigned int *trans_table;
|
||||||
|
u64 *time_in_state;
|
||||||
|
u64 last_update;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct devfreq - Device devfreq structure
|
* struct devfreq - Device devfreq structure
|
||||||
* @node: list node - contains the devices with devfreq that have been
|
* @node: list node - contains the devices with devfreq that have been
|
||||||
@ -132,10 +146,7 @@ struct devfreq_dev_profile {
|
|||||||
* @suspend_freq: frequency of a device set during suspend phase.
|
* @suspend_freq: frequency of a device set during suspend phase.
|
||||||
* @resume_freq: frequency of a device set in resume phase.
|
* @resume_freq: frequency of a device set in resume phase.
|
||||||
* @suspend_count: suspend requests counter for a device.
|
* @suspend_count: suspend requests counter for a device.
|
||||||
* @total_trans: Number of devfreq transitions
|
* @stats: Statistics of devfreq device behavior
|
||||||
* @trans_table: Statistics of devfreq transitions
|
|
||||||
* @time_in_state: Statistics of devfreq states
|
|
||||||
* @last_stat_updated: The last time stat updated
|
|
||||||
* @transition_notifier_list: list head of DEVFREQ_TRANSITION_NOTIFIER notifier
|
* @transition_notifier_list: list head of DEVFREQ_TRANSITION_NOTIFIER notifier
|
||||||
* @nb_min: Notifier block for DEV_PM_QOS_MIN_FREQUENCY
|
* @nb_min: Notifier block for DEV_PM_QOS_MIN_FREQUENCY
|
||||||
* @nb_max: Notifier block for DEV_PM_QOS_MAX_FREQUENCY
|
* @nb_max: Notifier block for DEV_PM_QOS_MAX_FREQUENCY
|
||||||
@ -174,11 +185,8 @@ struct devfreq {
|
|||||||
unsigned long resume_freq;
|
unsigned long resume_freq;
|
||||||
atomic_t suspend_count;
|
atomic_t suspend_count;
|
||||||
|
|
||||||
/* information for device frequency transition */
|
/* information for device frequency transitions */
|
||||||
unsigned int total_trans;
|
struct devfreq_stats stats;
|
||||||
unsigned int *trans_table;
|
|
||||||
u64 *time_in_state;
|
|
||||||
u64 last_stat_updated;
|
|
||||||
|
|
||||||
struct srcu_notifier_head transition_notifier_list;
|
struct srcu_notifier_head transition_notifier_list;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user