From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753416AbbIKQA0 (ORCPT ); Fri, 11 Sep 2015 12:00:26 -0400 Received: from mga14.intel.com ([192.55.52.115]:8093 "EHLO mga14.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750958AbbIKQAX (ORCPT ); Fri, 11 Sep 2015 12:00:23 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.17,511,1437462000"; d="scan'208";a="559869914" From: Alexander Shishkin To: Peter Zijlstra , Ingo Molnar Cc: linux-kernel@vger.kernel.org, vince@deater.net, eranian@google.com, johannes@sipsolutions.net, Arnaldo Carvalho de Melo , Alexander Shishkin Subject: [PATCH RFC v3 2/6] perf: Use extended syscall error reporting Date: Fri, 11 Sep 2015 19:00:01 +0300 Message-Id: <1441987205-4021-3-git-send-email-alexander.shishkin@linux.intel.com> X-Mailer: git-send-email 2.5.1 In-Reply-To: <1441987205-4021-1-git-send-email-alexander.shishkin@linux.intel.com> References: <1441987205-4021-1-git-send-email-alexander.shishkin@linux.intel.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch makes use of the extended syscall error reporting infrastructure to relay error messages that result from perf_event_open() attribute validation. On top of the default error report bits, it also transfers the name of the attribute field that triggered the error. Signed-off-by: Alexander Shishkin --- include/linux/perf_event.h | 14 ++++++++++++++ kernel/events/core.c | 17 ++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 2027809433..eb63074012 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -16,6 +16,20 @@ #include +#include + +struct perf_ext_err_site { + struct ext_err_site site; + const char *attr_field; +}; + +#define perf_err(__c, __a, __m) \ + ({ /* make sure it's a real field before stringifying it */ \ + struct perf_event_attr __x; (void)__x.__a; \ + ext_err(perf, __c, __m, \ + .attr_field = __stringify(__a)); \ + }) + /* * Kernel-internal data types and definitions: */ diff --git a/kernel/events/core.c b/kernel/events/core.c index ae16867670..a714f0602b 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -9,6 +9,8 @@ * For licensing details see kernel-base/COPYING */ +#define EXTERR_MODNAME "perf" + #include #include #include @@ -44,11 +46,24 @@ #include #include #include +#include #include "internal.h" #include +static char *perf_exterr_format(void *site) +{ + struct perf_ext_err_site *psite = site; + char *output; + + output = kasprintf(GFP_KERNEL, "\t\"attr_field\": \"%s\"\n", + psite->attr_field); + return output; +} + +DECLARE_EXTERR_DOMAIN(perf, perf_exterr_format); + static struct workqueue_struct *perf_wq; typedef int (*remote_function_f)(void *); @@ -8352,7 +8367,7 @@ err_group_fd: fdput(group); err_fd: put_unused_fd(event_fd); - return err; + return ext_err_errno(err); } /** -- 2.5.1