const char *sysfs = sysfs__mountpoint();
        DIR *caps_dir;
        struct dirent *evt_ent;
-       int nr_caps = 0;
+
+       if (pmu->caps_initialized)
+               return pmu->nr_caps;
+
+       pmu->nr_caps = 0;
 
        if (!sysfs)
                return -1;
        snprintf(caps_path, PATH_MAX,
                 "%s" EVENT_SOURCE_DEVICE_PATH "%s/caps", sysfs, pmu->name);
 
-       if (stat(caps_path, &st) < 0)
+       if (stat(caps_path, &st) < 0) {
+               pmu->caps_initialized = true;
                return 0;       /* no error if caps does not exist */
+       }
 
        caps_dir = opendir(caps_path);
        if (!caps_dir)
                        continue;
                }
 
-               nr_caps++;
+               pmu->nr_caps++;
                fclose(file);
        }
 
        closedir(caps_dir);
 
-       return nr_caps;
+       pmu->caps_initialized = true;
+       return pmu->nr_caps;
 }
 
 void perf_pmu__warn_invalid_config(struct perf_pmu *pmu, __u64 config,
 
        struct perf_cpu_map *cpus;
        struct list_head format;  /* HEAD struct perf_pmu_format -> list */
        struct list_head aliases; /* HEAD struct perf_pmu_alias -> list */
+       bool caps_initialized;
+       u32 nr_caps;
        struct list_head caps;    /* HEAD struct perf_pmu_caps -> list */
        struct list_head list;    /* ELEM */
        struct list_head hybrid_list;