aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm/kernel/perf_event.c4
-rw-r--r--arch/x86/kernel/cpu/perf_event_intel_rapl.c1
-rw-r--r--kernel/events/core.c16
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,
3527static int perf_event_period(struct perf_event *event, u64 __user *arg) 3527static 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
3554unlock: 3568unlock:
3555 raw_spin_unlock_irq(&ctx->lock); 3569 raw_spin_unlock_irq(&ctx->lock);
3556 3570