Hi Aubrey,
It looks like you are adding an lbolt count to keep track of how much
time is being spent
in each P-state. Is that right? I was thinking of doing this in DTrace
by creating an association
that keeps track of aggregate time spent on a per CPU per P-state basis...
Thanks,
-Eric
Li, Aubrey wrote:
> 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 */
>>
> --------
> _______________________________________________
> tesla-dev mailing list
> tesla-dev at opensolaris.org
> http://mail.opensolaris.org/mailman/listinfo/tesla-dev
>