Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752481AbbBSACI (ORCPT ); Wed, 18 Feb 2015 19:02:08 -0500 Received: from aserp1040.oracle.com ([141.146.126.69]:28611 "EHLO aserp1040.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751382AbbBSACF (ORCPT ); Wed, 18 Feb 2015 19:02:05 -0500 From: David Ahern To: acme@kernel.org, linux-kernel@vger.kernel.org Cc: David Ahern , Adrian Hunter Subject: [PATCH] perf: Fix probing for PERF_FLAG_FD_CLOEXEC flag Date: Wed, 18 Feb 2015 19:01:12 -0500 Message-Id: <1424304072-91955-1-git-send-email-david.ahern@oracle.com> X-Mailer: git-send-email 1.7.1 X-Source-IP: aserv0022.oracle.com [141.146.126.234] Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2106 Lines: 63 Commit f6edb53c4993ffe92ce521fb449d1c146cea6ec2 converted the probe to a CPU wide event first (pid == -1). For kernels that do not support the PERF_FLAG_FD_CLOEXEC flag the probe fails with EINVAL. Since this errno is not handled pid is not reset to 0 and the subsequent use of pid = -1 as an argument brings in an additional failure path if perf_event_paranoid > 0: $ perf record -- sleep 1 perf_event_open(..., 0) failed unexpectedly with error 13 (Permission denied) [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.007 MB /tmp/perf.data (11 samples) ] Since this function only needs to get past this check in kernel/events/core.c: /* for future expandability... */ if (flags & ~PERF_FLAG_ALL) return -EINVAL; pid = 0 is sufficient to confirm if the flag is supported or not. Also, ensure the fd of the confirmation check is closed. Needs to go to 3.18 stable tree as well. Signed-off-by: David Ahern Cc: Adrian Hunter --- tools/perf/util/cloexec.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tools/perf/util/cloexec.c b/tools/perf/util/cloexec.c index 47b78b3f0325..3cc34edf2403 100644 --- a/tools/perf/util/cloexec.c +++ b/tools/perf/util/cloexec.c @@ -47,16 +47,17 @@ static int perf_flag_probe(void) err, strerror_r(err, sbuf, sizeof(sbuf))); /* not supported, confirm error related to PERF_FLAG_FD_CLOEXEC */ - fd = sys_perf_event_open(&attr, pid, cpu, -1, 0); + fd = sys_perf_event_open(&attr, 0, cpu, -1, 0); err = errno; + if (fd >= 0) + close(fd); + if (WARN_ONCE(fd < 0 && err != EBUSY, "perf_event_open(..., 0) failed unexpectedly with error %d (%s)\n", err, strerror_r(err, sbuf, sizeof(sbuf)))) return -1; - close(fd); - return 0; } -- 1.9.3 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/