mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 20:22:09 +00:00
powerpc/pseries: Add pool idle time at LPAR boot
When there are no options specified for lparstat, it is expected to give reports since LPAR(Logical Partition) boot. APP(Available Processor Pool) is an indicator of how many cores in the shared pool are free to use in Shared Processor LPAR(SPLPAR). APP is derived using pool_idle_time which is obtained using H_PIC call. The interval based reports show correct APP value while since boot report shows very high APP values. This happens because in that case APP is obtained by dividing pool idle time by LPAR uptime. Since pool idle time is reported by the PowerVM hypervisor since its boot, it need not align with LPAR boot. To fix that export boot pool idle time in lparcfg and powerpc-utils will use this info to derive APP as below for since boot reports. APP = (pool idle time - boot pool idle time) / (uptime * timebase) Results:: Observe APP values. ====================== Shared LPAR ================================ lparstat System Configuration type=Shared mode=Uncapped smt=8 lcpu=12 mem=15573440 kB cpus=37 ent=12.00 reboot stress-ng --cpu=$(nproc) -t 600 sleep 600 So in this case app is expected to close to 37-6=31. ====== 6.9-rc1 and lparstat 1.3.10 ============= %user %sys %wait %idle physc %entc lbusy app vcsw phint ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- 47.48 0.01 0.00 52.51 0.00 0.00 47.49 69099.72 541547 21 === With this patch and powerpc-utils patch to do the above equation === %user %sys %wait %idle physc %entc lbusy app vcsw phint ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- 47.48 0.01 0.00 52.51 5.73 47.75 47.49 31.21 541753 21 ===================================================================== Note: physc, purr/idle purr being inaccurate is being handled in a separate patch in powerpc-utils tree. Signed-off-by: Shrikanth Hegde <sshegde@linux.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://msgid.link/20240412092047.455483-2-sshegde@linux.ibm.com
This commit is contained in:
parent
5a799af952
commit
9c74ecfd0f
@ -170,20 +170,24 @@ out:
|
||||
kfree(buf);
|
||||
}
|
||||
|
||||
static unsigned h_pic(unsigned long *pool_idle_time,
|
||||
unsigned long *num_procs)
|
||||
static long h_pic(unsigned long *pool_idle_time,
|
||||
unsigned long *num_procs)
|
||||
{
|
||||
unsigned long rc;
|
||||
unsigned long retbuf[PLPAR_HCALL_BUFSIZE];
|
||||
long rc;
|
||||
unsigned long retbuf[PLPAR_HCALL_BUFSIZE] = {0};
|
||||
|
||||
rc = plpar_hcall(H_PIC, retbuf);
|
||||
|
||||
*pool_idle_time = retbuf[0];
|
||||
*num_procs = retbuf[1];
|
||||
if (pool_idle_time)
|
||||
*pool_idle_time = retbuf[0];
|
||||
if (num_procs)
|
||||
*num_procs = retbuf[1];
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
unsigned long boot_pool_idle_time;
|
||||
|
||||
/*
|
||||
* parse_ppp_data
|
||||
* Parse out the data returned from h_get_ppp and h_pic
|
||||
@ -215,9 +219,15 @@ static void parse_ppp_data(struct seq_file *m)
|
||||
seq_printf(m, "pool_capacity=%d\n",
|
||||
ppp_data.active_procs_in_pool * 100);
|
||||
|
||||
h_pic(&pool_idle_time, &pool_procs);
|
||||
seq_printf(m, "pool_idle_time=%ld\n", pool_idle_time);
|
||||
seq_printf(m, "pool_num_procs=%ld\n", pool_procs);
|
||||
/* In case h_pic call is not successful, this would result in
|
||||
* APP values being wrong in tools like lparstat.
|
||||
*/
|
||||
|
||||
if (h_pic(&pool_idle_time, &pool_procs) == H_SUCCESS) {
|
||||
seq_printf(m, "pool_idle_time=%ld\n", pool_idle_time);
|
||||
seq_printf(m, "pool_num_procs=%ld\n", pool_procs);
|
||||
seq_printf(m, "boot_pool_idle_time=%ld\n", boot_pool_idle_time);
|
||||
}
|
||||
}
|
||||
|
||||
seq_printf(m, "unallocated_capacity_weight=%d\n",
|
||||
@ -792,6 +802,7 @@ static const struct proc_ops lparcfg_proc_ops = {
|
||||
static int __init lparcfg_init(void)
|
||||
{
|
||||
umode_t mode = 0444;
|
||||
long retval;
|
||||
|
||||
/* Allow writing if we have FW_FEATURE_SPLPAR */
|
||||
if (firmware_has_feature(FW_FEATURE_SPLPAR))
|
||||
@ -801,6 +812,16 @@ static int __init lparcfg_init(void)
|
||||
printk(KERN_ERR "Failed to create powerpc/lparcfg\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
/* If this call fails, it would result in APP values
|
||||
* being wrong for since boot reports of lparstat
|
||||
*/
|
||||
retval = h_pic(&boot_pool_idle_time, NULL);
|
||||
|
||||
if (retval != H_SUCCESS)
|
||||
pr_debug("H_PIC failed during lparcfg init retval: %ld\n",
|
||||
retval);
|
||||
|
||||
return 0;
|
||||
}
|
||||
machine_device_initcall(pseries, lparcfg_init);
|
||||
|
Loading…
Reference in New Issue
Block a user