1 // SPDX-License-Identifier: GPL-2.0-only 2 // Copyright (C) 2019, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com> 3 4 #include "evswitch.h" 5 #include "evlist.h" 6 7 bool evswitch__discard(struct evswitch *evswitch, struct evsel *evsel) 8 { 9 if (evswitch->on && evswitch->discarding) { 10 if (evswitch->on != evsel) 11 return true; 12 13 evswitch->discarding = false; 14 15 if (!evswitch->show_on_off_events) 16 return true; 17 18 return false; 19 } 20 21 if (evswitch->off && !evswitch->discarding) { 22 if (evswitch->off != evsel) 23 return false; 24 25 evswitch->discarding = true; 26 27 if (!evswitch->show_on_off_events) 28 return true; 29 } 30 31 return false; 32 } 33 34 static int evswitch__fprintf_enoent(FILE *fp, const char *evtype, const char *evname) 35 { 36 int printed = fprintf(fp, "ERROR: switch-%s event not found (%s)\n", evtype, evname); 37 38 return printed += fprintf(fp, "HINT: use 'perf evlist' to see the available event names\n"); 39 } 40 41 int evswitch__init(struct evswitch *evswitch, struct evlist *evlist, FILE *fp) 42 { 43 if (evswitch->on_name) { 44 evswitch->on = evlist__find_evsel_by_str(evlist, evswitch->on_name); 45 if (evswitch->on == NULL) { 46 evswitch__fprintf_enoent(fp, "on", evswitch->on_name); 47 return -ENOENT; 48 } 49 evswitch->discarding = true; 50 } 51 52 if (evswitch->off_name) { 53 evswitch->off = evlist__find_evsel_by_str(evlist, evswitch->off_name); 54 if (evswitch->off == NULL) { 55 evswitch__fprintf_enoent(fp, "off", evswitch->off_name); 56 return -ENOENT; 57 } 58 } 59 60 return 0; 61 } 62