In case of failure, unrelated to PERF_FLAG_FD_CLOEXEC,
perf_flag_probe() reports the error twice. For example:

  $ perf record ls
  Error:
  perf_event_open(..., PERF_FLAG_FD_CLOEXEC) failed with unexpected error 16 
(Device or resource busy)
  perf_event_open(..., 0) failed unexpectedly with error 16 (Device or resource 
busy)

There's no need for the second error message, so this
patch changes the function to only report a second
error message when the two calls to perf_even_open(2)
fail with different error codes.

Cc: Adrian Hunter <[email protected]>
Cc: David Ahern <[email protected]>
Cc: Frederic Weisbecker <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Paul Mackerras <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Stephane Eranian <[email protected]>
Cc: William Cohen <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Reported-by: Jiri Olsa <[email protected]>
Signed-off-by: Yann Droneaud <[email protected]>
---
 tools/perf/util/cloexec.c | 25 +++++++++++++------------
 1 file changed, 13 insertions(+), 12 deletions(-)

diff --git a/tools/perf/util/cloexec.c b/tools/perf/util/cloexec.c
index be226d293c91..552528698566 100644
--- a/tools/perf/util/cloexec.c
+++ b/tools/perf/util/cloexec.c
@@ -26,7 +26,7 @@ static int perf_flag_probe(void)
                .exclude_kernel = 1,
        };
        int fd;
-       int err;
+       int err0, err1;
        int cpu;
        pid_t pid = -1;
        char sbuf[STRERR_BUFSIZE];
@@ -49,7 +49,7 @@ static int perf_flag_probe(void)
                }
                break;
        }
-       err = errno;
+       err0 = errno;
 
        if (fd >= 0) {
                close(fd);
@@ -57,12 +57,12 @@ static int perf_flag_probe(void)
        }
 
        /* ignore busy errors */
-       if (err == EBUSY)
+       if (err0 == EBUSY)
                return -1;
 
-       WARN_ONCE(err != EINVAL,
+       WARN_ONCE(err0 != EINVAL,
                  "perf_event_open(..., PERF_FLAG_FD_CLOEXEC) failed with 
unexpected error %d (%s)\n",
-                 err, strerror_r(err, sbuf, sizeof(sbuf)));
+                 err0, strerror_r(err0, sbuf, sizeof(sbuf)));
 
        /* not supported, confirm error related to PERF_FLAG_FD_CLOEXEC */
        while (1) {
@@ -73,17 +73,18 @@ static int perf_flag_probe(void)
                }
                break;
        }
-       err = errno;
+       err1 = errno;
 
-       if (fd >= 0)
+       if (fd >= 0) {
                close(fd);
+               return 0;
+       }
 
-       if (WARN_ONCE(fd < 0,
-                     "perf_event_open(..., 0) failed unexpectedly with error 
%d (%s)\n",
-                     err, strerror_r(err, sbuf, sizeof(sbuf))))
-               return -1;
+       WARN_ONCE(err0 != err1,
+                 "perf_event_open(..., 0) failed unexpectedly with error %d 
(%s)\n",
+                 err1, strerror_r(err1, sbuf, sizeof(sbuf)));
 
-       return 0;
+       return -1;
 }
 
 unsigned long perf_event_open_cloexec_flag(void)
-- 
2.4.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to