Unify perf_event type and config check
authorTeng Qin <qinteng@fb.com>
Sat, 20 May 2017 02:05:24 +0000 (19:05 -0700)
committerTeng Qin <qinteng@fb.com>
Sat, 20 May 2017 18:32:58 +0000 (11:32 -0700)
src/cc/libbpf.c

index d62275fd3c5ec212e37929bdf800c3928ac4b9d4..5bb453f841d32f963d01f03bfc7ab1e29a0a6a5b 100644 (file)
@@ -604,10 +604,32 @@ error:
   return NULL;
 }
 
+int invalid_perf_config(uint32_t type, uint64_t config) {
+  switch (type) {
+    case PERF_TYPE_HARDWARE:
+      return config >= PERF_COUNT_HW_MAX;
+    case PERF_TYPE_SOFTWARE:
+      return config >= PERF_COUNT_SW_MAX;
+    case PERF_TYPE_RAW:
+      return 0;
+    default:
+      return 1;
+  }
+}
+
 int bpf_open_perf_event(uint32_t type, uint64_t config, int pid, int cpu) {
   int fd;
   struct perf_event_attr attr = {};
 
+  if (type != PERF_TYPE_HARDWARE && type != PERF_TYPE_RAW) {
+    fprintf(stderr, "Unsupported perf event type\n");
+    return -1;
+  }
+  if (invalid_perf_config(type, config)) {
+    fprintf(stderr, "Invalid perf event config\n");
+    return -1;
+  }
+
   attr.sample_period = LONG_MAX;
   attr.type = type;
   attr.config = config;
@@ -733,8 +755,7 @@ int bpf_attach_perf_event(int progfd, uint32_t ev_type, uint32_t ev_config,
     fprintf(stderr, "Unsupported perf event type\n");
     return -1;
   }
-  if ((ev_type == PERF_TYPE_HARDWARE && ev_config >= PERF_COUNT_HW_MAX) ||
-      (ev_type == PERF_TYPE_SOFTWARE && ev_config >= PERF_COUNT_SW_MAX)) {
+  if (invalid_perf_config(ev_type, ev_config)) {
     fprintf(stderr, "Invalid perf event config\n");
     return -1;
   }