Hi Eric,
I'm working on the P-state statistics of PowerTOP.
Based on the dtrace probe you added,
----
DTRACE_PROBE2(cpu_change_speed, processorid_t, cpudsp->cpu_id,
uint_t, new_spd->speed);
----
It's too complex for me to collect data of P-state statistics.
(Maybe there is a better way I didn't realize).
So I have to make another patch as follows.
I'm not sure if it's acceptable, because I added a new member in the
structure "cpudrv_pm_spd_t".
Any comments and suggestions?
Thanks,
-Aubrey
--------
diff -r 05bb1c8f17bc usr/src/uts/common/io/cpudrv.c
--- a/usr/src/uts/common/io/cpudrv.c Thu Nov 15 13:24:44 2007 +0800
+++ b/usr/src/uts/common/io/cpudrv.c Fri Nov 16 02:01:26 2007 +0800
@@ -455,9 +455,10 @@ cpudrv_power(dev_info_t *dip, int comp,
int instance;
cpudrv_devstate_t *cpudsp;
cpudrv_pm_t *cpupm;
- cpudrv_pm_spd_t *new_spd;
+ cpudrv_pm_spd_t *cur_spd, *new_spd;
boolean_t is_ready;
int ret;
+ uint_t lbolt_cnt;
instance = ddi_get_instance(dip);
@@ -471,6 +472,11 @@ cpudrv_power(dev_info_t *dip, int comp,
mutex_enter(&cpudsp->lock);
cpupm = &(cpudsp->cpudrv_pm);
+ if ((cur_spd = cpupm->cur_spd) == NULL) {
+ mutex_exit(&cpudsp->lock);
+ return (DDI_FAILURE);
+ }
+
/*
* In normal operation, we fail if we are busy and request is
@@ -522,6 +528,10 @@ cpudrv_power(dev_info_t *dip, int comp,
mutex_exit(&cpudsp->lock);
return (DDI_FAILURE);
}
+
+ lbolt_cnt = lbolt - cur_spd->last_lbolt;
+
+ cur_spd->last_lbolt = lbolt;
/*
* Execute CPU specific routine on the requested CPU to change
its
@@ -537,8 +547,8 @@ cpudrv_power(dev_info_t *dip, int comp,
/*
* DTrace probe to fire when changing to a new speed
*/
- DTRACE_PROBE2(cpu_change_speed, processorid_t, cpudsp->cpu_id,
- uint_t, new_spd->speed);
+ DTRACE_PROBE3(cpu_change_speed, processorid_t, cpudsp->cpu_id,
+ uint_t, cur_spd->speed, uint_t, lbolt_cnt);
/*
@@ -561,6 +571,7 @@ cpudrv_power(dev_info_t *dip, int comp,
cpupm->lastquan_mstate[CMS_USER] = 0;
cpupm->lastquan_lbolt = 0;
cpupm->cur_spd = new_spd;
+ cpupm->cur_spd->last_lbolt = lbolt;
CPUDRV_PM_RESET_THROTTLE_THREAD(cpupm);
mutex_exit(&cpudsp->lock);
@@ -662,6 +673,7 @@ cpudrv_pm_init(cpudrv_devstate_t *cpudsp
if (i == 0) { /* normal speed */
cpupm->head_spd = cur_spd;
cur_spd->quant_cnt = CPUDRV_PM_QUANT_CNT_NORMAL;
+ cur_spd->last_lbolt = lbolt;
cur_spd->idle_hwm =
(cpudrv_pm_idle_hwm * cur_spd->quant_cnt) /
100;
/* can't speed anymore */
@@ -669,6 +681,7 @@ cpudrv_pm_init(cpudrv_devstate_t *cpudsp
cur_spd->user_hwm = UINT_MAX;
} else {
cur_spd->quant_cnt = CPUDRV_PM_QUANT_CNT_OTHR;
+ cur_spd->last_lbolt = 0;
ASSERT(prev_spd != NULL);
prev_spd->down_spd = cur_spd;
cur_spd->up_spd = cpupm->head_spd;
diff -r 05bb1c8f17bc usr/src/uts/common/sys/cpudrv.h
--- a/usr/src/uts/common/sys/cpudrv.h Thu Nov 15 13:24:44 2007 +0800
+++ b/usr/src/uts/common/sys/cpudrv.h Fri Nov 16 01:32:11 2007 +0800
@@ -59,6 +59,7 @@ typedef struct cpudrv_pm_spd {
typedef struct cpudrv_pm_spd {
uint_t speed; /* platform dependent
notion */
uint_t quant_cnt; /* quantum count in
ticks */
+ uint_t last_lbolt; /* last lbolt */
struct cpudrv_pm_spd *down_spd; /* ptr to next speed
down */
struct cpudrv_pm_spd *up_spd; /* ptr to next speed up
*/
uint_t idle_hwm; /* down if idle thread
>= hwm */
--------