···1919The perf c2c tool provides means for Shared Data C2C/HITM analysis. It allows2020you to track down the cacheline contentions.21212222-The tool is based on x86's load latency and precise store facility events2323-provided by Intel CPUs. These events provide:2222+On x86, the tool is based on load latency and precise store facility events2323+provided by Intel CPUs. On PowerPC, the tool uses random instruction sampling2424+with thresholding feature.2525+2626+These events provide:2427 - memory address of the access2528 - type of the access (load and store details)2629 - latency (in cycles) of the load access···49465047-l::5148--ldlat::5252- Configure mem-loads latency.4949+ Configure mem-loads latency. (x86 only)53505451-k::5552--all-kernel::···122119 -W,-d,--phys-data,--sample-cpu123120124121Unless specified otherwise with '-e' option, following events are monitored by125125-default:122122+default on x86:126123127124 cpu/mem-loads,ldlat=30/P128125 cpu/mem-stores/P126126+127127+and following on PowerPC:128128+129129+ cpu/mem-loads/130130+ cpu/mem-stores/129131130132User can pass any 'perf record' option behind '--' mark, like (to enable131133callchains and system wide monitoring):
+1-1
tools/perf/Documentation/perf-mem.txt
···8282 Be more verbose (show counter open errors, etc)83838484--ldlat <n>::8585- Specify desired latency for loads event.8585+ Specify desired latency for loads event. (x86 only)86868787In addition, for report all perf report options are valid, and for record8888all perf record options.
···11+// SPDX-License-Identifier: GPL-2.022+#include "mem-events.h"33+44+/* PowerPC does not support 'ldlat' parameter. */55+char *perf_mem_events__name(int i)66+{77+ if (i == PERF_MEM_EVENTS__LOAD)88+ return (char *) "cpu/mem-loads/";99+1010+ return (char *) "cpu/mem-stores/";1111+}
+18-7
tools/perf/builtin-trace.c
···2514251425152515static bool perf_evlist__add_vfs_getname(struct perf_evlist *evlist)25162516{25172517- struct perf_evsel *evsel = perf_evsel__newtp("probe", "vfs_getname");25172517+ bool found = false;25182518+ struct perf_evsel *evsel, *tmp;25192519+ struct parse_events_error err = { .idx = 0, };25202520+ int ret = parse_events(evlist, "probe:vfs_getname*", &err);2518252125192519- if (IS_ERR(evsel))25222522+ if (ret)25202523 return false;2521252425222522- if (perf_evsel__field(evsel, "pathname") == NULL) {25252525+ evlist__for_each_entry_safe(evlist, evsel, tmp) {25262526+ if (!strstarts(perf_evsel__name(evsel), "probe:vfs_getname"))25272527+ continue;25282528+25292529+ if (perf_evsel__field(evsel, "pathname")) {25302530+ evsel->handler = trace__vfs_getname;25312531+ found = true;25322532+ continue;25332533+ }25342534+25352535+ list_del_init(&evsel->node);25362536+ evsel->evlist = NULL;25232537 perf_evsel__delete(evsel);25242524- return false;25252538 }2526253925272527- evsel->handler = trace__vfs_getname;25282528- perf_evlist__add(evlist, evsel);25292529- return true;25402540+ return found;25302541}2531254225322543static struct perf_evsel *perf_evsel__new_pgfault(u64 config)
+1-1
tools/perf/tests/evsel-tp-sched.c
···1717 return -1;1818 }19192020- is_signed = !!(field->flags | TEP_FIELD_IS_SIGNED);2020+ is_signed = !!(field->flags & TEP_FIELD_IS_SIGNED);2121 if (should_be_signed && !is_signed) {2222 pr_debug("%s: \"%s\" signedness(%d) is wrong, should be %d\n",2323 evsel->name, name, is_signed, should_be_signed);