diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2018-09-15 12:44:32 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-09-15 12:44:32 -0400 |
commit | c0be92b5b14bc6928363527602dabff57875473a (patch) | |
tree | a7f0c394f47377826905c143f3b43f73c053d6ca /kernel | |
parent | ca062f8df5d13e3a5c029449a12c20ac5069c094 (diff) | |
parent | cb48b6a26cace226d8b299a48c73e808eb0c4f61 (diff) |
Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull perf fixes from Ingo Molnar:
"Mostly tooling fixes, but also breakpoint and x86 PMU driver fixes"
* 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (23 commits)
perf tools: Fix maps__find_symbol_by_name()
tools headers uapi: Update tools's copy of linux/if_link.h
tools headers uapi: Update tools's copy of linux/vhost.h
tools headers uapi: Update tools's copies of kvm headers
tools headers uapi: Update tools's copy of drm/drm.h
tools headers uapi: Update tools's copy of asm-generic/unistd.h
tools headers uapi: Update tools's copy of linux/perf_event.h
perf/core: Force USER_DS when recording user stack data
perf/UAPI: Clearly mark __PERF_SAMPLE_CALLCHAIN_EARLY as internal use
perf/x86/intel: Add support/quirk for the MISPREDICT bit on Knights Landing CPUs
perf annotate: Fix parsing aarch64 branch instructions after objdump update
perf probe powerpc: Ignore SyS symbols irrespective of endianness
perf event-parse: Use fixed size string for comms
perf util: Fix bad memory access in trace info.
perf tools: Streamline bpf examples and headers installation
perf evsel: Fix potential null pointer dereference in perf_evsel__new_idx()
perf arm64: Fix include path for asm-generic/unistd.h
perf/hw_breakpoint: Simplify breakpoint enable in perf_event_modify_breakpoint
perf/hw_breakpoint: Enable breakpoint in modify_user_hw_breakpoint
perf/hw_breakpoint: Remove superfluous bp->attr.disabled = 0
...
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/events/core.c | 15 | ||||
-rw-r--r-- | kernel/events/hw_breakpoint.c | 13 |
2 files changed, 13 insertions, 15 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c index 2a62b96600ad..c80549bf82c6 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
@@ -2867,16 +2867,11 @@ static int perf_event_modify_breakpoint(struct perf_event *bp, | |||
2867 | _perf_event_disable(bp); | 2867 | _perf_event_disable(bp); |
2868 | 2868 | ||
2869 | err = modify_user_hw_breakpoint_check(bp, attr, true); | 2869 | err = modify_user_hw_breakpoint_check(bp, attr, true); |
2870 | if (err) { | ||
2871 | if (!bp->attr.disabled) | ||
2872 | _perf_event_enable(bp); | ||
2873 | 2870 | ||
2874 | return err; | 2871 | if (!bp->attr.disabled) |
2875 | } | ||
2876 | |||
2877 | if (!attr->disabled) | ||
2878 | _perf_event_enable(bp); | 2872 | _perf_event_enable(bp); |
2879 | return 0; | 2873 | |
2874 | return err; | ||
2880 | } | 2875 | } |
2881 | 2876 | ||
2882 | static int perf_event_modify_attr(struct perf_event *event, | 2877 | static int perf_event_modify_attr(struct perf_event *event, |
@@ -5948,6 +5943,7 @@ perf_output_sample_ustack(struct perf_output_handle *handle, u64 dump_size, | |||
5948 | unsigned long sp; | 5943 | unsigned long sp; |
5949 | unsigned int rem; | 5944 | unsigned int rem; |
5950 | u64 dyn_size; | 5945 | u64 dyn_size; |
5946 | mm_segment_t fs; | ||
5951 | 5947 | ||
5952 | /* | 5948 | /* |
5953 | * We dump: | 5949 | * We dump: |
@@ -5965,7 +5961,10 @@ perf_output_sample_ustack(struct perf_output_handle *handle, u64 dump_size, | |||
5965 | 5961 | ||
5966 | /* Data. */ | 5962 | /* Data. */ |
5967 | sp = perf_user_stack_pointer(regs); | 5963 | sp = perf_user_stack_pointer(regs); |
5964 | fs = get_fs(); | ||
5965 | set_fs(USER_DS); | ||
5968 | rem = __output_copy_user(handle, (void *) sp, dump_size); | 5966 | rem = __output_copy_user(handle, (void *) sp, dump_size); |
5967 | set_fs(fs); | ||
5969 | dyn_size = dump_size - rem; | 5968 | dyn_size = dump_size - rem; |
5970 | 5969 | ||
5971 | perf_output_skip(handle, rem); | 5970 | perf_output_skip(handle, rem); |
diff --git a/kernel/events/hw_breakpoint.c b/kernel/events/hw_breakpoint.c index b3814fce5ecb..d6b56180827c 100644 --- a/kernel/events/hw_breakpoint.c +++ b/kernel/events/hw_breakpoint.c | |||
@@ -509,6 +509,8 @@ modify_user_hw_breakpoint_check(struct perf_event *bp, struct perf_event_attr *a | |||
509 | */ | 509 | */ |
510 | int modify_user_hw_breakpoint(struct perf_event *bp, struct perf_event_attr *attr) | 510 | int modify_user_hw_breakpoint(struct perf_event *bp, struct perf_event_attr *attr) |
511 | { | 511 | { |
512 | int err; | ||
513 | |||
512 | /* | 514 | /* |
513 | * modify_user_hw_breakpoint can be invoked with IRQs disabled and hence it | 515 | * modify_user_hw_breakpoint can be invoked with IRQs disabled and hence it |
514 | * will not be possible to raise IPIs that invoke __perf_event_disable. | 516 | * will not be possible to raise IPIs that invoke __perf_event_disable. |
@@ -520,15 +522,12 @@ int modify_user_hw_breakpoint(struct perf_event *bp, struct perf_event_attr *att | |||
520 | else | 522 | else |
521 | perf_event_disable(bp); | 523 | perf_event_disable(bp); |
522 | 524 | ||
523 | if (!attr->disabled) { | 525 | err = modify_user_hw_breakpoint_check(bp, attr, false); |
524 | int err = modify_user_hw_breakpoint_check(bp, attr, false); | ||
525 | 526 | ||
526 | if (err) | 527 | if (!bp->attr.disabled) |
527 | return err; | ||
528 | perf_event_enable(bp); | 528 | perf_event_enable(bp); |
529 | bp->attr.disabled = 0; | 529 | |
530 | } | 530 | return err; |
531 | return 0; | ||
532 | } | 531 | } |
533 | EXPORT_SYMBOL_GPL(modify_user_hw_breakpoint); | 532 | EXPORT_SYMBOL_GPL(modify_user_hw_breakpoint); |
534 | 533 | ||