xen/25909-xenpm-consistent.patch
Charles Arnold 17854f1c81 - Upstream patches from Jan
25833-32on64-bogus-pt_base-adjust.patch                                                                                                                
  25835-adjust-rcu-lock-domain.patch                                                                                                                     
  25836-VT-d-S3-MSI-resume.patch                                                                                                                         
  25850-tmem-xsa-15-1.patch                                                                                                                              
  25851-tmem-xsa-15-2.patch                                                                                                                              
  25852-tmem-xsa-15-3.patch                                                                                                                              
  25853-tmem-xsa-15-4.patch                                                                                                                              
  25854-tmem-xsa-15-5.patch                                                                                                                              
  25855-tmem-xsa-15-6.patch                                                                                                                              
  25856-tmem-xsa-15-7.patch                                                                                                                              
  25857-tmem-xsa-15-8.patch                                                                                                                              
  25858-tmem-xsa-15-9.patch                                                                                                                              
  25859-tmem-missing-break.patch                                                                                                                         
  25860-tmem-cleanup.patch                                                                                                                               
  25861-x86-early-fixmap.patch                                                                                                                           
  25862-sercon-non-com.patch                                                                                                                             
  25863-sercon-ehci-dbgp.patch                                                                                                                           
  25864-sercon-unused.patch                                                                                                                              
  25866-sercon-ns16550-pci-irq.patch                                                                                                                     
  25867-sercon-ns16550-parse.patch                                                                                                                       
  25874-x86-EFI-chain-cfg.patch                                                                                                                          
  25909-xenpm-consistent.patch

OBS-URL: https://build.opensuse.org/package/show/Virtualization/xen?expand=0&rev=201
2012-09-21 14:45:08 +00:00

631 lines
19 KiB
Diff

References: bnc#780401
# HG changeset patch
# User Jan Beulich <jbeulich@suse.com>
# Date 1347869399 -7200
# Node ID 51408c3528030309e8f064bf6a3c96b37de7dc96
# Parent 12fa949b90603f057d458e370284471412afb0ba
xenpm: make argument parsing and error handling more consistent
Specifically, what values are or aren't accepted as CPU identifier, and
how the values get interpreted should be consistent across sub-commands
(intended behavior now: non-negative values are okay, and along with
omitting the argument, specifying "all" will also be accepted).
For error handling, error messages should get consistently issued to
stderr, and the tool should now (hopefully) produce an exit code of
zero only in the (partial) success case (there may still be a small
number of questionable cases).
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Keir Fraser <keir@xen.org>
--- a/tools/misc/xenpm.c
+++ b/tools/misc/xenpm.c
@@ -36,7 +36,7 @@
#define CPUFREQ_TURBO_ENABLED 1
static xc_interface *xc_handle;
-static int max_cpu_nr;
+static unsigned int max_cpu_nr;
/* help message */
void show_help(void)
@@ -77,6 +77,33 @@ void help_func(int argc, char *argv[])
show_help();
}
+static void parse_cpuid(const char *arg, int *cpuid)
+{
+ if ( sscanf(arg, "%d", cpuid) != 1 || *cpuid < 0 )
+ {
+ if ( strcasecmp(arg, "all") )
+ {
+ fprintf(stderr, "Invalid CPU identifier: '%s'\n", arg);
+ exit(EINVAL);
+ }
+ *cpuid = -1;
+ }
+}
+
+static void parse_cpuid_and_int(int argc, char *argv[],
+ int *cpuid, int *val, const char *what)
+{
+ if ( argc > 1 )
+ parse_cpuid(argv[0], cpuid);
+
+ if ( argc == 0 || sscanf(argv[argc > 1], "%d", val) != 1 )
+ {
+ fprintf(stderr, argc ? "Invalid %s '%s'\n" : "Missing %s\n",
+ what, argv[argc > 1]);
+ exit(EINVAL);
+ }
+}
+
static void print_cxstat(int cpuid, struct xc_cx_stat *cxstat)
{
int i;
@@ -166,7 +193,8 @@ static int show_cxstat_by_cpuid(xc_inter
if ( ret )
{
if ( ret == -ENODEV )
- printf("Either xen cpuidle is disabled or no valid information is registered!\n");
+ fprintf(stderr,
+ "Either Xen cpuidle is disabled or no valid information is registered!\n");
return ret;
}
@@ -181,11 +209,8 @@ void cxstat_func(int argc, char *argv[])
{
int cpuid = -1;
- if ( argc > 0 && sscanf(argv[0], "%d", &cpuid) != 1 )
- cpuid = -1;
-
- if ( cpuid >= max_cpu_nr )
- cpuid = -1;
+ if ( argc > 0 )
+ parse_cpuid(argv[0], &cpuid);
show_max_cstate(xc_handle);
@@ -294,11 +319,8 @@ void pxstat_func(int argc, char *argv[])
{
int cpuid = -1;
- if ( argc > 0 && sscanf(argv[0], "%d", &cpuid) != 1 )
- cpuid = -1;
-
- if ( cpuid >= max_cpu_nr )
- cpuid = -1;
+ if ( argc > 0 )
+ parse_cpuid(argv[0], &cpuid);
if ( cpuid < 0 )
{
@@ -338,10 +360,10 @@ static void signal_int_handler(int signo
goto out;
}
- if ( gettimeofday(&tv, NULL) == -1 )
+ if ( gettimeofday(&tv, NULL) )
{
fprintf(stderr, "failed to get timeofday\n");
- goto out ;
+ goto out;
}
usec_end = tv.tv_sec * 1000000UL + tv.tv_usec;
@@ -541,7 +563,7 @@ void start_gather_func(int argc, char *a
printf("Timeout set to %d seconds\n", timeout);
}
- if ( gettimeofday(&tv, NULL) == -1 )
+ if ( gettimeofday(&tv, NULL) )
{
fprintf(stderr, "failed to get timeofday\n");
return ;
@@ -766,11 +788,8 @@ void cpufreq_para_func(int argc, char *a
{
int cpuid = -1;
- if ( argc > 0 && sscanf(argv[0], "%d", &cpuid) != 1 )
- cpuid = -1;
-
- if ( cpuid >= max_cpu_nr )
- cpuid = -1;
+ if ( argc > 0 )
+ parse_cpuid(argv[0], &cpuid);
if ( cpuid < 0 )
{
@@ -788,26 +807,22 @@ void scaling_max_freq_func(int argc, cha
{
int cpuid = -1, freq = -1;
- if ( (argc >= 2 && (sscanf(argv[1], "%d", &freq) != 1 ||
- sscanf(argv[0], "%d", &cpuid) != 1)) ||
- (argc == 1 && sscanf(argv[0], "%d", &freq) != 1 ) ||
- argc == 0 )
- {
- fprintf(stderr, "failed to set scaling max freq\n");
- return ;
- }
+ parse_cpuid_and_int(argc, argv, &cpuid, &freq, "frequency");
if ( cpuid < 0 )
{
int i;
for ( i = 0; i < max_cpu_nr; i++ )
if ( xc_set_cpufreq_para(xc_handle, i, SCALING_MAX_FREQ, freq) )
- fprintf(stderr, "[CPU%d] failed to set scaling max freq\n", i);
+ fprintf(stderr,
+ "[CPU%d] failed to set scaling max freq (%d - %s)\n",
+ i, errno, strerror(errno));
}
else
{
if ( xc_set_cpufreq_para(xc_handle, cpuid, SCALING_MAX_FREQ, freq) )
- fprintf(stderr, "failed to set scaling max freq\n");
+ fprintf(stderr, "failed to set scaling max freq (%d - %s)\n",
+ errno, strerror(errno));
}
}
@@ -815,26 +830,22 @@ void scaling_min_freq_func(int argc, cha
{
int cpuid = -1, freq = -1;
- if ( (argc >= 2 && (sscanf(argv[1], "%d", &freq) != 1 ||
- sscanf(argv[0], "%d", &cpuid) != 1) ) ||
- (argc == 1 && sscanf(argv[0], "%d", &freq) != 1 ) ||
- argc == 0 )
- {
- fprintf(stderr, "failed to set scaling min freq\n");
- return ;
- }
+ parse_cpuid_and_int(argc, argv, &cpuid, &freq, "frequency");
if ( cpuid < 0 )
{
int i;
for ( i = 0; i < max_cpu_nr; i++ )
if ( xc_set_cpufreq_para(xc_handle, i, SCALING_MIN_FREQ, freq) )
- fprintf(stderr, "[CPU%d] failed to set scaling min freq\n", i);
+ fprintf(stderr,
+ "[CPU%d] failed to set scaling min freq (%d - %s)\n",
+ i, errno, strerror(errno));
}
else
{
if ( xc_set_cpufreq_para(xc_handle, cpuid, SCALING_MIN_FREQ, freq) )
- fprintf(stderr, "failed to set scaling min freq\n");
+ fprintf(stderr, "failed to set scaling min freq (%d - %s)\n",
+ errno, strerror(errno));
}
}
@@ -842,26 +853,22 @@ void scaling_speed_func(int argc, char *
{
int cpuid = -1, speed = -1;
- if ( (argc >= 2 && (sscanf(argv[1], "%d", &speed) != 1 ||
- sscanf(argv[0], "%d", &cpuid) != 1) ) ||
- (argc == 1 && sscanf(argv[0], "%d", &speed) != 1 ) ||
- argc == 0 )
- {
- fprintf(stderr, "failed to set scaling speed\n");
- return ;
- }
+ parse_cpuid_and_int(argc, argv, &cpuid, &speed, "speed");
if ( cpuid < 0 )
{
int i;
for ( i = 0; i < max_cpu_nr; i++ )
if ( xc_set_cpufreq_para(xc_handle, i, SCALING_SETSPEED, speed) )
- fprintf(stderr, "[CPU%d] failed to set scaling speed\n", i);
+ fprintf(stderr,
+ "[CPU%d] failed to set scaling speed (%d - %s)\n",
+ i, errno, strerror(errno));
}
else
{
if ( xc_set_cpufreq_para(xc_handle, cpuid, SCALING_SETSPEED, speed) )
- fprintf(stderr, "failed to set scaling speed\n");
+ fprintf(stderr, "failed to set scaling speed (%d - %s)\n",
+ errno, strerror(errno));
}
}
@@ -869,14 +876,7 @@ void scaling_sampling_rate_func(int argc
{
int cpuid = -1, rate = -1;
- if ( (argc >= 2 && (sscanf(argv[1], "%d", &rate) != 1 ||
- sscanf(argv[0], "%d", &cpuid) != 1) ) ||
- (argc == 1 && sscanf(argv[0], "%d", &rate) != 1 ) ||
- argc == 0 )
- {
- fprintf(stderr, "failed to set scaling sampling rate\n");
- return ;
- }
+ parse_cpuid_and_int(argc, argv, &cpuid, &rate, "rate");
if ( cpuid < 0 )
{
@@ -884,12 +884,14 @@ void scaling_sampling_rate_func(int argc
for ( i = 0; i < max_cpu_nr; i++ )
if ( xc_set_cpufreq_para(xc_handle, i, SAMPLING_RATE, rate) )
fprintf(stderr,
- "[CPU%d] failed to set scaling sampling rate\n", i);
+ "[CPU%d] failed to set scaling sampling rate (%d - %s)\n",
+ i, errno, strerror(errno));
}
else
{
if ( xc_set_cpufreq_para(xc_handle, cpuid, SAMPLING_RATE, rate) )
- fprintf(stderr, "failed to set scaling sampling rate\n");
+ fprintf(stderr, "failed to set scaling sampling rate (%d - %s)\n",
+ errno, strerror(errno));
}
}
@@ -897,14 +899,7 @@ void scaling_up_threshold_func(int argc,
{
int cpuid = -1, threshold = -1;
- if ( (argc >= 2 && (sscanf(argv[1], "%d", &threshold) != 1 ||
- sscanf(argv[0], "%d", &cpuid) != 1) ) ||
- (argc == 1 && sscanf(argv[0], "%d", &threshold) != 1 ) ||
- argc == 0 )
- {
- fprintf(stderr, "failed to set up scaling threshold\n");
- return ;
- }
+ parse_cpuid_and_int(argc, argv, &cpuid, &threshold, "threshold");
if ( cpuid < 0 )
{
@@ -912,57 +907,49 @@ void scaling_up_threshold_func(int argc,
for ( i = 0; i < max_cpu_nr; i++ )
if ( xc_set_cpufreq_para(xc_handle, i, UP_THRESHOLD, threshold) )
fprintf(stderr,
- "[CPU%d] failed to set up scaling threshold\n", i);
+ "[CPU%d] failed to set up scaling threshold (%d - %s)\n",
+ i, errno, strerror(errno));
}
else
{
if ( xc_set_cpufreq_para(xc_handle, cpuid, UP_THRESHOLD, threshold) )
- fprintf(stderr, "failed to set up scaling threshold\n");
+ fprintf(stderr, "failed to set up scaling threshold (%d - %s)\n",
+ errno, strerror(errno));
}
}
void scaling_governor_func(int argc, char *argv[])
{
int cpuid = -1;
- char *name = NULL;
+ char *name;
if ( argc >= 2 )
{
- name = strdup(argv[1]);
- if ( name == NULL )
- goto out;
- if ( sscanf(argv[0], "%d", &cpuid) != 1 )
- {
- free(name);
- goto out;
- }
+ parse_cpuid(argv[0], &cpuid);
+ name = argv[1];
}
else if ( argc > 0 )
+ name = argv[0];
+ else
{
- name = strdup(argv[0]);
- if ( name == NULL )
- goto out;
+ fprintf(stderr, "Missing argument(s)\n");
+ exit(EINVAL);
}
- else
- goto out;
if ( cpuid < 0 )
{
int i;
for ( i = 0; i < max_cpu_nr; i++ )
if ( xc_set_cpufreq_gov(xc_handle, i, name) )
- fprintf(stderr, "[CPU%d] failed to set governor name\n", i);
+ fprintf(stderr, "[CPU%d] failed to set governor name (%d - %s)\n",
+ i, errno, strerror(errno));
}
else
{
if ( xc_set_cpufreq_gov(xc_handle, cpuid, name) )
- fprintf(stderr, "failed to set governor name\n");
+ fprintf(stderr, "failed to set governor name (%d - %s)\n",
+ errno, strerror(errno));
}
-
- free(name);
- return ;
-out:
- fprintf(stderr, "failed to set governor name\n");
}
void cpu_topology_func(int argc, char *argv[])
@@ -971,7 +958,7 @@ void cpu_topology_func(int argc, char *a
DECLARE_HYPERCALL_BUFFER(uint32_t, cpu_to_socket);
DECLARE_HYPERCALL_BUFFER(uint32_t, cpu_to_node);
xc_topologyinfo_t info = { 0 };
- int i;
+ int i, rc = ENOMEM;
cpu_to_core = xc_hypercall_buffer_alloc(xc_handle, cpu_to_core, sizeof(*cpu_to_core) * MAX_NR_CPU);
cpu_to_socket = xc_hypercall_buffer_alloc(xc_handle, cpu_to_socket, sizeof(*cpu_to_socket) * MAX_NR_CPU);
@@ -990,7 +977,9 @@ void cpu_topology_func(int argc, char *a
if ( xc_topologyinfo(xc_handle, &info) )
{
- printf("Can not get Xen CPU topology: %d\n", errno);
+ rc = errno;
+ fprintf(stderr, "Cannot get Xen CPU topology (%d - %s)\n",
+ errno, strerror(errno));
goto out;
}
@@ -1005,116 +994,95 @@ void cpu_topology_func(int argc, char *a
printf("CPU%d\t %d\t %d\t %d\n",
i, cpu_to_core[i], cpu_to_socket[i], cpu_to_node[i]);
}
+ rc = 0;
out:
xc_hypercall_buffer_free(xc_handle, cpu_to_core);
xc_hypercall_buffer_free(xc_handle, cpu_to_socket);
xc_hypercall_buffer_free(xc_handle, cpu_to_node);
+ if ( rc )
+ exit(rc);
}
void set_sched_smt_func(int argc, char *argv[])
{
- int value, rc;
+ int value;
- if (argc != 1){
- show_help();
- exit(-1);
+ if ( argc != 1 ) {
+ fprintf(stderr, "Missing or invalid argument(s)\n");
+ exit(EINVAL);
}
- if ( !strncmp(argv[0], "disable", sizeof("disable")) )
- {
+ if ( !strcasecmp(argv[0], "disable") )
value = 0;
- }
- else if ( !strncmp(argv[0], "enable", sizeof("enable")) )
- {
+ else if ( !strcasecmp(argv[0], "enable") )
value = 1;
- }
else
{
- show_help();
- exit(-1);
+ fprintf(stderr, "Invalid argument: %s\n", argv[0]);
+ exit(EINVAL);
}
- rc = xc_set_sched_opt_smt(xc_handle, value);
- printf("%s sched_smt_power_savings %s\n", argv[0],
- rc? "failed":"succeeded" );
-
- return;
+ if ( !xc_set_sched_opt_smt(xc_handle, value) )
+ printf("%s sched_smt_power_savings succeeded\n", argv[0]);
+ else
+ fprintf(stderr, "%s sched_smt_power_savings failed (%d - %s)\n",
+ argv[0], errno, strerror(errno));
}
void set_vcpu_migration_delay_func(int argc, char *argv[])
{
int value;
- int rc;
-
- if (argc != 1){
- show_help();
- exit(-1);
- }
-
- value = atoi(argv[0]);
- if (value < 0)
- {
- printf("Please try non-negative vcpu migration delay\n");
- exit(-1);
+ if ( argc != 1 || (value = atoi(argv[0])) < 0 ) {
+ fprintf(stderr, "Missing or invalid argument(s)\n");
+ exit(EINVAL);
}
- rc = xc_set_vcpu_migration_delay(xc_handle, value);
- printf("%s to set vcpu migration delay to %d us\n",
- rc? "Fail":"Succeed", value );
-
- return;
+ if ( !xc_set_vcpu_migration_delay(xc_handle, value) )
+ printf("set vcpu migration delay to %d us succeeded\n", value);
+ else
+ fprintf(stderr, "set vcpu migration delay failed (%d - %s)\n",
+ errno, strerror(errno));
}
void get_vcpu_migration_delay_func(int argc, char *argv[])
{
uint32_t value;
- int rc;
- if (argc != 0){
- show_help();
- exit(-1);
- }
+ if ( argc )
+ fprintf(stderr, "Ignoring argument(s)\n");
- rc = xc_get_vcpu_migration_delay(xc_handle, &value);
- if (!rc)
- {
- printf("Schduler vcpu migration delay is %d us\n", value);
- }
+ if ( !xc_get_vcpu_migration_delay(xc_handle, &value) )
+ printf("Scheduler vcpu migration delay is %d us\n", value);
else
- {
- printf("Failed to get scheduler vcpu migration delay, errno=%d\n", errno);
- }
-
- return;
+ fprintf(stderr,
+ "Failed to get scheduler vcpu migration delay (%d - %s)\n",
+ errno, strerror(errno));
}
void set_max_cstate_func(int argc, char *argv[])
{
- int value, rc;
+ int value;
if ( argc != 1 || sscanf(argv[0], "%d", &value) != 1 || value < 0 )
{
- show_help();
- exit(-1);
+ fprintf(stderr, "Missing or invalid argument(s)\n");
+ exit(EINVAL);
}
- rc = xc_set_cpuidle_max_cstate(xc_handle, (uint32_t)value);
- printf("set max_cstate to C%d %s\n", value,
- rc? "failed":"succeeded" );
-
- return;
+ if ( !xc_set_cpuidle_max_cstate(xc_handle, (uint32_t)value) )
+ printf("set max_cstate to C%d succeeded\n", value);
+ else
+ fprintf(stderr, "set max_cstate to C%d failed (%d - %s)\n",
+ value, errno, strerror(errno));
}
void enable_turbo_mode(int argc, char *argv[])
{
int cpuid = -1;
- if ( argc > 0 && sscanf(argv[0], "%d", &cpuid) != 1 )
- cpuid = -1;
-
- if ( cpuid >= max_cpu_nr )
- cpuid = -1;
+ if ( argc > 0 )
+ parse_cpuid(argv[0], &cpuid);
if ( cpuid < 0 )
{
@@ -1122,21 +1090,22 @@ void enable_turbo_mode(int argc, char *a
* only make effects on dbs governor */
int i;
for ( i = 0; i < max_cpu_nr; i++ )
- xc_enable_turbo(xc_handle, i);
+ if ( xc_enable_turbo(xc_handle, i) )
+ fprintf(stderr,
+ "[CPU%d] failed to enable turbo mode (%d - %s)\n",
+ i, errno, strerror(errno));
}
- else
- xc_enable_turbo(xc_handle, cpuid);
+ else if ( xc_enable_turbo(xc_handle, cpuid) )
+ fprintf(stderr, "failed to enable turbo mode (%d - %s)\n",
+ errno, strerror(errno));
}
void disable_turbo_mode(int argc, char *argv[])
{
int cpuid = -1;
- if ( argc > 0 && sscanf(argv[0], "%d", &cpuid) != 1 )
- cpuid = -1;
-
- if ( cpuid >= max_cpu_nr )
- cpuid = -1;
+ if ( argc > 0 )
+ parse_cpuid(argv[0], &cpuid);
if ( cpuid < 0 )
{
@@ -1144,10 +1113,14 @@ void disable_turbo_mode(int argc, char *
* only make effects on dbs governor */
int i;
for ( i = 0; i < max_cpu_nr; i++ )
- xc_disable_turbo(xc_handle, i);
+ if ( xc_disable_turbo(xc_handle, i) )
+ fprintf(stderr,
+ "[CPU%d] failed to disable turbo mode (%d - %s)\n",
+ i, errno, strerror(errno));
}
- else
- xc_disable_turbo(xc_handle, cpuid);
+ else if ( xc_disable_turbo(xc_handle, cpuid) )
+ fprintf(stderr, "failed to disable turbo mode (%d - %s)\n",
+ errno, strerror(errno));
}
struct {
@@ -1191,15 +1164,17 @@ int main(int argc, char *argv[])
if ( !xc_handle )
{
fprintf(stderr, "failed to get the handler\n");
- return 0;
+ return EIO;
}
ret = xc_physinfo(xc_handle, &physinfo);
if ( ret )
{
- fprintf(stderr, "failed to get the processor information\n");
+ ret = errno;
+ fprintf(stderr, "failed to get processor information (%d - %s)\n",
+ ret, strerror(ret));
xc_interface_close(xc_handle);
- return 0;
+ return ret;
}
max_cpu_nr = physinfo.nr_cpus;
@@ -1214,14 +1189,18 @@ int main(int argc, char *argv[])
for ( i = 0; i < nr_matches; i++ )
fprintf(stderr, " %s", main_options[matches_main_options[i]].name);
fprintf(stderr, "\n");
+ ret = EINVAL;
}
else if ( nr_matches == 1 )
/* dispatch to the corresponding function handler */
main_options[matches_main_options[0]].function(argc - 2, argv + 2);
else
+ {
show_help();
+ ret = EINVAL;
+ }
xc_interface_close(xc_handle);
- return 0;
+ return ret;
}