diff options
| -rw-r--r-- | tools/perf/util/cloexec.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/tools/perf/util/cloexec.c b/tools/perf/util/cloexec.c index 47b78b3f0325..6da965bdbc2c 100644 --- a/tools/perf/util/cloexec.c +++ b/tools/perf/util/cloexec.c | |||
| @@ -25,6 +25,10 @@ static int perf_flag_probe(void) | |||
| 25 | if (cpu < 0) | 25 | if (cpu < 0) |
| 26 | cpu = 0; | 26 | cpu = 0; |
| 27 | 27 | ||
| 28 | /* | ||
| 29 | * Using -1 for the pid is a workaround to avoid gratuitous jump label | ||
| 30 | * changes. | ||
| 31 | */ | ||
| 28 | while (1) { | 32 | while (1) { |
| 29 | /* check cloexec flag */ | 33 | /* check cloexec flag */ |
| 30 | fd = sys_perf_event_open(&attr, pid, cpu, -1, | 34 | fd = sys_perf_event_open(&attr, pid, cpu, -1, |
| @@ -47,16 +51,24 @@ static int perf_flag_probe(void) | |||
| 47 | err, strerror_r(err, sbuf, sizeof(sbuf))); | 51 | err, strerror_r(err, sbuf, sizeof(sbuf))); |
| 48 | 52 | ||
| 49 | /* not supported, confirm error related to PERF_FLAG_FD_CLOEXEC */ | 53 | /* not supported, confirm error related to PERF_FLAG_FD_CLOEXEC */ |
| 50 | fd = sys_perf_event_open(&attr, pid, cpu, -1, 0); | 54 | while (1) { |
| 55 | fd = sys_perf_event_open(&attr, pid, cpu, -1, 0); | ||
| 56 | if (fd < 0 && pid == -1 && errno == EACCES) { | ||
| 57 | pid = 0; | ||
| 58 | continue; | ||
| 59 | } | ||
| 60 | break; | ||
| 61 | } | ||
| 51 | err = errno; | 62 | err = errno; |
| 52 | 63 | ||
| 64 | if (fd >= 0) | ||
| 65 | close(fd); | ||
| 66 | |||
| 53 | if (WARN_ONCE(fd < 0 && err != EBUSY, | 67 | if (WARN_ONCE(fd < 0 && err != EBUSY, |
| 54 | "perf_event_open(..., 0) failed unexpectedly with error %d (%s)\n", | 68 | "perf_event_open(..., 0) failed unexpectedly with error %d (%s)\n", |
| 55 | err, strerror_r(err, sbuf, sizeof(sbuf)))) | 69 | err, strerror_r(err, sbuf, sizeof(sbuf)))) |
| 56 | return -1; | 70 | return -1; |
| 57 | 71 | ||
| 58 | close(fd); | ||
| 59 | |||
| 60 | return 0; | 72 | return 0; |
| 61 | } | 73 | } |
| 62 | 74 | ||
