LKML Archive on lore.kernel.org help / color / mirror / Atom feed
From: Frederic Weisbecker <frederic@kernel.org> To: LKML <linux-kernel@vger.kernel.org> Cc: Frederic Weisbecker <frederic@kernel.org>, Jiri Olsa <jolsa@redhat.com>, Namhyung Kim <namhyung@kernel.org>, Joel Fernandes <joel.opensrc@gmail.com>, Peter Zijlstra <peterz@infradead.org>, Linus Torvalds <torvalds@linux-foundation.org>, Yoshinori Sato <ysato@users.sourceforge.jp>, Benjamin Herrenschmidt <benh@kernel.crashing.org>, Catalin Marinas <catalin.marinas@arm.com>, Chris Zankel <chris@zankel.net>, Paul Mackerras <paulus@samba.org>, Thomas Gleixner <tglx@linutronix.de>, Will Deacon <will.deacon@arm.com>, Michael Ellerman <mpe@ellerman.id.au>, Rich Felker <dalias@libc.org>, Ingo Molnar <mingo@kernel.org>, Mark Rutland <mark.rutland@arm.com>, Alexander Shishkin <alexander.shishkin@linux.intel.com>, Andy Lutomirski <luto@kernel.org>, Arnaldo Carvalho de Melo <acme@kernel.org>, Max Filippov <jcmvbkbc@gmail.com> Subject: [PATCH 01/12] perf/breakpoint: Split attribute parse and commit Date: Sat, 19 May 2018 04:45:38 +0200 [thread overview] Message-ID: <1526697950-7091-2-git-send-email-frederic@kernel.org> (raw) In-Reply-To: <1526697950-7091-1-git-send-email-frederic@kernel.org> arch_validate_hwbkpt_settings() mixes up attribute check and commit into a single code entity. Therefore the validation may return an error due to incorrect atributes while still leaving halfway modified architecture breakpoint data. This is harmless when we deal with a new breakpoint but it becomes a problem when we modify an existing breakpoint. Split attribute parse and commit to fix that. The architecture is passed a "struct arch_hw_breakpoint" to fill on top of the new attr and the core takes care about copying the backend data once it's fully validated. The architectures then need to implement the new API. Reported-by: Linus Torvalds <torvalds@linux-foundation.org> Original-patch-by: Andy Lutomirski <luto@kernel.org> Signed-off-by: Frederic Weisbecker <frederic@kernel.org> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Andy Lutomirski <luto@kernel.org> Cc: Yoshinori Sato <ysato@users.sourceforge.jp> Cc: Rich Felker <dalias@libc.org> Cc: Ingo Molnar <mingo@kernel.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Will Deacon <will.deacon@arm.com> Cc: Mark Rutland <mark.rutland@arm.com> Cc: Max Filippov <jcmvbkbc@gmail.com> Cc: Chris Zankel <chris@zankel.net> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Arnaldo Carvalho de Melo <acme@kernel.org> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Joel Fernandes <joel.opensrc@gmail.com> --- kernel/events/hw_breakpoint.c | 57 +++++++++++++++++++++++++++++++------------ 1 file changed, 41 insertions(+), 16 deletions(-) diff --git a/kernel/events/hw_breakpoint.c b/kernel/events/hw_breakpoint.c index 6e28d28..51320c2 100644 --- a/kernel/events/hw_breakpoint.c +++ b/kernel/events/hw_breakpoint.c @@ -400,16 +400,35 @@ int dbg_release_bp_slot(struct perf_event *bp) return 0; } -static int validate_hw_breakpoint(struct perf_event *bp) +#ifndef hw_breakpoint_arch_parse +int hw_breakpoint_arch_parse(struct perf_event *bp, + struct perf_event_attr *attr, + struct arch_hw_breakpoint *hw) { - int ret; + int err; - ret = arch_validate_hwbkpt_settings(bp); - if (ret) - return ret; + err = arch_validate_hwbkpt_settings(bp); + if (err) + return err; + + *hw = bp->hw.info; + + return 0; +} +#endif + +static int hw_breakpoint_parse(struct perf_event *bp, + struct perf_event_attr *attr, + struct arch_hw_breakpoint *hw) +{ + int err; + + err = hw_breakpoint_arch_parse(bp, attr, hw); + if (err) + return err; if (arch_check_bp_in_kernelspace(bp)) { - if (bp->attr.exclude_kernel) + if (attr->exclude_kernel) return -EINVAL; /* * Don't let unprivileged users set a breakpoint in the trap @@ -424,19 +443,22 @@ static int validate_hw_breakpoint(struct perf_event *bp) int register_perf_hw_breakpoint(struct perf_event *bp) { - int ret; + struct arch_hw_breakpoint hw; + int err; - ret = reserve_bp_slot(bp); - if (ret) - return ret; + err = reserve_bp_slot(bp); + if (err) + return err; - ret = validate_hw_breakpoint(bp); - - /* if arch_validate_hwbkpt_settings() fails then release bp slot */ - if (ret) + err = hw_breakpoint_parse(bp, &bp->attr, &hw); + if (err) { release_bp_slot(bp); + return err; + } - return ret; + bp->hw.info = hw; + + return 0; } /** @@ -464,6 +486,7 @@ modify_user_hw_breakpoint_check(struct perf_event *bp, struct perf_event_attr *a u64 old_len = bp->attr.bp_len; int old_type = bp->attr.bp_type; bool modify = attr->bp_type != old_type; + struct arch_hw_breakpoint hw; int err = 0; bp->attr.bp_addr = attr->bp_addr; @@ -473,7 +496,7 @@ modify_user_hw_breakpoint_check(struct perf_event *bp, struct perf_event_attr *a if (check && memcmp(&bp->attr, attr, sizeof(*attr))) return -EINVAL; - err = validate_hw_breakpoint(bp); + err = hw_breakpoint_parse(bp, attr, &hw); if (!err && modify) err = modify_bp_slot(bp, old_type); @@ -484,7 +507,9 @@ modify_user_hw_breakpoint_check(struct perf_event *bp, struct perf_event_attr *a return err; } + bp->hw.info = hw; bp->attr.disabled = attr->disabled; + return 0; } -- 2.7.4
next prev parent reply other threads:[~2018-05-19 2:46 UTC|newest] Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-05-19 2:45 [PATCH 00/12] breakpoint: Rework arch validation v2 Frederic Weisbecker 2018-05-19 2:45 ` Frederic Weisbecker [this message] 2018-05-24 1:56 ` [PATCH 01/12] perf/breakpoint: Split attribute parse and commit Michael Ellerman 2018-05-25 13:58 ` Frederic Weisbecker 2018-05-28 11:29 ` Michael Ellerman 2018-05-19 2:45 ` [PATCH 02/12] perf/breakpoint: Pass arch breakpoint struct to arch_check_bp_in_kernelspace() Frederic Weisbecker 2018-05-19 2:45 ` [PATCH 03/12] x86: Implement hw_breakpoint_arch_parse() Frederic Weisbecker 2018-05-19 2:45 ` [PATCH 04/12] powerpc: " Frederic Weisbecker 2018-05-24 2:01 ` Michael Ellerman 2018-05-25 14:05 ` Frederic Weisbecker 2018-05-28 11:31 ` Michael Ellerman 2018-06-01 14:46 ` Frederic Weisbecker 2018-06-05 11:06 ` Michael Ellerman 2018-05-19 2:45 ` [PATCH 05/12] arm: " Frederic Weisbecker 2018-05-25 12:18 ` Mark Rutland 2018-05-19 2:45 ` [PATCH 06/12] arm64: " Frederic Weisbecker 2018-05-23 15:23 ` Will Deacon 2018-05-25 12:18 ` Mark Rutland 2018-05-19 2:45 ` [PATCH 07/12] sh: Remove "struct arch_hw_breakpoint::name" unused field Frederic Weisbecker 2018-05-19 2:45 ` [PATCH 08/12] sh: Implement hw_breakpoint_arch_parse() Frederic Weisbecker 2018-05-19 2:45 ` [PATCH 09/12] xtensa: " Frederic Weisbecker 2018-05-19 2:45 ` [PATCH 10/12] perf/breakpoint: Remove default hw_breakpoint_arch_parse() Frederic Weisbecker 2018-05-19 2:45 ` [PATCH 11/12] perf/breakpoint: Pass new breakpoint type to modify_breakpoint_slot() Frederic Weisbecker 2018-05-19 2:45 ` [PATCH 12/12] perf/breakpoint: Clean up and consolidate modify_user_hw_breakpoint_check() Frederic Weisbecker 2018-06-01 14:31 [GIT PULL] breakpoint: Rework arch validation v3 Frederic Weisbecker 2018-06-01 14:31 ` [PATCH 01/12] perf/breakpoint: Split attribute parse and commit Frederic Weisbecker 2018-06-26 2:58 [GIT PULL] breakpoint: Rework arch validation v4 Frederic Weisbecker 2018-06-26 2:58 ` [PATCH 01/12] perf/breakpoint: Split attribute parse and commit Frederic Weisbecker
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=1526697950-7091-2-git-send-email-frederic@kernel.org \ --to=frederic@kernel.org \ --cc=acme@kernel.org \ --cc=alexander.shishkin@linux.intel.com \ --cc=benh@kernel.crashing.org \ --cc=catalin.marinas@arm.com \ --cc=chris@zankel.net \ --cc=dalias@libc.org \ --cc=jcmvbkbc@gmail.com \ --cc=joel.opensrc@gmail.com \ --cc=jolsa@redhat.com \ --cc=linux-kernel@vger.kernel.org \ --cc=luto@kernel.org \ --cc=mark.rutland@arm.com \ --cc=mingo@kernel.org \ --cc=mpe@ellerman.id.au \ --cc=namhyung@kernel.org \ --cc=paulus@samba.org \ --cc=peterz@infradead.org \ --cc=tglx@linutronix.de \ --cc=torvalds@linux-foundation.org \ --cc=will.deacon@arm.com \ --cc=ysato@users.sourceforge.jp \ /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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).