On Wed, Jul 03, 2019 at 01:04:13PM +0000, Jan Beulich wrote:
> From: Ross Lagerwall <ross.lagerw...@citrix.com>
> 
> Signed-off-by: Ross Lagerwall <ross.lagerw...@citrix.com>
> 
> Make handling in do_pm_op() more homogeneous: Before interpreting
> op->cpuid as such, handle all operations not acting on a particular
> CPU. Also expose the setting via xenpm.
> 
> Signed-off-by: Jan Beulich <jbeul...@suse.com>
> Acked-by: Wei Liu <wei.l...@citrix.com>
> ---
> v2: Adjust xenpm's usage message. Also adjust its output wording a
>      little.
> 
> --- a/tools/libxc/xc_pm.c
> +++ b/tools/libxc/xc_pm.c
> @@ -367,7 +367,7 @@ int xc_set_sched_opt_smt(xc_interface *x
>      return rc;
>   }
>   
> -int xc_get_cpuidle_max_cstate(xc_interface *xch, uint32_t *value)
> +static int get_max_cstate(xc_interface *xch, uint32_t *value, uint32_t type)
>   {
>       int rc;
>       DECLARE_SYSCTL;
> @@ -379,7 +379,7 @@ int xc_get_cpuidle_max_cstate(xc_interfa
>       }
>       sysctl.cmd = XEN_SYSCTL_pm_op;
>       sysctl.u.pm_op.cmd = XEN_SYSCTL_pm_op_get_max_cstate;
> -    sysctl.u.pm_op.cpuid = 0;
> +    sysctl.u.pm_op.cpuid = type;
>       sysctl.u.pm_op.u.get_max_cstate = 0;
>       rc = do_sysctl(xch, &sysctl);
>       *value = sysctl.u.pm_op.u.get_max_cstate;
> @@ -387,7 +387,17 @@ int xc_get_cpuidle_max_cstate(xc_interfa
>       return rc;
>   }
>   
> -int xc_set_cpuidle_max_cstate(xc_interface *xch, uint32_t value)
> +int xc_get_cpuidle_max_cstate(xc_interface *xch, uint32_t *value)
> +{
> +    return get_max_cstate(xch, value, 0);
> +}
> +
> +int xc_get_cpuidle_max_csubstate(xc_interface *xch, uint32_t *value)
> +{
> +    return get_max_cstate(xch, value, 1);
> +}
> +
> +static int set_max_cstate(xc_interface *xch, uint32_t value, uint32_t type)
>   {
>       DECLARE_SYSCTL;
>   
> @@ -398,12 +408,22 @@ int xc_set_cpuidle_max_cstate(xc_interfa
>       }
>       sysctl.cmd = XEN_SYSCTL_pm_op;
>       sysctl.u.pm_op.cmd = XEN_SYSCTL_pm_op_set_max_cstate;
> -    sysctl.u.pm_op.cpuid = 0;
> +    sysctl.u.pm_op.cpuid = type;
>       sysctl.u.pm_op.u.set_max_cstate = value;
>   
>       return do_sysctl(xch, &sysctl);
>   }
>   
> +int xc_set_cpuidle_max_cstate(xc_interface *xch, uint32_t value)
> +{
> +    return set_max_cstate(xch, value, 0);
> +}
> +
> +int xc_set_cpuidle_max_csubstate(xc_interface *xch, uint32_t value)
> +{
> +    return set_max_cstate(xch, value, 1);
> +}
> +
>   int xc_enable_turbo(xc_interface *xch, int cpuid)
>   {
>       DECLARE_SYSCTL;
> --- a/tools/libxc/include/xenctrl.h
> +++ b/tools/libxc/include/xenctrl.h
> @@ -1906,6 +1906,9 @@ int xc_set_sched_opt_smt(xc_interface *x
>   int xc_get_cpuidle_max_cstate(xc_interface *xch, uint32_t *value);
>   int xc_set_cpuidle_max_cstate(xc_interface *xch, uint32_t value);
>   
> +int xc_get_cpuidle_max_csubstate(xc_interface *xch, uint32_t *value);
> +int xc_set_cpuidle_max_csubstate(xc_interface *xch, uint32_t value);
> +
>   int xc_enable_turbo(xc_interface *xch, int cpuid);
>   int xc_disable_turbo(xc_interface *xch, int cpuid);
>   
> --- a/tools/misc/xenpm.c
> +++ b/tools/misc/xenpm.c
> @@ -64,7 +64,9 @@ void show_help(void)
>               " set-sched-smt           enable|disable enable/disable 
> scheduler smt power saving\n"
>               " set-vcpu-migration-delay      <num> set scheduler vcpu 
> migration delay in us\n"
>               " get-vcpu-migration-delay            get scheduler vcpu 
> migration delay\n"
> -            " set-max-cstate        <num>|'unlimited' set the C-State 
> limitation (<num> >= 0)\n"
> +            " set-max-cstate        <num>|'unlimited'[,<num2>|'unlimited']\n"
> +            "                                     set the C-State limitation 
> (<num> >= 0) and\n"
> +            "                                     optionally the C-sub-state 
> limitation (<num2> >= 0)\n"
>               " start [seconds]                     start collect Cx/Px 
> statistics,\n"
>               "                                     output after CTRL-C or 
> SIGINT or several seconds.\n"
>               " enable-turbo-mode     [cpuid]       enable Turbo Mode for 
> processors that support it.\n"
> @@ -195,7 +197,15 @@ static int show_max_cstate(xc_interface
>           return ret;
>   
>       if ( value < XEN_SYSCTL_CX_UNLIMITED )
> -        printf("Max possible C-state: C%"PRIu32"\n\n", value);
> +    {
> +        printf("Max possible C-state: C%"PRIu32"\n", value);
> +        if ( (ret = xc_get_cpuidle_max_csubstate(xc_handle, &value)) )
> +            return ret;
> +        if ( value < XEN_SYSCTL_CX_UNLIMITED )
> +            printf("Max possible substate: %"PRIu32"\n\n", value);
> +        else
> +            puts("");
> +    }
>       else
>           printf("All C-states allowed\n\n");
>   
> @@ -1120,13 +1130,17 @@ void get_vcpu_migration_delay_func(int a
>   
>   void set_max_cstate_func(int argc, char *argv[])
>   {
> -    int value;
> +    int value, subval = XEN_SYSCTL_CX_UNLIMITED;
>       char buf[12];
>   
> -    if ( argc != 1 ||
> +    if ( argc < 1 || argc > 2 ||

I'm quite sure I'm missing something, but shouldn't argc still be 1
regardless of whether the max sub-state is set or not?

I would expect to scan for something like: "%d,%d" or some such, but
maybe there's a step I'm missing that splits the string using the ','
separator?

Thanks, Roger.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel

Reply via email to