From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ingo Molnar <mingo@kernel.org>,
Johannes Berg <johannes@sipsolutions.net>,
Linus Torvalds <torvalds@linux-foundation.org>,
Thomas Gleixner <tglx@linutronix.de>,
adrian.hunter@intel.com, Ingo Molnar <mingo@redhat.com>,
Borislav Petkov <bp@alien8.de>, Vince Weaver <vince@deater.net>,
linux-kernel@vger.kernel.org,
Andrew Morton <akpm@linux-foundation.org>,
Peter Zijlstra <a.p.zijlstra@chello.nl>,
"H. Peter Anvin" <hpa@zytor.com>,
Stephane Eranian <eranian@google.com>
Subject: Re: [PATCH v2 0/6] perf: Introduce extended syscall error reporting
Date: Wed, 26 Aug 2015 17:58:23 -0300 [thread overview]
Message-ID: <20150826205823.GB1139@kernel.org> (raw)
In-Reply-To: <87r3mqgf8w.fsf@ashishki-desk.ger.corp.intel.com>
Em Wed, Aug 26, 2015 at 07:56:47PM +0300, Alexander Shishkin escreveu:
> Ingo Molnar <mingo@kernel.org> writes:
>
> > * Ingo Molnar <mingo@kernel.org> wrote:
> >
> >> ... but back then I didn't feel like complicating an error recovery ABI for the
> >> needs of the 1%, robust error handling is all about simplicity: if it's not
> >> simple, tools won't use it.
> >
> > And note that it needs to be 'simple' in two places for usage to grow naturally:
> >
> > - the usage site in the kernel
> > - the tooling side that recovers the information.
> >
> > That's why I think that such a form:
> >
> > return err_str(-EINVAL, "x86/perf: CPU does not support precise sampling");
> >
> > is obviously simple on the kernel side as it returns -EINVAL, and is very simple
> > on the tooling side as well, if we are allowed to extend prctl().
>
> So I hacked stuff a bit [1] to accomodate some of the above
> ideas. The below diff shows how these ideas integrate with perf. The
> rest is in my github tree.
>
> - this exterr implementation allows its users to add arbitrary
> information to the call site structures and also pretty print them on
> the way out; in the example, perf stores perf_event_attr field name
> that is the source of trouble; it's a string rather than offsetof(),
> because half of our event attribute is a bit field;
> - the "way out" doesn't have to be syscall return path (although in the
> example it is);
> - userspace can fetch the extended error reports via prctl() like you
> suggested above;
> - error codes are still passed around in the [-EXT_ERRNO..-MAX_ERRNO]
> range until they are passed to userspace (which is where ext_err_code()
> converts them back to traditional errno.h values).
Hey, can we see the builtin-record.c patch please?
- Arnaldo
> # perf record -e branches -c1 ls
> kernel says (0/95): {
> "file": "/home/ash/work/linux/arch/x86/kernel/cpu/perf_event.c",
> "line": 432,
> "code": -95,
> "module": "perf/x86",
> "message": "BTS sampling not allowed for kernel space"
> , "attr_field": "exclude_kernel"
> }
>
> Error:
> No hardware sampling interrupt available.
> No APIC? If so then you can boot the kernel with the "lapic" boot parameter to force-enable it.
> #
>
> [1] https://github.com/virtuoso/linux-perf/commits/exterr
>
> >From 1338fe417223cc1d8bc7588d95c6a913993d966f Mon Sep 17 00:00:00 2001
> From: Alexander Shishkin <alexander.shishkin@linux.intel.com>
> Date: Wed, 26 Aug 2015 18:36:14 +0300
> Subject: [PATCH] perf: Use extended syscall error reporting somewhat
>
> Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
> ---
> arch/x86/kernel/cpu/perf_event.c | 5 ++++-
> include/linux/perf_event.h | 14 ++++++++++++++
> kernel/events/core.c | 17 ++++++++++++++++-
> 3 files changed, 34 insertions(+), 2 deletions(-)
>
> diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c
> index f56cf074d0..5e8f2edb2c 100644
> --- a/arch/x86/kernel/cpu/perf_event.c
> +++ b/arch/x86/kernel/cpu/perf_event.c
> @@ -12,6 +12,8 @@
> * For licencing details see kernel-base/COPYING
> */
>
> +#define EXTERR_MODNAME "perf/x86"
> +
> #include <linux/perf_event.h>
> #include <linux/capability.h>
> #include <linux/notifier.h>
> @@ -426,7 +428,8 @@ int x86_setup_perfctr(struct perf_event *event)
>
> /* BTS is currently only allowed for user-mode. */
> if (!attr->exclude_kernel)
> - return -EOPNOTSUPP;
> + return perf_err(-EOPNOTSUPP, exclude_kernel,
> + "BTS sampling not allowed for kernel space");
>
> /* disallow bts if conflicting events are present */
> if (x86_add_exclusive(x86_lbr_exclusive_lbr))
> 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 <uapi/linux/perf_event.h>
>
> +#include <linux/exterr.h>
> +
> +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..5523c623c4 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 <linux/fs.h>
> #include <linux/mm.h>
> #include <linux/cpu.h>
> @@ -44,11 +46,24 @@
> #include <linux/compat.h>
> #include <linux/bpf.h>
> #include <linux/filter.h>
> +#include <linux/exterr.h>
>
> #include "internal.h"
>
> #include <asm/irq_regs.h>
>
> +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.0
next prev parent reply other threads:[~2015-08-26 20:58 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-08-24 14:32 [PATCH v2 0/6] perf: Introduce extended syscall error reporting Alexander Shishkin
2015-08-24 14:32 ` [PATCH v2 1/6] " Alexander Shishkin
2015-08-31 18:47 ` Andy Shevchenko
2015-09-01 6:38 ` Alexander Shishkin
2015-08-24 14:32 ` [PATCH v2 2/6] perf: Add file name and line number to perf extended error reports Alexander Shishkin
2015-08-24 14:32 ` [PATCH v2 3/6] perf: Annotate some of the error codes with perf_err() Alexander Shishkin
2015-08-24 14:32 ` [PATCH v2 4/6] perf/x86: " Alexander Shishkin
2015-08-24 14:32 ` [PATCH v2 5/6] perf/x86/intel/pt: Use extended error reporting in event initialization Alexander Shishkin
2015-08-24 14:33 ` [PATCH v2 6/6] perf/x86/intel/bts: " Alexander Shishkin
2015-08-25 8:22 ` [PATCH v2 0/6] perf: Introduce extended syscall error reporting Ingo Molnar
2015-08-25 8:52 ` Johannes Berg
2015-08-25 9:02 ` Ingo Molnar
2015-08-25 9:17 ` Ingo Molnar
2015-08-25 9:34 ` Johannes Berg
2015-08-25 10:07 ` Ingo Molnar
2015-08-25 10:19 ` Johannes Berg
2015-08-26 4:49 ` Ingo Molnar
[not found] ` <CA+55aFw--OFczoY=v17+e2-Q3O0GXnMKRuwzpYpB2qKBpZo=fw@mail.gmail.com>
2015-08-26 7:02 ` Ingo Molnar
2015-08-26 7:06 ` Johannes Berg
2015-08-26 7:20 ` Ingo Molnar
2015-08-26 7:26 ` Ingo Molnar
2015-08-26 16:56 ` Alexander Shishkin
2015-08-26 20:58 ` Arnaldo Carvalho de Melo [this message]
2015-09-11 16:11 ` Alexander Shishkin
2015-08-26 18:41 ` Andrew Morton
2015-08-26 20:05 ` Peter Zijlstra
2015-08-26 20:22 ` Andrew Morton
2015-08-26 20:50 ` Vince Weaver
2015-08-26 20:56 ` Andrew Morton
2015-08-26 21:14 ` Vince Weaver
2015-08-28 10:07 ` Ingo Molnar
2015-08-26 21:04 ` Arnaldo Carvalho de Melo
2015-08-26 7:36 ` Johannes Berg
2015-08-26 11:37 ` Alexander Shishkin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150826205823.GB1139@kernel.org \
--to=acme@kernel.org \
--cc=a.p.zijlstra@chello.nl \
--cc=adrian.hunter@intel.com \
--cc=akpm@linux-foundation.org \
--cc=alexander.shishkin@linux.intel.com \
--cc=bp@alien8.de \
--cc=eranian@google.com \
--cc=hpa@zytor.com \
--cc=johannes@sipsolutions.net \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=mingo@redhat.com \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
--cc=vince@deater.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.