|
@@ -865,6 +865,7 @@ static void power_pmu_start(struct perf_event *event, int ef_flags)
|
|
|
{
|
|
|
unsigned long flags;
|
|
|
s64 left;
|
|
|
+ unsigned long val;
|
|
|
|
|
|
if (!event->hw.idx || !event->hw.sample_period)
|
|
|
return;
|
|
@@ -880,7 +881,12 @@ static void power_pmu_start(struct perf_event *event, int ef_flags)
|
|
|
|
|
|
event->hw.state = 0;
|
|
|
left = local64_read(&event->hw.period_left);
|
|
|
- write_pmc(event->hw.idx, left);
|
|
|
+
|
|
|
+ val = 0;
|
|
|
+ if (left < 0x80000000L)
|
|
|
+ val = 0x80000000L - left;
|
|
|
+
|
|
|
+ write_pmc(event->hw.idx, val);
|
|
|
|
|
|
perf_event_update_userpage(event);
|
|
|
perf_pmu_enable(event->pmu);
|