diff mbox series

pmstat: Limit hypercalls under HWP

Message ID 20240122190934.52080-1-jandryuk@gmail.com (mailing list archive)
State New, archived
Headers show
Series pmstat: Limit hypercalls under HWP | expand

Commit Message

Jason Andryuk Jan. 22, 2024, 7:09 p.m. UTC
When HWP is active, the cpufreq P-state information is not updated.  In
that case, return -ENODEV instead of bogus, incomplete info.  The xenpm
command already supports skipping results when -ENODEV is returned, so
it is re-used when -EOPNOTSUPP might be more accurate.

Similarly, set_cpufreq_para() is not applicable when HWP is active.
Many of the options already checked the governor and were inaccessible,
but SCALING_MIN/MAX_FREQ was still accessible (though it would do
nothing).  Add an ealier HWP check to handle all cases.

Signed-off-by: Jason Andryuk <jandryuk@gmail.com>
---
`xenpm get-cpufreq-states` now doesn't return any output.  It also exits
successfully since xenpm doesn't check the returns there.  Other
commands will fail:
xenpm set-scaling-maxfreq 11 1100000
failed to set scaling max freq (95 - Operation not supported)

 xen/drivers/acpi/pmstat.c | 5 +++++
 1 file changed, 5 insertions(+)

Comments

Jan Beulich Jan. 23, 2024, 8:17 a.m. UTC | #1
On 22.01.2024 20:09, Jason Andryuk wrote:
> When HWP is active, the cpufreq P-state information is not updated.  In
> that case, return -ENODEV instead of bogus, incomplete info.  The xenpm
> command already supports skipping results when -ENODEV is returned, so
> it is re-used when -EOPNOTSUPP might be more accurate.
> 
> Similarly, set_cpufreq_para() is not applicable when HWP is active.
> Many of the options already checked the governor and were inaccessible,
> but SCALING_MIN/MAX_FREQ was still accessible (though it would do
> nothing).  Add an ealier HWP check to handle all cases.
> 
> Signed-off-by: Jason Andryuk <jandryuk@gmail.com>
> ---
> `xenpm get-cpufreq-states` now doesn't return any output.  It also exits
> successfully since xenpm doesn't check the returns there.

This isn't very nice. Is there nothing sensible that can be output
instead in the HWP case? If not, I think it would help if
inapplicability of the command would be indicated by at least one line
of output. Or might it make sense to at least fall back to
get-cpufreq-average in that case?

>  Other
> commands will fail:
> xenpm set-scaling-maxfreq 11 1100000
> failed to set scaling max freq (95 - Operation not supported)

This is fine imo.

Jan
Jason Andryuk Jan. 24, 2024, 4:46 p.m. UTC | #2
On Tue, Jan 23, 2024 at 3:17 AM Jan Beulich <jbeulich@suse.com> wrote:
>
> On 22.01.2024 20:09, Jason Andryuk wrote:
> > When HWP is active, the cpufreq P-state information is not updated.  In
> > that case, return -ENODEV instead of bogus, incomplete info.  The xenpm
> > command already supports skipping results when -ENODEV is returned, so
> > it is re-used when -EOPNOTSUPP might be more accurate.
> >
> > Similarly, set_cpufreq_para() is not applicable when HWP is active.
> > Many of the options already checked the governor and were inaccessible,
> > but SCALING_MIN/MAX_FREQ was still accessible (though it would do
> > nothing).  Add an ealier HWP check to handle all cases.
> >
> > Signed-off-by: Jason Andryuk <jandryuk@gmail.com>
> > ---
> > `xenpm get-cpufreq-states` now doesn't return any output.  It also exits
> > successfully since xenpm doesn't check the returns there.
>
> This isn't very nice. Is there nothing sensible that can be output
> instead in the HWP case? If not, I think it would help if
> inapplicability of the command would be indicated by at least one line
> of output. Or might it make sense to at least fall back to
> get-cpufreq-average in that case?

Sorry, I should have explained more, but, yes, not nice.  "No output
and exits with success" is how xenpm works if -ENODEV is received -
which I guess occurs when cpufreq is disabled (regardless of HWP).  I
found that surprising, but that behaviour is matched under HWP with
this patch.

Yes, `xenpm get-cpufreq-states` can be enhanced.  The re-use of ENODEV
was useful to make `xenpm get-cpufreq-average` output C-states but
skip P-states.  If EOPNOTSUPP is used, then that can differentiate
when HWP is used.  So `xenpm get-cpufreq-states` can print a message
when cpufreq is disabled, and a different one when P-States  are
unavailable.

Regards,
Jason
diff mbox series

Patch

diff --git a/xen/drivers/acpi/pmstat.c b/xen/drivers/acpi/pmstat.c
index 85097d463c..4c4d298d1c 100644
--- a/xen/drivers/acpi/pmstat.c
+++ b/xen/drivers/acpi/pmstat.c
@@ -66,6 +66,8 @@  int do_get_pm_info(struct xen_sysctl_get_pmstat *op)
             return -ENODEV;
         if ( !cpufreq_driver.init )
             return -ENODEV;
+        if ( hwp_active() )
+            return -ENODEV;
         if ( !pmpt || !(pmpt->perf.init & XEN_PX_INIT) )
             return -EINVAL;
         break;
@@ -329,6 +331,9 @@  static int set_cpufreq_para(struct xen_sysctl_pm_op *op)
     if ( !policy || !policy->governor )
         return -EINVAL;
 
+    if ( hwp_active() )
+        return -EOPNOTSUPP;
+
     switch(op->u.set_para.ctrl_type)
     {
     case SCALING_MAX_FREQ: