]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
perf: Fix endianness argument compatibility with OPT_BOOLEAN() and introduce OPT_INCR()
authorIan Munsie <imunsie@au.ibm.com>
Tue, 13 Apr 2010 08:37:33 +0000 (18:37 +1000)
committerGreg Kroah-Hartman <gregkh@suse.de>
Mon, 5 Jul 2010 18:21:54 +0000 (11:21 -0700)
commit c05556421742eb47f80301767653a4bcb19de9de upstream.

Parsing an option from the command line with OPT_BOOLEAN on a
bool data type would not work on a big-endian machine due to the
manner in which the boolean was being cast into an int and
incremented. For example, running 'perf probe --list' on a
PowerPC machine would fail to properly set the list_events bool
and would therefore print out the usage information and
terminate.

This patch makes OPT_BOOLEAN work as expected with a bool
datatype. For cases where the original OPT_BOOLEAN was
intentionally being used to increment an int each time it was
passed in on the command line, this patch introduces OPT_INCR
with the old behaviour of OPT_BOOLEAN (the verbose variable is
currently the only such example of this).

I have reviewed every use of OPT_BOOLEAN to verify that a true
C99 bool was passed. Where integers were used, I verified that
they were only being used for boolean logic and changed them to
bools to ensure that they would not be mistakenly used as ints.
The major exception was the verbose variable which now uses
OPT_INCR instead of OPT_BOOLEAN.

Signed-off-by: Ian Munsie <imunsie@au.ibm.com>
Acked-by: David S. Miller <davem@davemloft.net>
Cc: <stable@kernel.org>
Cc: Git development list <git@vger.kernel.org>
Cc: Ian Munsie <imunsie@au1.ibm.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: Hitoshi Mitake <mitake@dcl.info.waseda.ac.jp>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Eric B Munson <ebmunson@us.ibm.com>
Cc: Valdis.Kletnieks@vt.edu
Cc: WANG Cong <amwang@redhat.com>
Cc: Thiago Farina <tfransosi@gmail.com>
Cc: Masami Hiramatsu <mhiramat@redhat.com>
Cc: Xiao Guangrong <xiaoguangrong@cn.fujitsu.com>
Cc: Jaswinder Singh Rajput <jaswinderrajput@gmail.com>
Cc: Arjan van de Ven <arjan@linux.intel.com>
Cc: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Tom Zanussi <tzanussi@gmail.com>
Cc: Anton Blanchard <anton@samba.org>
Cc: John Kacur <jkacur@redhat.com>
Cc: Li Zefan <lizf@cn.fujitsu.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
LKML-Reference: <1271147857-11604-1-git-send-email-imunsie@au.ibm.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
22 files changed:
tools/perf/bench/mem-memcpy.c
tools/perf/bench/sched-messaging.c
tools/perf/builtin-annotate.c
tools/perf/builtin-buildid-cache.c
tools/perf/builtin-buildid-list.c
tools/perf/builtin-diff.c
tools/perf/builtin-help.c
tools/perf/builtin-lock.c
tools/perf/builtin-probe.c
tools/perf/builtin-record.c
tools/perf/builtin-report.c
tools/perf/builtin-sched.c
tools/perf/builtin-stat.c
tools/perf/builtin-timechart.c
tools/perf/builtin-top.c
tools/perf/builtin-trace.c
tools/perf/util/debug.c
tools/perf/util/debug.h
tools/perf/util/parse-options.c
tools/perf/util/parse-options.h
tools/perf/util/trace-event-parse.c
tools/perf/util/trace-event.h

index 89773178e89408f9df1c235d355f5a4f3aebe27e..5fd55cd0b41a456675c09ef642fa06ac90c51eab 100644 (file)
@@ -24,7 +24,7 @@
 
 static const char      *length_str     = "1MB";
 static const char      *routine        = "default";
-static int             use_clock       = 0;
+static bool            use_clock       = false;
 static int             clock_fd;
 
 static const struct option options[] = {
index 81cee78181fa28fd2f382144c061e409c439fb3f..da1b2e9f01ff32b5b76ee494c1c275e9723015bd 100644 (file)
@@ -31,9 +31,9 @@
 
 #define DATASIZE 100
 
-static int use_pipes = 0;
+static bool use_pipes = false;
 static unsigned int loops = 100;
-static unsigned int thread_mode = 0;
+static bool thread_mode = false;
 static unsigned int num_groups = 10;
 
 struct sender_context {
index 6ad7148451c5bcc32995c08e75a920d0898e4c7e..94a814c0a7e4c972b36391fb26c5e6f9a0f31a17 100644 (file)
 
 static char            const *input_name = "perf.data";
 
-static int             force;
+static bool            force;
 
-static int             full_paths;
+static bool            full_paths;
 
-static int             print_line;
+static bool            print_line;
 
 struct sym_hist {
        u64             sum;
@@ -584,7 +584,7 @@ static const struct option options[] = {
        OPT_STRING('s', "symbol", &sym_hist_filter, "symbol",
                    "symbol to annotate"),
        OPT_BOOLEAN('f', "force", &force, "don't complain, do it"),
-       OPT_BOOLEAN('v', "verbose", &verbose,
+       OPT_INCR('v', "verbose", &verbose,
                    "be more verbose (show symbol address, etc)"),
        OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
                    "dump raw trace in ASCII"),
index 30a05f552c96dfaac6de44a8268f5cb5ccd49061..f8e3d1852029b65c9c2efbdf5b6315f6f9e9d492 100644 (file)
@@ -27,7 +27,7 @@ static const struct option buildid_cache_options[] = {
                   "file list", "file(s) to add"),
        OPT_STRING('r', "remove", &remove_name_list_str, "file list",
                    "file(s) to remove"),
-       OPT_BOOLEAN('v', "verbose", &verbose, "be more verbose"),
+       OPT_INCR('v', "verbose", &verbose, "be more verbose"),
        OPT_END()
 };
 
index d0675c02f81eb0a45f5d2b8185dc6b26a15f98fd..af2ad8b92f767749c251ed939ed2678ae07058bd 100644 (file)
@@ -16,7 +16,7 @@
 #include "util/symbol.h"
 
 static char const *input_name = "perf.data";
-static int force;
+static bool force;
 static bool with_hits;
 
 static const char * const buildid_list_usage[] = {
@@ -29,7 +29,7 @@ static const struct option options[] = {
        OPT_STRING('i', "input", &input_name, "file",
                    "input file name"),
        OPT_BOOLEAN('f', "force", &force, "don't complain, do it"),
-       OPT_BOOLEAN('v', "verbose", &verbose,
+       OPT_INCR('v', "verbose", &verbose,
                    "be more verbose"),
        OPT_END()
 };
index 1ea15d8aeed1d2ff29eb99d72baec4702c9de277..3a1d94d75dce43c1cfdaac7a9da04fce0e520ecf 100644 (file)
@@ -19,7 +19,7 @@
 static char const *input_old = "perf.data.old",
                  *input_new = "perf.data";
 static char      diff__default_sort_order[] = "dso,symbol";
-static int  force;
+static bool  force;
 static bool show_displacement;
 
 static int perf_session__add_hist_entry(struct perf_session *self,
@@ -188,7 +188,7 @@ static const char * const diff_usage[] = {
 };
 
 static const struct option options[] = {
-       OPT_BOOLEAN('v', "verbose", &verbose,
+       OPT_INCR('v', "verbose", &verbose,
                    "be more verbose (show symbol address, etc)"),
        OPT_BOOLEAN('m', "displacement", &show_displacement,
                    "Show position displacement relative to baseline"),
index 215b584007b19f8ccccc7951c5ee9eebabda3bf7..81e3ecc40fc7d91e9688f772483b8c9d7a8f9eab 100644 (file)
@@ -29,7 +29,7 @@ enum help_format {
        HELP_FORMAT_WEB,
 };
 
-static int show_all = 0;
+static bool show_all = false;
 static enum help_format help_format = HELP_FORMAT_MAN;
 static struct option builtin_help_options[] = {
        OPT_BOOLEAN('a', "all", &show_all, "print all available commands"),
index e12c844df1e27a0366ec2491f8ad7df3f817307d..6c38e4febf9f6c7a80c95bdf2f0687afc0f3f64b 100644 (file)
@@ -744,7 +744,7 @@ static const char * const lock_usage[] = {
 
 static const struct option lock_options[] = {
        OPT_STRING('i', "input", &input_name, "file", "input file name"),
-       OPT_BOOLEAN('v', "verbose", &verbose, "be more verbose (show symbol address, etc)"),
+       OPT_INCR('v', "verbose", &verbose, "be more verbose (show symbol address, etc)"),
        OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace, "dump raw trace in ASCII"),
        OPT_END()
 };
index 152d6c9b1fa4a07619c7cd3d11a7f45b7777a1ff..0562c50fecf0989207eb3d3b2ed4dc62aa0cb35c 100644 (file)
@@ -162,7 +162,7 @@ static const char * const probe_usage[] = {
 };
 
 static const struct option options[] = {
-       OPT_BOOLEAN('v', "verbose", &verbose,
+       OPT_INCR('v', "verbose", &verbose,
                    "be more verbose (show parsed arguments, etc)"),
 #ifndef NO_DWARF_SUPPORT
        OPT_STRING('k', "vmlinux", &symbol_conf.vmlinux_name,
index f1411e9cdf47eb5355090119604419883ef160a0..d2d1b028da0cb850092b4a52b51d74f2a2034a0a 100644 (file)
@@ -39,19 +39,19 @@ static int                  output;
 static const char              *output_name                    = "perf.data";
 static int                     group                           =      0;
 static unsigned int            realtime_prio                   =      0;
-static int                     raw_samples                     =      0;
-static int                     system_wide                     =      0;
+static bool                    raw_samples                     =  false;
+static bool                    system_wide                     =  false;
 static int                     profile_cpu                     =     -1;
 static pid_t                   target_pid                      =     -1;
 static pid_t                   child_pid                       =     -1;
-static int                     inherit                         =      1;
-static int                     force                           =      0;
-static int                     append_file                     =      0;
-static int                     call_graph                      =      0;
-static int                     inherit_stat                    =      0;
-static int                     no_samples                      =      0;
-static int                     sample_address                  =      0;
-static int                     multiplex                       =      0;
+static bool                    inherit                         =   true;
+static bool                    force                           =  false;
+static bool                    append_file                     =  false;
+static bool                    call_graph                      =  false;
+static bool                    inherit_stat                    =  false;
+static bool                    no_samples                      =  false;
+static bool                    sample_address                  =  false;
+static bool                    multiplex                       =  false;
 static int                     multiplex_fd                    =     -1;
 
 static long                    samples                         =      0;
@@ -451,7 +451,7 @@ static int __cmd_record(int argc, const char **argv)
                        rename(output_name, oldname);
                }
        } else {
-               append_file = 0;
+               append_file = false;
        }
 
        flags = O_CREAT|O_RDWR;
@@ -676,7 +676,7 @@ static const struct option options[] = {
                    "number of mmap data pages"),
        OPT_BOOLEAN('g', "call-graph", &call_graph,
                    "do call-graph (stack chain/backtrace) recording"),
-       OPT_BOOLEAN('v', "verbose", &verbose,
+       OPT_INCR('v', "verbose", &verbose,
                    "be more verbose (show counter open errors, etc)"),
        OPT_BOOLEAN('s', "stat", &inherit_stat,
                    "per thread counts"),
index f815de25d0fc5b76eef680411930589654e793e8..63fc64e45f086b6a8e252f4d411e10627329446b 100644 (file)
 
 static char            const *input_name = "perf.data";
 
-static int             force;
+static bool            force;
 static bool            hide_unresolved;
 static bool            dont_use_callchains;
 
-static int             show_threads;
+static bool            show_threads;
 static struct perf_read_values show_threads_values;
 
 static char            default_pretty_printing_style[] = "normal";
@@ -400,7 +400,7 @@ static const char * const report_usage[] = {
 static const struct option options[] = {
        OPT_STRING('i', "input", &input_name, "file",
                    "input file name"),
-       OPT_BOOLEAN('v', "verbose", &verbose,
+       OPT_INCR('v', "verbose", &verbose,
                    "be more verbose (show symbol address, etc)"),
        OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
                    "dump raw trace in ASCII"),
index 4f5a03e43444ef2b9f02551557aae18dddf9ace7..682783c381792c7b5c9a2d5249c1df4dc9d1eecb 100644 (file)
@@ -1790,7 +1790,7 @@ static const char * const sched_usage[] = {
 static const struct option sched_options[] = {
        OPT_STRING('i', "input", &input_name, "file",
                    "input file name"),
-       OPT_BOOLEAN('v', "verbose", &verbose,
+       OPT_INCR('v', "verbose", &verbose,
                    "be more verbose (show symbol address, etc)"),
        OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
                    "dump raw trace in ASCII"),
@@ -1805,7 +1805,7 @@ static const char * const latency_usage[] = {
 static const struct option latency_options[] = {
        OPT_STRING('s', "sort", &sort_order, "key[,key2...]",
                   "sort by key(s): runtime, switch, avg, max"),
-       OPT_BOOLEAN('v', "verbose", &verbose,
+       OPT_INCR('v', "verbose", &verbose,
                    "be more verbose (show symbol address, etc)"),
        OPT_INTEGER('C', "CPU", &profile_cpu,
                    "CPU to profile on"),
@@ -1822,7 +1822,7 @@ static const char * const replay_usage[] = {
 static const struct option replay_options[] = {
        OPT_INTEGER('r', "repeat", &replay_repeat,
                    "repeat the workload replay N times (-1: infinite)"),
-       OPT_BOOLEAN('v', "verbose", &verbose,
+       OPT_INCR('v', "verbose", &verbose,
                    "be more verbose (show symbol address, etc)"),
        OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
                    "dump raw trace in ASCII"),
index 95db31cff6fdbb63e714dc0725998d7ef76103ea..f7f4a88611db9e7e4daa804d47104b94a83be65f 100644 (file)
@@ -66,16 +66,16 @@ static struct perf_event_attr default_attrs[] = {
 
 };
 
-static int                     system_wide                     =  0;
+static bool                    system_wide                     =  false;
 static unsigned int            nr_cpus                         =  0;
 static int                     run_idx                         =  0;
 
 static int                     run_count                       =  1;
-static int                     inherit                         =  1;
-static int                     scale                           =  1;
+static bool                    inherit                         =  true;
+static bool                    scale                           =  true;
 static pid_t                   target_pid                      = -1;
 static pid_t                   child_pid                       = -1;
-static int                     null_run                        =  0;
+static bool                    null_run                        =  false;
 
 static int                     fd[MAX_NR_CPUS][MAX_COUNTERS];
 
@@ -494,7 +494,7 @@ static const struct option options[] = {
                    "system-wide collection from all CPUs"),
        OPT_BOOLEAN('c', "scale", &scale,
                    "scale/normalize counters"),
-       OPT_BOOLEAN('v', "verbose", &verbose,
+       OPT_INCR('v', "verbose", &verbose,
                    "be more verbose (show counter open errors, etc)"),
        OPT_INTEGER('r', "repeat", &run_count,
                    "repeat command and print average + stddev (max: 100)"),
index 0d4d8ff7914b029423dba4e742c7343925519043..1d7416dc42bd8a5b2bf5e2cce7c7e5cf3b69f1c0 100644 (file)
@@ -43,7 +43,7 @@ static u64            turbo_frequency;
 
 static u64             first_time, last_time;
 
-static int             power_only;
+static bool            power_only;
 
 
 struct per_pid;
index 1f529321607eb2c2c852bb481982f1287fc86ef9..d5735514e23319d8121c01c8c11a63deb374ca38 100644 (file)
@@ -57,7 +57,7 @@
 
 static int                     fd[MAX_NR_CPUS][MAX_COUNTERS];
 
-static int                     system_wide                     =      0;
+static bool                    system_wide                     =  false;
 
 static int                     default_interval                =      0;
 
@@ -65,18 +65,18 @@ static int                  count_filter                    =      5;
 static int                     print_entries;
 
 static int                     target_pid                      =     -1;
-static int                     inherit                         =      0;
+static bool                    inherit                         =  false;
 static int                     profile_cpu                     =     -1;
 static int                     nr_cpus                         =      0;
 static unsigned int            realtime_prio                   =      0;
-static int                     group                           =      0;
+static bool                    group                           =  false;
 static unsigned int            page_size;
 static unsigned int            mmap_pages                      =     16;
 static int                     freq                            =   1000; /* 1 KHz */
 
 static int                     delay_secs                      =      2;
-static int                     zero                            =      0;
-static int                     dump_symtab                     =      0;
+static bool                    zero                            =  false;
+static bool                    dump_symtab                     =  false;
 
 static bool                    hide_kernel_symbols             =  false;
 static bool                    hide_user_symbols               =  false;
@@ -839,7 +839,7 @@ static void handle_keypress(int c)
                        display_weighted = ~display_weighted;
                        break;
                case 'z':
-                       zero = ~zero;
+                       zero = !zero;
                        break;
                default:
                        break;
@@ -1296,7 +1296,7 @@ static const struct option options[] = {
                    "display this many functions"),
        OPT_BOOLEAN('U', "hide_user_symbols", &hide_user_symbols,
                    "hide user symbols"),
-       OPT_BOOLEAN('v', "verbose", &verbose,
+       OPT_INCR('v', "verbose", &verbose,
                    "be more verbose (show counter open errors, etc)"),
        OPT_END()
 };
index 407041d20de065027e9f2a32eff7b5e6a078419c..8fc50d8315400e2ecc2450356da9f544fc7db15a 100644 (file)
@@ -505,7 +505,7 @@ static const char * const trace_usage[] = {
 static const struct option options[] = {
        OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
                    "dump raw trace in ASCII"),
-       OPT_BOOLEAN('v', "verbose", &verbose,
+       OPT_INCR('v', "verbose", &verbose,
                    "be more verbose (show symbol address, etc)"),
        OPT_BOOLEAN('L', "Latency", &latency_format,
                    "show latency attributes (irqs/preemption disabled, etc)"),
index 0905600c3851b51ec6b52f716e33f797c1da1032..666b1c293ffd4f79d7e037f5d4230aa48cc1b662 100644 (file)
@@ -12,7 +12,7 @@
 #include "util.h"
 
 int verbose = 0;
-int dump_trace = 0;
+bool dump_trace = false;
 
 int eprintf(int level, const char *fmt, ...)
 {
index c6c24c522deaf0cbbef6af3ffd95de706525412d..0f7af878efc453442266639673bafaffb630c69e 100644 (file)
@@ -2,10 +2,11 @@
 #ifndef __PERF_DEBUG_H
 #define __PERF_DEBUG_H
 
+#include <stdbool.h>
 #include "event.h"
 
 extern int verbose;
-extern int dump_trace;
+extern bool dump_trace;
 
 int eprintf(int level,
            const char *fmt, ...) __attribute__((format(printf, 2, 3)));
index efebd5b476b320685178947332a48214d76529b5..bbe646ba184dc889ed23f82f577cb45c9b0357f5 100644 (file)
@@ -49,6 +49,7 @@ static int get_value(struct parse_opt_ctx_t *p,
                                break;
                        /* FALLTHROUGH */
                case OPTION_BOOLEAN:
+               case OPTION_INCR:
                case OPTION_BIT:
                case OPTION_SET_INT:
                case OPTION_SET_PTR:
@@ -73,6 +74,10 @@ static int get_value(struct parse_opt_ctx_t *p,
                return 0;
 
        case OPTION_BOOLEAN:
+               *(bool *)opt->value = unset ? false : true;
+               return 0;
+
+       case OPTION_INCR:
                *(int *)opt->value = unset ? 0 : *(int *)opt->value + 1;
                return 0;
 
@@ -478,6 +483,7 @@ int usage_with_options_internal(const char * const *usagestr,
                case OPTION_GROUP:
                case OPTION_BIT:
                case OPTION_BOOLEAN:
+               case OPTION_INCR:
                case OPTION_SET_INT:
                case OPTION_SET_PTR:
                case OPTION_LONG:
index 948805af43c21e45296c6caa8adda25106a66423..b2da725f102a14b643c191e9d73bd620ccd7cdb5 100644 (file)
@@ -8,7 +8,8 @@ enum parse_opt_type {
        OPTION_GROUP,
        /* options with no arguments */
        OPTION_BIT,
-       OPTION_BOOLEAN, /* _INCR would have been a better name */
+       OPTION_BOOLEAN,
+       OPTION_INCR,
        OPTION_SET_INT,
        OPTION_SET_PTR,
        /* options with arguments (usually) */
@@ -95,6 +96,7 @@ struct option {
 #define OPT_GROUP(h)                { .type = OPTION_GROUP, .help = (h) }
 #define OPT_BIT(s, l, v, h, b)      { .type = OPTION_BIT, .short_name = (s), .long_name = (l), .value = (v), .help = (h), .defval = (b) }
 #define OPT_BOOLEAN(s, l, v, h)     { .type = OPTION_BOOLEAN, .short_name = (s), .long_name = (l), .value = (v), .help = (h) }
+#define OPT_INCR(s, l, v, h)        { .type = OPTION_INCR, .short_name = (s), .long_name = (l), .value = (v), .help = (h) }
 #define OPT_SET_INT(s, l, v, h, i)  { .type = OPTION_SET_INT, .short_name = (s), .long_name = (l), .value = (v), .help = (h), .defval = (i) }
 #define OPT_SET_PTR(s, l, v, h, p)  { .type = OPTION_SET_PTR, .short_name = (s), .long_name = (l), .value = (v), .help = (h), .defval = (p) }
 #define OPT_INTEGER(s, l, v, h)     { .type = OPTION_INTEGER, .short_name = (s), .long_name = (l), .value = (v), .help = (h) }
index 613c9cc9057020675667756580623588fbc4dc43..dc78bae71669e85eee720994340445181ba71405 100644 (file)
@@ -40,7 +40,7 @@ int header_page_size_size;
 int header_page_data_offset;
 int header_page_data_size;
 
-int latency_format;
+bool latency_format;
 
 static char *input_buf;
 static unsigned long long input_buf_ptr;
index c3269b937db42d103d2bd3a37789d535445a8153..81f2fd20a0ea7a9552c340a67fa7461fc905b30e 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef __PERF_TRACE_EVENTS_H
 #define __PERF_TRACE_EVENTS_H
 
+#include <stdbool.h>
 #include "parse-events.h"
 
 #define __unused __attribute__((unused))
@@ -241,7 +242,7 @@ extern int header_page_size_size;
 extern int header_page_data_offset;
 extern int header_page_data_size;
 
-extern int latency_format;
+extern bool latency_format;
 
 int parse_header_page(char *buf, unsigned long size);
 int trace_parse_common_type(void *data);