]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 12 May 2017 17:45:36 +0000 (10:45 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 12 May 2017 17:45:36 +0000 (10:45 -0700)
Pull perf updates/fixes from Ingo Molnar:
 "Mostly tooling updates, but also two kernel fixes: a call chain
  handling robustness fix and an x86 PMU driver event definition fix"

* 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  perf/callchain: Force USER_DS when invoking perf_callchain_user()
  tools build: Fixup sched_getcpu feature test
  perf tests kmod-path: Don't fail if compressed modules aren't supported
  perf annotate: Fix AArch64 comment char
  perf tools: Fix spelling mistakes
  perf/x86: Fix Broadwell-EP DRAM RAPL events
  perf config: Refactor a duplicated code for obtaining config file name
  perf symbols: Allow user probes on versioned symbols
  perf symbols: Accept symbols starting at address 0
  tools lib string: Adopt prefixcmp() from perf and subcmd
  perf units: Move parse_tag_value() to units.[ch]
  perf ui gtk: Move gtk .so name to the only place where it is used
  perf tools: Move HAS_BOOL define to where perl headers are used
  perf memswap: Split the byteswap memory range wrappers from util.[ch]
  perf tools: Move event prototypes from util.h to event.h
  perf buildid: Move prototypes from util.h to build-id.h

48 files changed:
arch/x86/events/intel/rapl.c
kernel/events/callchain.c
tools/build/feature/test-sched_getcpu.c
tools/include/linux/string.h
tools/lib/string.c
tools/lib/subcmd/help.c
tools/lib/subcmd/parse-options.c
tools/lib/subcmd/subcmd-util.h
tools/perf/Documentation/perf-c2c.txt
tools/perf/Documentation/perf-record.txt
tools/perf/Documentation/perf-report.txt
tools/perf/Documentation/perf.data-file-format.txt
tools/perf/Documentation/tips.txt
tools/perf/arch/arm64/annotate/instructions.c
tools/perf/arch/powerpc/util/sym-handling.c
tools/perf/builtin-buildid-cache.c
tools/perf/builtin-c2c.c
tools/perf/builtin-config.c
tools/perf/builtin-top.c
tools/perf/builtin-trace.c
tools/perf/perf.c
tools/perf/tests/hists_cumulate.c
tools/perf/tests/hists_filter.c
tools/perf/tests/hists_output.c
tools/perf/tests/kmod-path.c
tools/perf/tests/sdt.c
tools/perf/ui/setup.c
tools/perf/util/Build
tools/perf/util/build-id.h
tools/perf/util/event.c
tools/perf/util/event.h
tools/perf/util/evsel.c
tools/perf/util/header.c
tools/perf/util/intel-pt.c
tools/perf/util/machine.c
tools/perf/util/map.c
tools/perf/util/map.h
tools/perf/util/memswap.c [new file with mode: 0644]
tools/perf/util/memswap.h [new file with mode: 0644]
tools/perf/util/scripting-engines/trace-event-perl.c
tools/perf/util/session.c
tools/perf/util/strbuf.c
tools/perf/util/symbol.c
tools/perf/util/symbol.h
tools/perf/util/units.c
tools/perf/util/units.h
tools/perf/util/util.c
tools/perf/util/util.h

index 9d05c7e67f6073e3441c164d1bdc6db390507ef0..a45e2114a8460925b44bd6e0983f3ee37e83d861 100644 (file)
@@ -761,7 +761,7 @@ static const struct x86_cpu_id rapl_cpu_match[] __initconst = {
 
        X86_RAPL_MODEL_MATCH(INTEL_FAM6_BROADWELL_CORE,   hsw_rapl_init),
        X86_RAPL_MODEL_MATCH(INTEL_FAM6_BROADWELL_GT3E,   hsw_rapl_init),
-       X86_RAPL_MODEL_MATCH(INTEL_FAM6_BROADWELL_X,      hsw_rapl_init),
+       X86_RAPL_MODEL_MATCH(INTEL_FAM6_BROADWELL_X,      hsx_rapl_init),
        X86_RAPL_MODEL_MATCH(INTEL_FAM6_BROADWELL_XEON_D, hsw_rapl_init),
 
        X86_RAPL_MODEL_MATCH(INTEL_FAM6_XEON_PHI_KNL, knl_rapl_init),
index c04917cad1bfdc50fe4f00b08eaa58c9e7e7692e..1b2be63c85282fdb6f910e145853f97c23d8efb4 100644 (file)
@@ -229,12 +229,18 @@ get_perf_callchain(struct pt_regs *regs, u32 init_nr, bool kernel, bool user,
                }
 
                if (regs) {
+                       mm_segment_t fs;
+
                        if (crosstask)
                                goto exit_put;
 
                        if (add_mark)
                                perf_callchain_store_context(&ctx, PERF_CONTEXT_USER);
+
+                       fs = get_fs();
+                       set_fs(USER_DS);
                        perf_callchain_user(&ctx, regs);
+                       set_fs(fs);
                }
        }
 
index c4a148dd71048a0fb89eb24ea4527976702110c2..9c6b4cbffb1cae2759a524b70d36cee1b8f9f02e 100644 (file)
@@ -1,4 +1,6 @@
+#ifndef _GNU_SOURCE
 #define _GNU_SOURCE
+#endif
 #include <sched.h>
 
 int main(void)
index f436d2420a18575095e66b7bfbf15b0abbe83fe8..d62b56cf8c12eedcdda935bc1180c4b4b70270b9 100644 (file)
@@ -18,4 +18,6 @@ extern size_t strlcpy(char *dest, const char *src, size_t size);
 
 char *str_error_r(int errnum, char *buf, size_t buflen);
 
+int prefixcmp(const char *str, const char *prefix);
+
 #endif /* _LINUX_STRING_H_ */
index bd239bc1d557dbde447e8128ac7cd3163dc11a04..8e678af1c6ee479eae333cf5766598db5dce5208 100644 (file)
@@ -87,3 +87,12 @@ size_t __weak strlcpy(char *dest, const char *src, size_t size)
        }
        return ret;
 }
+
+int prefixcmp(const char *str, const char *prefix)
+{
+       for (; ; str++, prefix++)
+               if (!*prefix)
+                       return 0;
+               else if (*str != *prefix)
+                       return (unsigned char)*prefix - (unsigned char)*str;
+}
index e228c3cb37160b8fd5bda5e3a7c9e76f89ea4537..ba970a73d053f3c019a318dbb7fa14b9dbab9b40 100644 (file)
@@ -1,6 +1,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <linux/string.h>
 #include <termios.h>
 #include <sys/ioctl.h>
 #include <sys/types.h>
index 6bc24025d05457098b504c3a1e9e5a1316b21817..359bfa77f39cdebac7df82876b227d1a63975c39 100644 (file)
@@ -1,4 +1,5 @@
 #include <linux/compiler.h>
+#include <linux/string.h>
 #include <linux/types.h>
 #include <stdio.h>
 #include <stdlib.h>
index fc2e45d8aaf1d04c09d53fd4db6478d60d066895..8fa5f036eff08002ee802dc6014f6689d790a80f 100644 (file)
@@ -79,13 +79,4 @@ static inline void astrcat(char **out, const char *add)
        free(tmp);
 }
 
-static inline int prefixcmp(const char *str, const char *prefix)
-{
-       for (; ; str++, prefix++)
-               if (!*prefix)
-                       return 0;
-               else if (*str != *prefix)
-                       return (unsigned char)*prefix - (unsigned char)*str;
-}
-
 #endif /* __SUBCMD_UTIL_H */
index 2da07e51e1190271dd0d74130baf4807b0b08031..82241423517051b1668564710063cd1797bcf327 100644 (file)
@@ -76,7 +76,7 @@ REPORT OPTIONS
 
 -c::
 --coalesce::
-       Specify sorintg fields for single cacheline display.
+       Specify sorting fields for single cacheline display.
        Following fields are available: tid,pid,iaddr,dso
        (see COALESCE)
 
@@ -106,7 +106,7 @@ REPORT OPTIONS
 
 -d::
 --display::
-       Siwtch to HITM type (rmt, lcl) to display and sort on. Total HITMs as default.
+       Switch to HITM type (rmt, lcl) to display and sort on. Total HITMs as default.
 
 C2C RECORD
 ----------
index ea3789d05e5e69fa60f2d8daf230f62aaae073c8..b0e9e921d534c46d79da49fe0641013a64caebb6 100644 (file)
@@ -225,7 +225,7 @@ OPTIONS
        the libunwind or libdw library) should be used instead.
        Using the "lbr" method doesn't require any compiler options. It
        will produce call graphs from the hardware LBR registers. The
-       main limition is that it is only available on new Intel
+       main limitation is that it is only available on new Intel
        platforms, such as Haswell. It can only get user call chain. It
        doesn't work with branch stack sampling at the same time.
 
index 37a1759141579b6fdf35ee1ebcb996060ef01c71..9fa84617181e47e00a93529b6a91fca3d3fbe9c2 100644 (file)
@@ -182,7 +182,7 @@ OPTIONS
 --parent=<regex>::
         A regex filter to identify parent. The parent is a caller of this
        function and searched through the callchain, thus it requires callchain
-       information recorded. The pattern is in the exteneded regex format and
+       information recorded. The pattern is in the extended regex format and
        defaults to "\^sys_|^do_page_fault", see '--sort parent'.
 
 -x::
@@ -207,8 +207,8 @@ OPTIONS
 -g::
 --call-graph=<print_type,threshold[,print_limit],order,sort_key[,branch],value>::
         Display call chains using type, min percent threshold, print limit,
-       call order, sort key, optional branch and value.  Note that ordering of
-       parameters is not fixed so any parement can be given in an arbitraty order.
+       call order, sort key, optional branch and value.  Note that ordering
+       is not fixed so any parameter can be given in an arbitrary order.
        One exception is the print_limit which should be preceded by threshold.
 
        print_type can be either:
index fa2a9132f0a9438d2637501c711c33d3a4e68ac9..de8b39dda7b828edf2d5acae5bd7ca6dae505369 100644 (file)
@@ -270,7 +270,7 @@ When the event stream contains multiple events each event is identified
 by an ID. This can be either through the PERF_SAMPLE_ID or the
 PERF_SAMPLE_IDENTIFIER header. The PERF_SAMPLE_IDENTIFIER header is
 at a fixed offset from the event header, which allows reliable
-parsing of the header. Relying on ID may be ambigious.
+parsing of the header. Relying on ID may be ambiguous.
 IDENTIFIER is only supported by newer Linux kernels.
 
 Perf record specific events:
@@ -288,7 +288,7 @@ struct attr_event {
        uint64_t id[];
 };
 
-       PERF_RECORD_HEADER_EVENT_TYPE           = 65, /* depreceated */
+       PERF_RECORD_HEADER_EVENT_TYPE           = 65, /* deprecated */
 
 #define MAX_EVENT_NAME 64
 
index 170b0289a7bcd3682b3c67249bb0eac2384b70d1..db0ca3063eaebc83d483465a2e0e9bfdaf5e4387 100644 (file)
@@ -23,7 +23,7 @@ For memory address profiling, try: perf mem record / perf mem report
 For tracepoint events, try: perf report -s trace_fields
 To record callchains for each sample: perf record -g
 To record every process run by a user: perf record -u <user>
-Skip collecing build-id when recording: perf record -B
+Skip collecting build-id when recording: perf record -B
 To change sampling frequency to 100 Hz: perf record -F 100
 See assembly instructions with percentage: perf annotate <symbol>
 If you prefer Intel style assembly, try: perf annotate -M intel
index 44eafd6f2d5008e62aa68b21a2b415d1db736a49..8f1908756cb69bd6b452aec963650b5bebe2ffea 100644 (file)
@@ -50,7 +50,7 @@ static int arm64__annotate_init(struct arch *arch)
        arch->initialized = true;
        arch->priv        = arm;
        arch->associate_instruction_ops   = arm64__associate_instruction_ops;
-       arch->objdump.comment_char        = ';';
+       arch->objdump.comment_char        = '/';
        arch->objdump.skip_functions_char = '+';
        return 0;
 
index 39dbe512b9fcf3c8caeda0cebc5dea32d9696bec..bf9a2594572c7ff3e94adfab36dce813476bb6a9 100644 (file)
@@ -52,6 +52,18 @@ int arch__compare_symbol_names(const char *namea, const char *nameb)
 
        return strcmp(namea, nameb);
 }
+
+int arch__compare_symbol_names_n(const char *namea, const char *nameb,
+                                unsigned int n)
+{
+       /* Skip over initial dot */
+       if (*namea == '.')
+               namea++;
+       if (*nameb == '.')
+               nameb++;
+
+       return strncmp(namea, nameb, n);
+}
 #endif
 
 #if defined(_CALL_ELF) && _CALL_ELF == 2
index 64b44e81c7715a1c38df8e0309bde80b7d24bf86..9eba7f1add1f9706f2b8153fb33f3574b362d5ee 100644 (file)
@@ -49,19 +49,22 @@ static bool same_kallsyms_reloc(const char *from_dir, char *to_dir)
        char to[PATH_MAX];
        const char *name;
        u64 addr1 = 0, addr2 = 0;
-       int i;
+       int i, err = -1;
 
        scnprintf(from, sizeof(from), "%s/kallsyms", from_dir);
        scnprintf(to, sizeof(to), "%s/kallsyms", to_dir);
 
        for (i = 0; (name = ref_reloc_sym_names[i]) != NULL; i++) {
-               addr1 = kallsyms__get_function_start(from, name);
-               if (addr1)
+               err = kallsyms__get_function_start(from, name, &addr1);
+               if (!err)
                        break;
        }
 
-       if (name)
-               addr2 = kallsyms__get_function_start(to, name);
+       if (err)
+               return false;
+
+       if (kallsyms__get_function_start(to, name, &addr2))
+               return false;
 
        return addr1 == addr2;
 }
index e33b4acece90aca126a50a91321bbd0cd3a533aa..620a467ee3043c5cadfedd02c87c0195bb681413 100644 (file)
@@ -27,6 +27,7 @@
 #include "tool.h"
 #include "data.h"
 #include "sort.h"
+#include "event.h"
 #include "evlist.h"
 #include "evsel.h"
 #include <asm/bug.h>
index 55f04f85b04945a1b9635857b91e3e5e03c7e3ba..80668fa7556ef5731b97c795c5a3a760134a9d8f 100644 (file)
@@ -159,6 +159,7 @@ int cmd_config(int argc, const char **argv)
        int i, ret = 0;
        struct perf_config_set *set;
        char *user_config = mkpath("%s/.perfconfig", getenv("HOME"));
+       const char *config_filename;
 
        argc = parse_options(argc, argv, config_options, config_usage,
                             PARSE_OPT_STOP_AT_NON_OPTION);
@@ -175,6 +176,11 @@ int cmd_config(int argc, const char **argv)
        else if (use_user_config)
                config_exclusive_filename = user_config;
 
+       if (!config_exclusive_filename)
+               config_filename = user_config;
+       else
+               config_filename = config_exclusive_filename;
+
        /*
         * At only 'config' sub-command, individually use the config set
         * because of reinitializing with options config file location.
@@ -192,13 +198,9 @@ int cmd_config(int argc, const char **argv)
                        parse_options_usage(config_usage, config_options, "l", 1);
                } else {
                        ret = show_config(set);
-                       if (ret < 0) {
-                               const char * config_filename = config_exclusive_filename;
-                               if (!config_exclusive_filename)
-                                       config_filename = user_config;
+                       if (ret < 0)
                                pr_err("Nothing configured, "
                                       "please check your %s \n", config_filename);
-                       }
                }
                break;
        default:
@@ -221,13 +223,8 @@ int cmd_config(int argc, const char **argv)
 
                                if (value == NULL)
                                        ret = show_spec_config(set, var);
-                               else {
-                                       const char *config_filename = config_exclusive_filename;
-
-                                       if (!config_exclusive_filename)
-                                               config_filename = user_config;
+                               else
                                        ret = set_config(set, config_filename, var, value);
-                               }
                                free(arg);
                        }
                } else
index 7ab42b8311a10c18f1be6241337fe15097af23a2..10b6362ca0bf7e0b6d5fce4697b15645ba816f02 100644 (file)
 #include "util/drv_configs.h"
 #include "util/evlist.h"
 #include "util/evsel.h"
+#include "util/event.h"
 #include "util/machine.h"
 #include "util/session.h"
 #include "util/symbol.h"
 #include "util/thread.h"
 #include "util/thread_map.h"
 #include "util/top.h"
-#include "util/util.h"
 #include <linux/rbtree.h>
 #include <subcmd/parse-options.h>
 #include "util/parse-events.h"
index eaa66fb57347642a617026d5423e3ad57b73a979..d014350adc526722da3a12f29421cd6d3c00f4af 100644 (file)
@@ -21,6 +21,7 @@
 #include "builtin.h"
 #include "util/color.h"
 #include "util/debug.h"
+#include "util/event.h"
 #include "util/evlist.h"
 #include <subcmd/exec-cmd.h>
 #include "util/machine.h"
index 4cc6960f6226289926dcee7f60ba0a6c7796332b..628a5e412cb14b00d9ead40bdcbb13db4c82bd75 100644 (file)
@@ -17,6 +17,7 @@
 #include <subcmd/parse-options.h>
 #include "util/bpf-loader.h"
 #include "util/debug.h"
+#include "util/event.h"
 #include <api/fs/fs.h>
 #include <api/fs/tracing_path.h>
 #include <errno.h>
index 70918b9865681b5e01d9ad5e2f4512b2a6edb2fb..d549a9f2c41b30f4d35eae742dbdfcb584ee804d 100644 (file)
@@ -1,5 +1,6 @@
 #include "perf.h"
 #include "util/debug.h"
+#include "util/event.h"
 #include "util/symbol.h"
 #include "util/sort.h"
 #include "util/evsel.h"
index f171b2da48990510a32bb00bc17016bf04af4471..df9c91f49af19927ad48bc9c103aaf8bd43e0c40 100644 (file)
@@ -3,6 +3,7 @@
 #include "util/symbol.h"
 #include "util/sort.h"
 #include "util/evsel.h"
+#include "util/event.h"
 #include "util/evlist.h"
 #include "util/machine.h"
 #include "util/thread.h"
index cdf0dde5fe9712b803bffcf98617dcb73fcbb2d3..06e5080182d31e879b25d2cabfc43c7a9a552097 100644 (file)
@@ -1,5 +1,6 @@
 #include "perf.h"
 #include "util/debug.h"
+#include "util/event.h"
 #include "util/symbol.h"
 #include "util/sort.h"
 #include "util/evsel.h"
index 76f41f249944ccaa3af8de50256f8a24faf22f6b..6cd9e5107f7784ab4c340f80a03bc786b7c264b4 100644 (file)
@@ -61,6 +61,7 @@ int test__kmod_path__parse(int subtest __maybe_unused)
        M("/xxxx/xxxx/x-x.ko", PERF_RECORD_MISC_KERNEL, true);
        M("/xxxx/xxxx/x-x.ko", PERF_RECORD_MISC_USER, false);
 
+#ifdef HAVE_ZLIB_SUPPORT
        /* path                alloc_name  alloc_ext   kmod  comp  name   ext */
        T("/xxxx/xxxx/x.ko.gz", true     , true      , true, true, "[x]", "gz");
        T("/xxxx/xxxx/x.ko.gz", false    , true      , true, true, NULL , "gz");
@@ -96,6 +97,7 @@ int test__kmod_path__parse(int subtest __maybe_unused)
        M("x.ko.gz", PERF_RECORD_MISC_CPUMODE_UNKNOWN, true);
        M("x.ko.gz", PERF_RECORD_MISC_KERNEL, true);
        M("x.ko.gz", PERF_RECORD_MISC_USER, false);
+#endif
 
        /* path            alloc_name  alloc_ext  kmod  comp   name             ext */
        T("[test_module]", true      , true     , true, false, "[test_module]", NULL);
index f73b3c5e125dc9e84ad3bb14c4da05e983111b5b..06eda675ae2c1ee3a59758c00285dc1a1f793230 100644 (file)
@@ -1,7 +1,6 @@
 #include <errno.h>
 #include <stdio.h>
 #include <sys/epoll.h>
-#include <util/util.h>
 #include <util/evlist.h>
 #include <linux/filter.h>
 #include "tests.h"
index 5ea0b40c4fc2175b27886916ff1fbe1717d0d7e6..caf1ce6f51527ba5e542caacfb26d06c37829674 100644 (file)
@@ -10,7 +10,10 @@ pthread_mutex_t ui__lock = PTHREAD_MUTEX_INITIALIZER;
 void *perf_gtk_handle;
 int use_browser = -1;
 
+#define PERF_GTK_DSO "libperf-gtk.so"
+
 #ifdef HAVE_GTK2_SUPPORT
+
 static int setup_gtk_browser(void)
 {
        int (*perf_ui_init)(void);
index 069583bdc670f0bf05c3f48762a53dc412a67fae..79dea95a7f688ca9fa9b16346b3fae25af797f5c 100644 (file)
@@ -13,6 +13,7 @@ libperf-y += find_bit.o
 libperf-y += kallsyms.o
 libperf-y += levenshtein.o
 libperf-y += llvm-utils.o
+libperf-y += memswap.o
 libperf-y += parse-events.o
 libperf-y += perf_regs.o
 libperf-y += path.o
index a96081121179697525d9de77cb14c36797c5027f..8a89b195c1fc3a5c36d7ca260dafe9c6b3fa8262 100644 (file)
@@ -44,6 +44,10 @@ bool build_id_cache__cached(const char *sbuild_id);
 int build_id_cache__add_s(const char *sbuild_id,
                          const char *name, bool is_kallsyms, bool is_vdso);
 int build_id_cache__remove_s(const char *sbuild_id);
+
+extern char buildid_dir[];
+
+void set_buildid_dir(const char *dir);
 void disable_buildid_cache(void);
 
 #endif
index 142835c0ca0a7dd76b1e7106b32dc60d63384c83..dc5c3bb69d73882ebbac88dfec2d16c55b56355e 100644 (file)
@@ -8,6 +8,7 @@
 #include <unistd.h>
 #include <uapi/linux/mman.h> /* To get things like MAP_HUGETLB even on older libc headers */
 #include <api/fs/fs.h>
+#include <linux/perf_event.h>
 #include "event.h"
 #include "debug.h"
 #include "hist.h"
@@ -767,15 +768,16 @@ static int find_symbol_cb(void *arg, const char *name, char type,
        return 1;
 }
 
-u64 kallsyms__get_function_start(const char *kallsyms_filename,
-                                const char *symbol_name)
+int kallsyms__get_function_start(const char *kallsyms_filename,
+                                const char *symbol_name, u64 *addr)
 {
        struct process_symbol_args args = { .name = symbol_name, };
 
        if (kallsyms__parse(kallsyms_filename, &args, find_symbol_cb) <= 0)
-               return 0;
+               return -1;
 
-       return args.start;
+       *addr = args.start;
+       return 0;
 }
 
 int perf_event__synthesize_kernel_mmap(struct perf_tool *tool,
index db2de6413518adffc63e8c0c57d2b304696760df..7c3fa1c8cbcd4fdcde2074f354798adf59f01e67 100644 (file)
@@ -229,7 +229,7 @@ struct build_id_event {
 enum perf_user_event_type { /* above any possible kernel type */
        PERF_RECORD_USER_TYPE_START             = 64,
        PERF_RECORD_HEADER_ATTR                 = 64,
-       PERF_RECORD_HEADER_EVENT_TYPE           = 65, /* depreceated */
+       PERF_RECORD_HEADER_EVENT_TYPE           = 65, /* deprecated */
        PERF_RECORD_HEADER_TRACING_DATA         = 66,
        PERF_RECORD_HEADER_BUILD_ID             = 67,
        PERF_RECORD_FINISHED_ROUND              = 68,
@@ -675,10 +675,18 @@ size_t perf_event__fprintf_cpu_map(union perf_event *event, FILE *fp);
 size_t perf_event__fprintf_namespaces(union perf_event *event, FILE *fp);
 size_t perf_event__fprintf(union perf_event *event, FILE *fp);
 
-u64 kallsyms__get_function_start(const char *kallsyms_filename,
-                                const char *symbol_name);
+int kallsyms__get_function_start(const char *kallsyms_filename,
+                                const char *symbol_name, u64 *addr);
 
 void *cpu_map_data__alloc(struct cpu_map *map, size_t *size, u16 *type, int *max);
 void  cpu_map_data__synthesize(struct cpu_map_data *data, struct cpu_map *map,
                               u16 type, int max);
+
+void event_attr_init(struct perf_event_attr *attr);
+
+int perf_event_paranoid(void);
+
+extern int sysctl_perf_event_max_stack;
+extern int sysctl_perf_event_max_contexts_per_stack;
+
 #endif /* __PERF_RECORD_H */
index 0e879097adfb33b455d16aa31099e698ee34db04..e4f7902d5afa62f0aecab1103bc05ca4bcb226e9 100644 (file)
@@ -21,6 +21,7 @@
 #include "asm/bug.h"
 #include "callchain.h"
 #include "cgroup.h"
+#include "event.h"
 #include "evsel.h"
 #include "evlist.h"
 #include "util.h"
index 948b2c5efb658e419114680ff07f4bf32cd70871..314a07151fb772377752dae62658b79ffdc87cd6 100644 (file)
@@ -19,6 +19,7 @@
 #include "evlist.h"
 #include "evsel.h"
 #include "header.h"
+#include "memswap.h"
 #include "../perf.h"
 #include "trace-event.h"
 #include "session.h"
index bdd4a28c6cee13e296b425d40343fb3b6e11a861..4c7718f87a0890ee64e2f78e0b97291b67ecf33e 100644 (file)
@@ -23,6 +23,7 @@
 #include "../perf.h"
 #include "session.h"
 #include "machine.h"
+#include "memswap.h"
 #include "sort.h"
 #include "tool.h"
 #include "event.h"
index 7a47f52ccfccf5de627f023e78ee554359639224..d97e014c3df395e51e61da31f9624e12927a43b2 100644 (file)
@@ -796,11 +796,11 @@ const char *ref_reloc_sym_names[] = {"_text", "_stext", NULL};
  * Returns the name of the start symbol in *symbol_name. Pass in NULL as
  * symbol_name if it's not that important.
  */
-static u64 machine__get_running_kernel_start(struct machine *machine,
-                                            const char **symbol_name)
+static int machine__get_running_kernel_start(struct machine *machine,
+                                            const char **symbol_name, u64 *start)
 {
        char filename[PATH_MAX];
-       int i;
+       int i, err = -1;
        const char *name;
        u64 addr = 0;
 
@@ -810,21 +810,28 @@ static u64 machine__get_running_kernel_start(struct machine *machine,
                return 0;
 
        for (i = 0; (name = ref_reloc_sym_names[i]) != NULL; i++) {
-               addr = kallsyms__get_function_start(filename, name);
-               if (addr)
+               err = kallsyms__get_function_start(filename, name, &addr);
+               if (!err)
                        break;
        }
 
+       if (err)
+               return -1;
+
        if (symbol_name)
                *symbol_name = name;
 
-       return addr;
+       *start = addr;
+       return 0;
 }
 
 int __machine__create_kernel_maps(struct machine *machine, struct dso *kernel)
 {
        int type;
-       u64 start = machine__get_running_kernel_start(machine, NULL);
+       u64 start = 0;
+
+       if (machine__get_running_kernel_start(machine, NULL, &start))
+               return -1;
 
        /* In case of renewal the kernel map, destroy previous one */
        machine__destroy_kernel_maps(machine);
@@ -1185,8 +1192,8 @@ static int machine__create_modules(struct machine *machine)
 int machine__create_kernel_maps(struct machine *machine)
 {
        struct dso *kernel = machine__get_kernel(machine);
-       const char *name;
-       u64 addr;
+       const char *name = NULL;
+       u64 addr = 0;
        int ret;
 
        if (kernel == NULL)
@@ -1211,8 +1218,7 @@ int machine__create_kernel_maps(struct machine *machine)
         */
        map_groups__fixup_end(&machine->kmaps);
 
-       addr = machine__get_running_kernel_start(machine, &name);
-       if (!addr) {
+       if (machine__get_running_kernel_start(machine, &name, &addr)) {
        } else if (maps__set_kallsyms_ref_reloc_sym(machine->vmlinux_maps, name, addr)) {
                machine__destroy_kernel_maps(machine);
                return -1;
index ebfa5d92358acd609269dd38e03a656d96ec43f7..2179b2deb7307c749fb171e48c784e4bc158b028 100644 (file)
@@ -325,11 +325,6 @@ int map__load(struct map *map)
        return 0;
 }
 
-int __weak arch__compare_symbol_names(const char *namea, const char *nameb)
-{
-       return strcmp(namea, nameb);
-}
-
 struct symbol *map__find_symbol(struct map *map, u64 addr)
 {
        if (map__load(map) < 0)
index c8a5a644c0a9797f309fb58d9d2f69bd163cb598..f9e8ac8a52cde5fefb74cb87464c1346e3d08431 100644 (file)
@@ -130,13 +130,14 @@ struct thread;
  */
 #define __map__for_each_symbol_by_name(map, sym_name, pos)     \
        for (pos = map__find_symbol_by_name(map, sym_name);     \
-            pos && arch__compare_symbol_names(pos->name, sym_name) == 0;       \
+            pos &&                                             \
+            !symbol__match_symbol_name(pos->name, sym_name,    \
+                                       SYMBOL_TAG_INCLUDE__DEFAULT_ONLY); \
             pos = symbol__next_by_name(pos))
 
 #define map__for_each_symbol_by_name(map, sym_name, pos)               \
        __map__for_each_symbol_by_name(map, sym_name, (pos))
 
-int arch__compare_symbol_names(const char *namea, const char *nameb);
 void map__init(struct map *map, enum map_type type,
               u64 start, u64 end, u64 pgoff, struct dso *dso);
 struct map *map__new(struct machine *machine, u64 start, u64 len,
diff --git a/tools/perf/util/memswap.c b/tools/perf/util/memswap.c
new file mode 100644 (file)
index 0000000..55f7faa
--- /dev/null
@@ -0,0 +1,24 @@
+#include <byteswap.h>
+#include "memswap.h"
+#include <linux/types.h>
+
+void mem_bswap_32(void *src, int byte_size)
+{
+       u32 *m = src;
+       while (byte_size > 0) {
+               *m = bswap_32(*m);
+               byte_size -= sizeof(u32);
+               ++m;
+       }
+}
+
+void mem_bswap_64(void *src, int byte_size)
+{
+       u64 *m = src;
+
+       while (byte_size > 0) {
+               *m = bswap_64(*m);
+               byte_size -= sizeof(u64);
+               ++m;
+       }
+}
diff --git a/tools/perf/util/memswap.h b/tools/perf/util/memswap.h
new file mode 100644 (file)
index 0000000..7d1b1c3
--- /dev/null
@@ -0,0 +1,7 @@
+#ifndef PERF_MEMSWAP_H_
+#define PERF_MEMSWAP_H_
+
+void mem_bswap_64(void *src, int byte_size);
+void mem_bswap_32(void *src, int byte_size);
+
+#endif /* PERF_MEMSWAP_H_ */
index 2b12bdb3ce33d0fbc9b8d5387fc5323153511b6e..7b79c413486b3a6ef8b0f6c32e330911c5ce7638 100644 (file)
@@ -28,7 +28,9 @@
 #include <linux/bitmap.h>
 #include <linux/time64.h>
 
-#include "../util.h"
+#include <stdbool.h>
+/* perl needs the following define, right after including stdbool.h */
+#define HAS_BOOL
 #include <EXTERN.h>
 #include <perl.h>
 
index 3041c6b9819152cdd8ad5e856c735d2c7073d903..7dc1096264c575cbbd1cd41d07f041585a997453 100644 (file)
@@ -11,6 +11,7 @@
 
 #include "evlist.h"
 #include "evsel.h"
+#include "memswap.h"
 #include "session.h"
 #include "tool.h"
 #include "sort.h"
index e91b5e86f0274c0cb3d9e5c44df5d2513e2564f5..aafe908b82b5720b4487c242370ed326ec520e2c 100644 (file)
@@ -3,15 +3,6 @@
 #include <linux/kernel.h>
 #include <errno.h>
 
-int prefixcmp(const char *str, const char *prefix)
-{
-       for (; ; str++, prefix++)
-               if (!*prefix)
-                       return 0;
-               else if (*str != *prefix)
-                       return (unsigned char)*prefix - (unsigned char)*str;
-}
-
 /*
  * Used as the default ->buf value, so that people can always assume
  * buf is non NULL and ->buf is NUL terminated even for a freshly
index 2cb7665e99739932e6d9330754f6fb8c67aa0c24..8f2b068ff7564900c989d1cdec96757c1b3ab45b 100644 (file)
@@ -90,6 +90,17 @@ static int prefix_underscores_count(const char *str)
        return tail - str;
 }
 
+int __weak arch__compare_symbol_names(const char *namea, const char *nameb)
+{
+       return strcmp(namea, nameb);
+}
+
+int __weak arch__compare_symbol_names_n(const char *namea, const char *nameb,
+                                       unsigned int n)
+{
+       return strncmp(namea, nameb, n);
+}
+
 int __weak arch__choose_best_symbol(struct symbol *syma,
                                    struct symbol *symb __maybe_unused)
 {
@@ -399,8 +410,26 @@ static void symbols__sort_by_name(struct rb_root *symbols,
        }
 }
 
+int symbol__match_symbol_name(const char *name, const char *str,
+                             enum symbol_tag_include includes)
+{
+       const char *versioning;
+
+       if (includes == SYMBOL_TAG_INCLUDE__DEFAULT_ONLY &&
+           (versioning = strstr(name, "@@"))) {
+               int len = strlen(str);
+
+               if (len < versioning - name)
+                       len = versioning - name;
+
+               return arch__compare_symbol_names_n(name, str, len);
+       } else
+               return arch__compare_symbol_names(name, str);
+}
+
 static struct symbol *symbols__find_by_name(struct rb_root *symbols,
-                                           const char *name)
+                                           const char *name,
+                                           enum symbol_tag_include includes)
 {
        struct rb_node *n;
        struct symbol_name_rb_node *s = NULL;
@@ -414,11 +443,11 @@ static struct symbol *symbols__find_by_name(struct rb_root *symbols,
                int cmp;
 
                s = rb_entry(n, struct symbol_name_rb_node, rb_node);
-               cmp = arch__compare_symbol_names(name, s->sym.name);
+               cmp = symbol__match_symbol_name(s->sym.name, name, includes);
 
-               if (cmp < 0)
+               if (cmp > 0)
                        n = n->rb_left;
-               else if (cmp > 0)
+               else if (cmp < 0)
                        n = n->rb_right;
                else
                        break;
@@ -427,16 +456,17 @@ static struct symbol *symbols__find_by_name(struct rb_root *symbols,
        if (n == NULL)
                return NULL;
 
-       /* return first symbol that has same name (if any) */
-       for (n = rb_prev(n); n; n = rb_prev(n)) {
-               struct symbol_name_rb_node *tmp;
+       if (includes != SYMBOL_TAG_INCLUDE__DEFAULT_ONLY)
+               /* return first symbol that has same name (if any) */
+               for (n = rb_prev(n); n; n = rb_prev(n)) {
+                       struct symbol_name_rb_node *tmp;
 
-               tmp = rb_entry(n, struct symbol_name_rb_node, rb_node);
-               if (arch__compare_symbol_names(tmp->sym.name, s->sym.name))
-                       break;
+                       tmp = rb_entry(n, struct symbol_name_rb_node, rb_node);
+                       if (arch__compare_symbol_names(tmp->sym.name, s->sym.name))
+                               break;
 
-               s = tmp;
-       }
+                       s = tmp;
+               }
 
        return &s->sym;
 }
@@ -466,7 +496,7 @@ void dso__insert_symbol(struct dso *dso, enum map_type type, struct symbol *sym)
 struct symbol *dso__find_symbol(struct dso *dso,
                                enum map_type type, u64 addr)
 {
-       if (dso->last_find_result[type].addr != addr) {
+       if (dso->last_find_result[type].addr != addr || dso->last_find_result[type].symbol == NULL) {
                dso->last_find_result[type].addr   = addr;
                dso->last_find_result[type].symbol = symbols__find(&dso->symbols[type], addr);
        }
@@ -503,7 +533,12 @@ struct symbol *symbol__next_by_name(struct symbol *sym)
 struct symbol *dso__find_symbol_by_name(struct dso *dso, enum map_type type,
                                        const char *name)
 {
-       return symbols__find_by_name(&dso->symbol_names[type], name);
+       struct symbol *s = symbols__find_by_name(&dso->symbol_names[type], name,
+                                                SYMBOL_TAG_INCLUDE__NONE);
+       if (!s)
+               s = symbols__find_by_name(&dso->symbol_names[type], name,
+                                         SYMBOL_TAG_INCLUDE__DEFAULT_ONLY);
+       return s;
 }
 
 void dso__sort_by_name(struct dso *dso, enum map_type type)
@@ -1075,8 +1110,9 @@ static int validate_kcore_addresses(const char *kallsyms_filename,
        if (kmap->ref_reloc_sym && kmap->ref_reloc_sym->name) {
                u64 start;
 
-               start = kallsyms__get_function_start(kallsyms_filename,
-                                                    kmap->ref_reloc_sym->name);
+               if (kallsyms__get_function_start(kallsyms_filename,
+                                                kmap->ref_reloc_sym->name, &start))
+                       return -ENOENT;
                if (start != kmap->ref_reloc_sym->addr)
                        return -EINVAL;
        }
@@ -1248,9 +1284,7 @@ static int kallsyms__delta(struct map *map, const char *filename, u64 *delta)
        if (!kmap->ref_reloc_sym || !kmap->ref_reloc_sym->name)
                return 0;
 
-       addr = kallsyms__get_function_start(filename,
-                                           kmap->ref_reloc_sym->name);
-       if (!addr)
+       if (kallsyms__get_function_start(filename, kmap->ref_reloc_sym->name, &addr))
                return -1;
 
        *delta = addr - kmap->ref_reloc_sym->addr;
index 7acd70fce68ef1ca7ecb6149a971184c6686dc5a..41ebba9a2eb2f3849635daf67125a851ff717d95 100644 (file)
@@ -348,8 +348,19 @@ void arch__sym_update(struct symbol *s, GElf_Sym *sym);
 #define SYMBOL_A 0
 #define SYMBOL_B 1
 
+int arch__compare_symbol_names(const char *namea, const char *nameb);
+int arch__compare_symbol_names_n(const char *namea, const char *nameb,
+                                unsigned int n);
 int arch__choose_best_symbol(struct symbol *syma, struct symbol *symb);
 
+enum symbol_tag_include {
+       SYMBOL_TAG_INCLUDE__NONE = 0,
+       SYMBOL_TAG_INCLUDE__DEFAULT_ONLY
+};
+
+int symbol__match_symbol_name(const char *namea, const char *nameb,
+                             enum symbol_tag_include includes);
+
 /* structure containing an SDT note's info */
 struct sdt_note {
        char *name;                     /* name of the note*/
index f6a2a3d117d5857143ccc92508d370d8c32c64a0..4767ec2c5ef63cefbb03464fd244002ae6f5d54e 100644 (file)
@@ -1,8 +1,37 @@
 #include "units.h"
 #include <inttypes.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
 #include <linux/kernel.h>
 #include <linux/time64.h>
 
+unsigned long parse_tag_value(const char *str, struct parse_tag *tags)
+{
+       struct parse_tag *i = tags;
+
+       while (i->tag) {
+               char *s = strchr(str, i->tag);
+
+               if (s) {
+                       unsigned long int value;
+                       char *endptr;
+
+                       value = strtoul(str, &endptr, 10);
+                       if (s != endptr)
+                               break;
+
+                       if (value > ULONG_MAX / i->mult)
+                               break;
+                       value *= i->mult;
+                       return value;
+               }
+               i++;
+       }
+
+       return (unsigned long) -1;
+}
+
 unsigned long convert_unit(unsigned long value, char *unit)
 {
        *unit = ' ';
index 3ed7774afaa98b93f168659535f77eeacb4080b7..f02c87317150e0d5f50296b33bb29fd96b6b9edb 100644 (file)
@@ -4,6 +4,13 @@
 #include <stddef.h>
 #include <linux/types.h>
 
+struct parse_tag {
+       char tag;
+       int  mult;
+};
+
+unsigned long parse_tag_value(const char *str, struct parse_tag *tags);
+
 unsigned long convert_unit(unsigned long value, char *unit);
 int unit_number__scnprintf(char *buf, size_t size, u64 n);
 
index 6450c75a6f5b40bc28e9fe5f98cb98960cec1d10..28c9f335006c962a5df924e30d9a45687775c201 100644 (file)
@@ -13,7 +13,6 @@
 #include <string.h>
 #include <errno.h>
 #include <limits.h>
-#include <byteswap.h>
 #include <linux/kernel.h>
 #include <linux/log2.h>
 #include <linux/time64.h>
@@ -335,33 +334,6 @@ int hex2u64(const char *ptr, u64 *long_val)
        return p - ptr;
 }
 
-unsigned long parse_tag_value(const char *str, struct parse_tag *tags)
-{
-       struct parse_tag *i = tags;
-
-       while (i->tag) {
-               char *s;
-
-               s = strchr(str, i->tag);
-               if (s) {
-                       unsigned long int value;
-                       char *endptr;
-
-                       value = strtoul(str, &endptr, 10);
-                       if (s != endptr)
-                               break;
-
-                       if (value > ULONG_MAX / i->mult)
-                               break;
-                       value *= i->mult;
-                       return value;
-               }
-               i++;
-       }
-
-       return (unsigned long) -1;
-}
-
 int perf_event_paranoid(void)
 {
        int value;
@@ -372,27 +344,6 @@ int perf_event_paranoid(void)
        return value;
 }
 
-void mem_bswap_32(void *src, int byte_size)
-{
-       u32 *m = src;
-       while (byte_size > 0) {
-               *m = bswap_32(*m);
-               byte_size -= sizeof(u32);
-               ++m;
-       }
-}
-
-void mem_bswap_64(void *src, int byte_size)
-{
-       u64 *m = src;
-
-       while (byte_size > 0) {
-               *m = bswap_64(*m);
-               byte_size -= sizeof(u64);
-               ++m;
-       }
-}
-
 bool find_process(const char *name)
 {
        size_t len = strlen(name);
index 3852b6d3270a06067560d3f854aa29c8289854b8..5dfb9bb6482d3103d494a9234fef50b308b3d7ef 100644 (file)
@@ -5,7 +5,6 @@
 #define _BSD_SOURCE 1
 /* glibc 2.20 deprecates _BSD_SOURCE in favour of _DEFAULT_SOURCE */
 #define _DEFAULT_SOURCE 1
-#define HAS_BOOL
 
 #include <fcntl.h>
 #include <stdbool.h>
@@ -14,8 +13,6 @@
 #include <stdarg.h>
 #include <linux/types.h>
 
-extern char buildid_dir[];
-
 #ifdef __GNUC__
 #define NORETURN __attribute__((__noreturn__))
 #else
@@ -25,8 +22,6 @@ extern char buildid_dir[];
 #endif
 #endif
 
-#define PERF_GTK_DSO  "libperf-gtk.so"
-
 /* General helper functions */
 void usage(const char *err) NORETURN;
 void die(const char *err, ...) NORETURN __attribute__((format (printf, 1, 2)));
@@ -35,9 +30,6 @@ void warning(const char *err, ...) __attribute__((format (printf, 1, 2)));
 
 void set_warning_routine(void (*routine)(const char *err, va_list params));
 
-int prefixcmp(const char *str, const char *prefix);
-void set_buildid_dir(const char *dir);
-
 static inline void *zalloc(size_t size)
 {
        return calloc(1, size);
@@ -59,29 +51,11 @@ int copyfile_offset(int fromfd, loff_t from_ofs, int tofd, loff_t to_ofs, u64 si
 ssize_t readn(int fd, void *buf, size_t n);
 ssize_t writen(int fd, void *buf, size_t n);
 
-struct perf_event_attr;
-
-void event_attr_init(struct perf_event_attr *attr);
-
 size_t hex_width(u64 v);
 int hex2u64(const char *ptr, u64 *val);
 
 extern unsigned int page_size;
 extern int cacheline_size;
-extern int sysctl_perf_event_max_stack;
-extern int sysctl_perf_event_max_contexts_per_stack;
-
-struct parse_tag {
-       char tag;
-       int mult;
-};
-
-unsigned long parse_tag_value(const char *str, struct parse_tag *tags);
-
-int perf_event_paranoid(void);
-
-void mem_bswap_64(void *src, int byte_size);
-void mem_bswap_32(void *src, int byte_size);
 
 bool find_process(const char *name);