diff options
-rw-r--r-- | arch/arm/kernel/perf_event.c | 4 | ||||
-rw-r--r-- | arch/x86/kernel/cpu/perf_event_intel_rapl.c | 1 | ||||
-rw-r--r-- | kernel/events/core.c | 16 |
3 files changed, 16 insertions, 5 deletions
diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c index bc3f2efa0d86..789d846a9184 100644 --- a/arch/arm/kernel/perf_event.c +++ b/arch/arm/kernel/perf_event.c | |||
@@ -99,10 +99,6 @@ int armpmu_event_set_period(struct perf_event *event) | |||
99 | s64 period = hwc->sample_period; | 99 | s64 period = hwc->sample_period; |
100 | int ret = 0; | 100 | int ret = 0; |
101 | 101 | ||
102 | /* The period may have been changed by PERF_EVENT_IOC_PERIOD */ | ||
103 | if (unlikely(period != hwc->last_period)) | ||
104 | left = period - (hwc->last_period - left); | ||
105 | |||
106 | if (unlikely(left <= -period)) { | 102 | if (unlikely(left <= -period)) { |
107 | left = period; | 103 | left = period; |
108 | local64_set(&hwc->period_left, left); | 104 | local64_set(&hwc->period_left, left); |
diff --git a/arch/x86/kernel/cpu/perf_event_intel_rapl.c b/arch/x86/kernel/cpu/perf_event_intel_rapl.c index bf8e4a736d48..0e3754e450d9 100644 --- a/arch/x86/kernel/cpu/perf_event_intel_rapl.c +++ b/arch/x86/kernel/cpu/perf_event_intel_rapl.c | |||
@@ -615,6 +615,7 @@ static int __init rapl_pmu_init(void) | |||
615 | case 42: /* Sandy Bridge */ | 615 | case 42: /* Sandy Bridge */ |
616 | case 58: /* Ivy Bridge */ | 616 | case 58: /* Ivy Bridge */ |
617 | case 60: /* Haswell */ | 617 | case 60: /* Haswell */ |
618 | case 69: /* Haswell-Celeron */ | ||
618 | rapl_cntr_mask = RAPL_IDX_CLN; | 619 | rapl_cntr_mask = RAPL_IDX_CLN; |
619 | rapl_pmu_events_group.attrs = rapl_events_cln_attr; | 620 | rapl_pmu_events_group.attrs = rapl_events_cln_attr; |
620 | break; | 621 | break; |
diff --git a/kernel/events/core.c b/kernel/events/core.c index 403b781daafb..89d34f9bb8cb 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
@@ -3527,7 +3527,7 @@ static void perf_event_for_each(struct perf_event *event, | |||
3527 | static int perf_event_period(struct perf_event *event, u64 __user *arg) | 3527 | static int perf_event_period(struct perf_event *event, u64 __user *arg) |
3528 | { | 3528 | { |
3529 | struct perf_event_context *ctx = event->ctx; | 3529 | struct perf_event_context *ctx = event->ctx; |
3530 | int ret = 0; | 3530 | int ret = 0, active; |
3531 | u64 value; | 3531 | u64 value; |
3532 | 3532 | ||
3533 | if (!is_sampling_event(event)) | 3533 | if (!is_sampling_event(event)) |
@@ -3551,6 +3551,20 @@ static int perf_event_period(struct perf_event *event, u64 __user *arg) | |||
3551 | event->attr.sample_period = value; | 3551 | event->attr.sample_period = value; |
3552 | event->hw.sample_period = value; | 3552 | event->hw.sample_period = value; |
3553 | } | 3553 | } |
3554 | |||
3555 | active = (event->state == PERF_EVENT_STATE_ACTIVE); | ||
3556 | if (active) { | ||
3557 | perf_pmu_disable(ctx->pmu); | ||
3558 | event->pmu->stop(event, PERF_EF_UPDATE); | ||
3559 | } | ||
3560 | |||
3561 | local64_set(&event->hw.period_left, 0); | ||
3562 | |||
3563 | if (active) { | ||
3564 | event->pmu->start(event, PERF_EF_RELOAD); | ||
3565 | perf_pmu_enable(ctx->pmu); | ||
3566 | } | ||
3567 | |||
3554 | unlock: | 3568 | unlock: |
3555 | raw_spin_unlock_irq(&ctx->lock); | 3569 | raw_spin_unlock_irq(&ctx->lock); |
3556 | 3570 | ||