On 10/12/2020 18:27, John Garry wrote: >> Its unpublished, I'll send it to the tmp.perf/core branch now. > > I use cross-compile for arm64 to build, and it's ok. > > I notice that the failures are for architectures which don't have an > entry under pmu-events/arch, so maybe we're missing some 'weak' > definition of pmu_sys_event_tables. > > I'll check now. > Hi Arnaldo, Can you try this on top: ----8<----- From 201aa2cb7bc8723765afd84a5d3972248af0f0a1 Mon Sep 17 00:00:00 2001 From: John Garry Date: Thu, 10 Dec 2020 19:45:14 +0000 Subject: [PATCH] perf jevents: Add system events table for empty mapping For architectures which have no PMU event lists - like arm32 - an empty mapping table is printed. This is how the "pmu_events_map" symbol - referenced in util/pmu.c::perf_pmu__find_map() - is created for those architectures. Since pmu-events.c now includes a new table - "pmu_sys_event_tables" - which is also referenced from util/pmu.c, also add this for the empty mappings. Signed-off-by: John Garry diff --git a/tools/perf/pmu-events/jevents.c b/tools/perf/pmu-events/jevents.c index e930096ad713..28e20d9ec0f5 100644 --- a/tools/perf/pmu-events/jevents.c +++ b/tools/perf/pmu-events/jevents.c @@ -816,19 +816,30 @@ static void print_mapping_test_table(FILE *outfp) fprintf(outfp, "},\n"); } +static void print_system_event_mapping_table_prefix(FILE *outfp) +{ + fprintf(outfp, "\nstruct pmu_sys_events pmu_sys_event_tables[] = {"); +} + +static void print_system_event_mapping_table_suffix(FILE *outfp) +{ + fprintf(outfp, "\n\t{\n\t\t.table = 0\n\t},"); + + fprintf(outfp, "\n};\n"); +} + static int process_system_event_tables(FILE *outfp) { struct sys_event_table *sys_event_table; - fprintf(outfp, "\nstruct pmu_sys_events pmu_sys_event_tables[] = {"); + print_system_event_mapping_table_prefix(outfp); list_for_each_entry(sys_event_table, &sys_event_tables, list) { fprintf(outfp, "\n\t{\n\t\t.table = %s,\n\t},", sys_event_table->soc_id); } - fprintf(outfp, "\n\t{\n\t\t.table = 0\n\t},"); - fprintf(outfp, "\n};\n"); + print_system_event_mapping_table_suffix(outfp); return 0; } @@ -938,6 +949,9 @@ static void create_empty_mapping(const char *output_file) fprintf(outfp, "#include \"pmu-events/pmu-events.h\"\n"); print_mapping_table_prefix(outfp); print_mapping_table_suffix(outfp); + print_system_event_mapping_table_prefix(outfp); + print_system_event_mapping_table_suffix(outfp); + fclose(outfp); } ---->8---- Obviously I never tested building for one of test architectures which does not use PMU events - sorry! I'll review this more tomorrow. Thanks! > >> >> More results from testing: >> >>    59    13.57 ubuntu:16.04-x-arm            : FAIL >> arm-linux-gnueabihf-gcc (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.9) 5.4.0 >> 20160609 >> >> [perfbuilder@five ~]$ tail -20 dm.log/ubuntu\:16.04-x-arm >>    CC       /tmp/build/perf/util/expr.o >>    LD       /tmp/build/perf/util/intel-pt-decoder/perf-in.o >>    LD       /tmp/build/perf/util/perf-in.o >>    LD       /tmp/build/perf/perf-in.o >>    LINK     /tmp/build/perf/perf >> /tmp/build/perf/perf-in.o: In function `pmu_for_each_sys_event': >> /git/linux/tools/perf/util/pmu.c:816: undefined reference to >> `pmu_sys_event_tables' >> /git/linux/tools/perf/util/pmu.c:816: undefined reference to >> `pmu_sys_event_tables' >> /tmp/build/perf/perf-in.o: In function `pmu_add_sys_aliases': >> /git/linux/tools/perf/util/pmu.c:886: undefined reference to >> `pmu_sys_event_tables' >> /git/linux/tools/perf/util/pmu.c:886: undefined reference to >> `pmu_sys_event_tables' >> collect2: error: ld returned 1 exit status >> Makefile.perf:659: recipe for target '/tmp/build/perf/perf' failed >> make[2]: *** [/tmp/build/perf/perf] Error 1 >> Makefile.perf:232: recipe for target 'sub-make' failed >> make[1]: *** [sub-make] Error 2 >> Makefile:69: recipe for target 'all' failed >> make: *** [all] Error 2 >> make: Leaving directory '/git/linux/tools/perf' >> + exit 1