diff options
author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2018-05-17 14:03:05 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2018-05-17 15:03:34 -0400 |
commit | 9ac94e31ca8c6311ec9eb68aea513e39ad809013 (patch) | |
tree | 352e30a3305522b1744c6c333ae497e119b9fac8 | |
parent | 6e1690c4c0b540930f08295b6a95c8660b257745 (diff) |
perf tools: Read the cache line size lazily
It is not read as commonly as 'page_size', so it makes sense to read it
lazily, caching its value when it is first read.
Less files open unconditionally at startup.
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Wang Nan <wangnan0@huawei.com>
Link: https://lkml.kernel.org/n/tip-35xhrq91u94uc1djtclek1ie@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r-- | tools/perf/perf.c | 11 | ||||
-rw-r--r-- | tools/perf/util/sort.c | 4 | ||||
-rw-r--r-- | tools/perf/util/sort.h | 4 | ||||
-rw-r--r-- | tools/perf/util/util.c | 21 | ||||
-rw-r--r-- | tools/perf/util/util.h | 2 |
5 files changed, 25 insertions, 17 deletions
diff --git a/tools/perf/perf.c b/tools/perf/perf.c index d5a0878de816..cefd8f74630c 100644 --- a/tools/perf/perf.c +++ b/tools/perf/perf.c | |||
@@ -421,16 +421,6 @@ void pthread__unblock_sigwinch(void) | |||
421 | pthread_sigmask(SIG_UNBLOCK, &set, NULL); | 421 | pthread_sigmask(SIG_UNBLOCK, &set, NULL); |
422 | } | 422 | } |
423 | 423 | ||
424 | #ifdef _SC_LEVEL1_DCACHE_LINESIZE | ||
425 | #define cache_line_size(cacheline_sizep) *cacheline_sizep = sysconf(_SC_LEVEL1_DCACHE_LINESIZE) | ||
426 | #else | ||
427 | static void cache_line_size(int *cacheline_sizep) | ||
428 | { | ||
429 | if (sysfs__read_int("devices/system/cpu/cpu0/cache/index0/coherency_line_size", cacheline_sizep)) | ||
430 | pr_debug("cannot determine cache line size"); | ||
431 | } | ||
432 | #endif | ||
433 | |||
434 | int main(int argc, const char **argv) | 424 | int main(int argc, const char **argv) |
435 | { | 425 | { |
436 | int err; | 426 | int err; |
@@ -444,7 +434,6 @@ int main(int argc, const char **argv) | |||
444 | 434 | ||
445 | /* The page_size is placed in util object. */ | 435 | /* The page_size is placed in util object. */ |
446 | page_size = sysconf(_SC_PAGE_SIZE); | 436 | page_size = sysconf(_SC_PAGE_SIZE); |
447 | cache_line_size(&cacheline_size); | ||
448 | 437 | ||
449 | if (sysctl__read_int("kernel/perf_event_max_stack", &value) == 0) | 438 | if (sysctl__read_int("kernel/perf_event_max_stack", &value) == 0) |
450 | sysctl_perf_event_max_stack = value; | 439 | sysctl_perf_event_max_stack = value; |
diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c index e65903a695a6..4058ade352a5 100644 --- a/tools/perf/util/sort.c +++ b/tools/perf/util/sort.c | |||
@@ -2582,7 +2582,7 @@ int sort_dimension__add(struct perf_hpp_list *list, const char *tok, | |||
2582 | if (sort__mode != SORT_MODE__MEMORY) | 2582 | if (sort__mode != SORT_MODE__MEMORY) |
2583 | return -EINVAL; | 2583 | return -EINVAL; |
2584 | 2584 | ||
2585 | if (sd->entry == &sort_mem_dcacheline && cacheline_size == 0) | 2585 | if (sd->entry == &sort_mem_dcacheline && cacheline_size() == 0) |
2586 | return -EINVAL; | 2586 | return -EINVAL; |
2587 | 2587 | ||
2588 | if (sd->entry == &sort_mem_daddr_sym) | 2588 | if (sd->entry == &sort_mem_daddr_sym) |
@@ -2628,7 +2628,7 @@ static int setup_sort_list(struct perf_hpp_list *list, char *str, | |||
2628 | if (*tok) { | 2628 | if (*tok) { |
2629 | ret = sort_dimension__add(list, tok, evlist, level); | 2629 | ret = sort_dimension__add(list, tok, evlist, level); |
2630 | if (ret == -EINVAL) { | 2630 | if (ret == -EINVAL) { |
2631 | if (!cacheline_size && !strncasecmp(tok, "dcacheline", strlen(tok))) | 2631 | if (!cacheline_size() && !strncasecmp(tok, "dcacheline", strlen(tok))) |
2632 | pr_err("The \"dcacheline\" --sort key needs to know the cacheline size and it couldn't be determined on this system"); | 2632 | pr_err("The \"dcacheline\" --sort key needs to know the cacheline size and it couldn't be determined on this system"); |
2633 | else | 2633 | else |
2634 | pr_err("Invalid --sort key: `%s'", tok); | 2634 | pr_err("Invalid --sort key: `%s'", tok); |
diff --git a/tools/perf/util/sort.h b/tools/perf/util/sort.h index 035b62e2c60b..9e6896293bbd 100644 --- a/tools/perf/util/sort.h +++ b/tools/perf/util/sort.h | |||
@@ -186,13 +186,13 @@ static inline float hist_entry__get_percent_limit(struct hist_entry *he) | |||
186 | static inline u64 cl_address(u64 address) | 186 | static inline u64 cl_address(u64 address) |
187 | { | 187 | { |
188 | /* return the cacheline of the address */ | 188 | /* return the cacheline of the address */ |
189 | return (address & ~(cacheline_size - 1)); | 189 | return (address & ~(cacheline_size() - 1)); |
190 | } | 190 | } |
191 | 191 | ||
192 | static inline u64 cl_offset(u64 address) | 192 | static inline u64 cl_offset(u64 address) |
193 | { | 193 | { |
194 | /* return the cacheline of the address */ | 194 | /* return the cacheline of the address */ |
195 | return (address & (cacheline_size - 1)); | 195 | return (address & (cacheline_size() - 1)); |
196 | } | 196 | } |
197 | 197 | ||
198 | enum sort_mode { | 198 | enum sort_mode { |
diff --git a/tools/perf/util/util.c b/tools/perf/util/util.c index 1019bbc5dbd8..99ab52165680 100644 --- a/tools/perf/util/util.c +++ b/tools/perf/util/util.c | |||
@@ -38,7 +38,26 @@ void perf_set_multithreaded(void) | |||
38 | } | 38 | } |
39 | 39 | ||
40 | unsigned int page_size; | 40 | unsigned int page_size; |
41 | int cacheline_size; | 41 | |
42 | #ifdef _SC_LEVEL1_DCACHE_LINESIZE | ||
43 | #define cache_line_size(cacheline_sizep) *cacheline_sizep = sysconf(_SC_LEVEL1_DCACHE_LINESIZE) | ||
44 | #else | ||
45 | static void cache_line_size(int *cacheline_sizep) | ||
46 | { | ||
47 | if (sysfs__read_int("devices/system/cpu/cpu0/cache/index0/coherency_line_size", cacheline_sizep)) | ||
48 | pr_debug("cannot determine cache line size"); | ||
49 | } | ||
50 | #endif | ||
51 | |||
52 | int cacheline_size(void) | ||
53 | { | ||
54 | static int size; | ||
55 | |||
56 | if (!size) | ||
57 | cache_line_size(&size); | ||
58 | |||
59 | return size; | ||
60 | } | ||
42 | 61 | ||
43 | int sysctl_perf_event_max_stack = PERF_MAX_STACK_DEPTH; | 62 | int sysctl_perf_event_max_stack = PERF_MAX_STACK_DEPTH; |
44 | int sysctl_perf_event_max_contexts_per_stack = PERF_MAX_CONTEXTS_PER_STACK; | 63 | int sysctl_perf_event_max_contexts_per_stack = PERF_MAX_CONTEXTS_PER_STACK; |
diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h index c9626c206208..74d21dfe0d29 100644 --- a/tools/perf/util/util.h +++ b/tools/perf/util/util.h | |||
@@ -43,7 +43,7 @@ size_t hex_width(u64 v); | |||
43 | int hex2u64(const char *ptr, u64 *val); | 43 | int hex2u64(const char *ptr, u64 *val); |
44 | 44 | ||
45 | extern unsigned int page_size; | 45 | extern unsigned int page_size; |
46 | extern int cacheline_size; | 46 | int __pure cacheline_size(void); |
47 | 47 | ||
48 | int fetch_kernel_version(unsigned int *puint, | 48 | int fetch_kernel_version(unsigned int *puint, |
49 | char *str, size_t str_sz); | 49 | char *str, size_t str_sz); |