- dlt_pcpu_user = lparstats.puser - last_pcpu_user;
- dlt_pcpu_sys = lparstats.psys - last_pcpu_sys;
- dlt_pcpu_idle = lparstats.pidle - last_pcpu_idle;
- dlt_pcpu_wait = lparstats.pwait - last_pcpu_wait;
-
- lpar_submit ("user", (double)dlt_pcpu_user / delta_time_base);
- lpar_submit ("sys", (double)dlt_pcpu_sys / delta_time_base);
- lpar_submit ("wait", (double)dlt_pcpu_wait / delta_time_base);
- lpar_submit ("idle", (double)dlt_pcpu_idle / delta_time_base);
- lpar_submit ("ent", (double)lparstats.entitled_proc_capacity / 100.0);
- lpar_submit ("max", (double)lparstats.max_proc_capacity / 100.0);
- lpar_submit ("min", (double)lparstats.min_proc_capacity / 100.0);
-
+ /*
+ * On a shared partition, we're "entitled" to a certain amount of
+ * processing power, for example 250/100 of a physical CPU. Processing
+ * capacity not used by the partition may be assigned to a different
+ * partition by the hypervisor, so "idle" is hopefully a very small
+ * number.
+ *
+ * A dedicated partition may donate its CPUs to another partition and
+ * may steal ticks from somewhere else (another partition or maybe the
+ * shared pool, I don't know --octo).
+ */
+
+ /* entitled_proc_capacity is in 1/100th of a CPU */
+ entitled_proc_capacity = 0.01 * ((double) lparstats.entitled_proc_capacity);
+ lpar_submit ("entitled", entitled_proc_capacity);
+
+ /* The number of ticks actually spent in the various states */
+ user_ticks = lparstats.puser - lparstats_old.puser;
+ syst_ticks = lparstats.psys - lparstats_old.psys;
+ wait_ticks = lparstats.pwait - lparstats_old.pwait;
+ idle_ticks = lparstats.pidle - lparstats_old.pidle;
+ consumed_ticks = user_ticks + syst_ticks + wait_ticks + idle_ticks;
+
+ lpar_submit ("user", (double) user_ticks / (double) ticks);
+ lpar_submit ("system", (double) syst_ticks / (double) ticks);
+ lpar_submit ("wait", (double) wait_ticks / (double) ticks);
+ lpar_submit ("idle", (double) idle_ticks / (double) ticks);
+
+#if PERFSTAT_SUPPORTS_DONATION