diff options
Diffstat (limited to 'src/perf/perf.cpp')
-rw-r--r-- | src/perf/perf.cpp | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/src/perf/perf.cpp b/src/perf/perf.cpp index e919741..b176256 100644 --- a/src/perf/perf.cpp +++ b/src/perf/perf.cpp @@ -26,6 +26,7 @@ #include <iostream> #include <fstream> +#include <errno.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> @@ -72,6 +73,7 @@ void perf_event::create_perf_event(char *eventname, int _cpu) { struct perf_event_attr attr; int ret; + int err; struct { __u64 count; @@ -107,10 +109,15 @@ void perf_event::create_perf_event(char *eventname, int _cpu) perf_fd = sys_perf_event_open(&attr, -1, _cpu, -1, 0); if (perf_fd < 0) { + err = errno; reset_display(); - fprintf(stderr, _("PowerTOP %s needs the kernel to support the 'perf' subsystem\n"), POWERTOP_VERSION); - fprintf(stderr, _("as well as support for trace points in the kernel:\n")); - fprintf(stderr, "CONFIG_PERF_EVENTS=y\nCONFIG_PERF_COUNTERS=y\nCONFIG_TRACEPOINTS=y\nCONFIG_TRACING=y\n"); + if (err == EMFILE) + fprintf(stderr, _("Too many open files, please increase the limit of open file descriptors.\n")); + else { + fprintf(stderr, _("PowerTOP %s needs the kernel to support the 'perf' subsystem\n"), POWERTOP_VERSION); + fprintf(stderr, _("as well as support for trace points in the kernel:\n")); + fprintf(stderr, "CONFIG_PERF_EVENTS=y\nCONFIG_PERF_COUNTERS=y\nCONFIG_TRACEPOINTS=y\nCONFIG_TRACING=y\n"); + } exit(EXIT_FAILURE); } if (read(perf_fd, &read_data, sizeof(read_data)) == -1) { |