diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/perf_counter.c | 104 |
1 files changed, 52 insertions, 52 deletions
diff --git a/kernel/perf_counter.c b/kernel/perf_counter.c index 978ecfcc7aaf..5ecd9981c035 100644 --- a/kernel/perf_counter.c +++ b/kernel/perf_counter.c | |||
@@ -1186,7 +1186,7 @@ static void perf_log_period(struct perf_counter *counter, u64 period); | |||
1186 | static void perf_adjust_freq(struct perf_counter_context *ctx) | 1186 | static void perf_adjust_freq(struct perf_counter_context *ctx) |
1187 | { | 1187 | { |
1188 | struct perf_counter *counter; | 1188 | struct perf_counter *counter; |
1189 | u64 interrupts, irq_period; | 1189 | u64 interrupts, sample_period; |
1190 | u64 events, period; | 1190 | u64 events, period; |
1191 | s64 delta; | 1191 | s64 delta; |
1192 | 1192 | ||
@@ -1204,23 +1204,23 @@ static void perf_adjust_freq(struct perf_counter_context *ctx) | |||
1204 | interrupts = 2*sysctl_perf_counter_limit/HZ; | 1204 | interrupts = 2*sysctl_perf_counter_limit/HZ; |
1205 | } | 1205 | } |
1206 | 1206 | ||
1207 | if (!counter->hw_event.freq || !counter->hw_event.irq_freq) | 1207 | if (!counter->hw_event.freq || !counter->hw_event.sample_freq) |
1208 | continue; | 1208 | continue; |
1209 | 1209 | ||
1210 | events = HZ * interrupts * counter->hw.irq_period; | 1210 | events = HZ * interrupts * counter->hw.sample_period; |
1211 | period = div64_u64(events, counter->hw_event.irq_freq); | 1211 | period = div64_u64(events, counter->hw_event.sample_freq); |
1212 | 1212 | ||
1213 | delta = (s64)(1 + period - counter->hw.irq_period); | 1213 | delta = (s64)(1 + period - counter->hw.sample_period); |
1214 | delta >>= 1; | 1214 | delta >>= 1; |
1215 | 1215 | ||
1216 | irq_period = counter->hw.irq_period + delta; | 1216 | sample_period = counter->hw.sample_period + delta; |
1217 | 1217 | ||
1218 | if (!irq_period) | 1218 | if (!sample_period) |
1219 | irq_period = 1; | 1219 | sample_period = 1; |
1220 | 1220 | ||
1221 | perf_log_period(counter, irq_period); | 1221 | perf_log_period(counter, sample_period); |
1222 | 1222 | ||
1223 | counter->hw.irq_period = irq_period; | 1223 | counter->hw.sample_period = sample_period; |
1224 | } | 1224 | } |
1225 | spin_unlock(&ctx->lock); | 1225 | spin_unlock(&ctx->lock); |
1226 | } | 1226 | } |
@@ -2297,7 +2297,7 @@ static void perf_counter_output(struct perf_counter *counter, | |||
2297 | int nmi, struct pt_regs *regs, u64 addr) | 2297 | int nmi, struct pt_regs *regs, u64 addr) |
2298 | { | 2298 | { |
2299 | int ret; | 2299 | int ret; |
2300 | u64 record_type = counter->hw_event.record_type; | 2300 | u64 sample_type = counter->hw_event.sample_type; |
2301 | struct perf_output_handle handle; | 2301 | struct perf_output_handle handle; |
2302 | struct perf_event_header header; | 2302 | struct perf_event_header header; |
2303 | u64 ip; | 2303 | u64 ip; |
@@ -2321,61 +2321,61 @@ static void perf_counter_output(struct perf_counter *counter, | |||
2321 | header.misc = PERF_EVENT_MISC_OVERFLOW; | 2321 | header.misc = PERF_EVENT_MISC_OVERFLOW; |
2322 | header.misc |= perf_misc_flags(regs); | 2322 | header.misc |= perf_misc_flags(regs); |
2323 | 2323 | ||
2324 | if (record_type & PERF_RECORD_IP) { | 2324 | if (sample_type & PERF_SAMPLE_IP) { |
2325 | ip = perf_instruction_pointer(regs); | 2325 | ip = perf_instruction_pointer(regs); |
2326 | header.type |= PERF_RECORD_IP; | 2326 | header.type |= PERF_SAMPLE_IP; |
2327 | header.size += sizeof(ip); | 2327 | header.size += sizeof(ip); |
2328 | } | 2328 | } |
2329 | 2329 | ||
2330 | if (record_type & PERF_RECORD_TID) { | 2330 | if (sample_type & PERF_SAMPLE_TID) { |
2331 | /* namespace issues */ | 2331 | /* namespace issues */ |
2332 | tid_entry.pid = perf_counter_pid(counter, current); | 2332 | tid_entry.pid = perf_counter_pid(counter, current); |
2333 | tid_entry.tid = perf_counter_tid(counter, current); | 2333 | tid_entry.tid = perf_counter_tid(counter, current); |
2334 | 2334 | ||
2335 | header.type |= PERF_RECORD_TID; | 2335 | header.type |= PERF_SAMPLE_TID; |
2336 | header.size += sizeof(tid_entry); | 2336 | header.size += sizeof(tid_entry); |
2337 | } | 2337 | } |
2338 | 2338 | ||
2339 | if (record_type & PERF_RECORD_TIME) { | 2339 | if (sample_type & PERF_SAMPLE_TIME) { |
2340 | /* | 2340 | /* |
2341 | * Maybe do better on x86 and provide cpu_clock_nmi() | 2341 | * Maybe do better on x86 and provide cpu_clock_nmi() |
2342 | */ | 2342 | */ |
2343 | time = sched_clock(); | 2343 | time = sched_clock(); |
2344 | 2344 | ||
2345 | header.type |= PERF_RECORD_TIME; | 2345 | header.type |= PERF_SAMPLE_TIME; |
2346 | header.size += sizeof(u64); | 2346 | header.size += sizeof(u64); |
2347 | } | 2347 | } |
2348 | 2348 | ||
2349 | if (record_type & PERF_RECORD_ADDR) { | 2349 | if (sample_type & PERF_SAMPLE_ADDR) { |
2350 | header.type |= PERF_RECORD_ADDR; | 2350 | header.type |= PERF_SAMPLE_ADDR; |
2351 | header.size += sizeof(u64); | 2351 | header.size += sizeof(u64); |
2352 | } | 2352 | } |
2353 | 2353 | ||
2354 | if (record_type & PERF_RECORD_CONFIG) { | 2354 | if (sample_type & PERF_SAMPLE_CONFIG) { |
2355 | header.type |= PERF_RECORD_CONFIG; | 2355 | header.type |= PERF_SAMPLE_CONFIG; |
2356 | header.size += sizeof(u64); | 2356 | header.size += sizeof(u64); |
2357 | } | 2357 | } |
2358 | 2358 | ||
2359 | if (record_type & PERF_RECORD_CPU) { | 2359 | if (sample_type & PERF_SAMPLE_CPU) { |
2360 | header.type |= PERF_RECORD_CPU; | 2360 | header.type |= PERF_SAMPLE_CPU; |
2361 | header.size += sizeof(cpu_entry); | 2361 | header.size += sizeof(cpu_entry); |
2362 | 2362 | ||
2363 | cpu_entry.cpu = raw_smp_processor_id(); | 2363 | cpu_entry.cpu = raw_smp_processor_id(); |
2364 | } | 2364 | } |
2365 | 2365 | ||
2366 | if (record_type & PERF_RECORD_GROUP) { | 2366 | if (sample_type & PERF_SAMPLE_GROUP) { |
2367 | header.type |= PERF_RECORD_GROUP; | 2367 | header.type |= PERF_SAMPLE_GROUP; |
2368 | header.size += sizeof(u64) + | 2368 | header.size += sizeof(u64) + |
2369 | counter->nr_siblings * sizeof(group_entry); | 2369 | counter->nr_siblings * sizeof(group_entry); |
2370 | } | 2370 | } |
2371 | 2371 | ||
2372 | if (record_type & PERF_RECORD_CALLCHAIN) { | 2372 | if (sample_type & PERF_SAMPLE_CALLCHAIN) { |
2373 | callchain = perf_callchain(regs); | 2373 | callchain = perf_callchain(regs); |
2374 | 2374 | ||
2375 | if (callchain) { | 2375 | if (callchain) { |
2376 | callchain_size = (1 + callchain->nr) * sizeof(u64); | 2376 | callchain_size = (1 + callchain->nr) * sizeof(u64); |
2377 | 2377 | ||
2378 | header.type |= PERF_RECORD_CALLCHAIN; | 2378 | header.type |= PERF_SAMPLE_CALLCHAIN; |
2379 | header.size += callchain_size; | 2379 | header.size += callchain_size; |
2380 | } | 2380 | } |
2381 | } | 2381 | } |
@@ -2386,28 +2386,28 @@ static void perf_counter_output(struct perf_counter *counter, | |||
2386 | 2386 | ||
2387 | perf_output_put(&handle, header); | 2387 | perf_output_put(&handle, header); |
2388 | 2388 | ||
2389 | if (record_type & PERF_RECORD_IP) | 2389 | if (sample_type & PERF_SAMPLE_IP) |
2390 | perf_output_put(&handle, ip); | 2390 | perf_output_put(&handle, ip); |
2391 | 2391 | ||
2392 | if (record_type & PERF_RECORD_TID) | 2392 | if (sample_type & PERF_SAMPLE_TID) |
2393 | perf_output_put(&handle, tid_entry); | 2393 | perf_output_put(&handle, tid_entry); |
2394 | 2394 | ||
2395 | if (record_type & PERF_RECORD_TIME) | 2395 | if (sample_type & PERF_SAMPLE_TIME) |
2396 | perf_output_put(&handle, time); | 2396 | perf_output_put(&handle, time); |
2397 | 2397 | ||
2398 | if (record_type & PERF_RECORD_ADDR) | 2398 | if (sample_type & PERF_SAMPLE_ADDR) |
2399 | perf_output_put(&handle, addr); | 2399 | perf_output_put(&handle, addr); |
2400 | 2400 | ||
2401 | if (record_type & PERF_RECORD_CONFIG) | 2401 | if (sample_type & PERF_SAMPLE_CONFIG) |
2402 | perf_output_put(&handle, counter->hw_event.config); | 2402 | perf_output_put(&handle, counter->hw_event.config); |
2403 | 2403 | ||
2404 | if (record_type & PERF_RECORD_CPU) | 2404 | if (sample_type & PERF_SAMPLE_CPU) |
2405 | perf_output_put(&handle, cpu_entry); | 2405 | perf_output_put(&handle, cpu_entry); |
2406 | 2406 | ||
2407 | /* | 2407 | /* |
2408 | * XXX PERF_RECORD_GROUP vs inherited counters seems difficult. | 2408 | * XXX PERF_SAMPLE_GROUP vs inherited counters seems difficult. |
2409 | */ | 2409 | */ |
2410 | if (record_type & PERF_RECORD_GROUP) { | 2410 | if (sample_type & PERF_SAMPLE_GROUP) { |
2411 | struct perf_counter *leader, *sub; | 2411 | struct perf_counter *leader, *sub; |
2412 | u64 nr = counter->nr_siblings; | 2412 | u64 nr = counter->nr_siblings; |
2413 | 2413 | ||
@@ -2702,7 +2702,7 @@ void perf_counter_munmap(unsigned long addr, unsigned long len, | |||
2702 | } | 2702 | } |
2703 | 2703 | ||
2704 | /* | 2704 | /* |
2705 | * Log irq_period changes so that analyzing tools can re-normalize the | 2705 | * Log sample_period changes so that analyzing tools can re-normalize the |
2706 | * event flow. | 2706 | * event flow. |
2707 | */ | 2707 | */ |
2708 | 2708 | ||
@@ -2725,7 +2725,7 @@ static void perf_log_period(struct perf_counter *counter, u64 period) | |||
2725 | .period = period, | 2725 | .period = period, |
2726 | }; | 2726 | }; |
2727 | 2727 | ||
2728 | if (counter->hw.irq_period == period) | 2728 | if (counter->hw.sample_period == period) |
2729 | return; | 2729 | return; |
2730 | 2730 | ||
2731 | ret = perf_output_begin(&handle, counter, sizeof(freq_event), 0, 0); | 2731 | ret = perf_output_begin(&handle, counter, sizeof(freq_event), 0, 0); |
@@ -2834,7 +2834,7 @@ static void perf_swcounter_set_period(struct perf_counter *counter) | |||
2834 | { | 2834 | { |
2835 | struct hw_perf_counter *hwc = &counter->hw; | 2835 | struct hw_perf_counter *hwc = &counter->hw; |
2836 | s64 left = atomic64_read(&hwc->period_left); | 2836 | s64 left = atomic64_read(&hwc->period_left); |
2837 | s64 period = hwc->irq_period; | 2837 | s64 period = hwc->sample_period; |
2838 | 2838 | ||
2839 | if (unlikely(left <= -period)) { | 2839 | if (unlikely(left <= -period)) { |
2840 | left = period; | 2840 | left = period; |
@@ -2874,7 +2874,7 @@ static enum hrtimer_restart perf_swcounter_hrtimer(struct hrtimer *hrtimer) | |||
2874 | ret = HRTIMER_NORESTART; | 2874 | ret = HRTIMER_NORESTART; |
2875 | } | 2875 | } |
2876 | 2876 | ||
2877 | period = max_t(u64, 10000, counter->hw.irq_period); | 2877 | period = max_t(u64, 10000, counter->hw.sample_period); |
2878 | hrtimer_forward_now(hrtimer, ns_to_ktime(period)); | 2878 | hrtimer_forward_now(hrtimer, ns_to_ktime(period)); |
2879 | 2879 | ||
2880 | return ret; | 2880 | return ret; |
@@ -2959,7 +2959,7 @@ static void perf_swcounter_add(struct perf_counter *counter, u64 nr, | |||
2959 | { | 2959 | { |
2960 | int neg = atomic64_add_negative(nr, &counter->hw.count); | 2960 | int neg = atomic64_add_negative(nr, &counter->hw.count); |
2961 | 2961 | ||
2962 | if (counter->hw.irq_period && !neg && regs) | 2962 | if (counter->hw.sample_period && !neg && regs) |
2963 | perf_swcounter_overflow(counter, nmi, regs, addr); | 2963 | perf_swcounter_overflow(counter, nmi, regs, addr); |
2964 | } | 2964 | } |
2965 | 2965 | ||
@@ -3080,8 +3080,8 @@ static int cpu_clock_perf_counter_enable(struct perf_counter *counter) | |||
3080 | atomic64_set(&hwc->prev_count, cpu_clock(cpu)); | 3080 | atomic64_set(&hwc->prev_count, cpu_clock(cpu)); |
3081 | hrtimer_init(&hwc->hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); | 3081 | hrtimer_init(&hwc->hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); |
3082 | hwc->hrtimer.function = perf_swcounter_hrtimer; | 3082 | hwc->hrtimer.function = perf_swcounter_hrtimer; |
3083 | if (hwc->irq_period) { | 3083 | if (hwc->sample_period) { |
3084 | u64 period = max_t(u64, 10000, hwc->irq_period); | 3084 | u64 period = max_t(u64, 10000, hwc->sample_period); |
3085 | __hrtimer_start_range_ns(&hwc->hrtimer, | 3085 | __hrtimer_start_range_ns(&hwc->hrtimer, |
3086 | ns_to_ktime(period), 0, | 3086 | ns_to_ktime(period), 0, |
3087 | HRTIMER_MODE_REL, 0); | 3087 | HRTIMER_MODE_REL, 0); |
@@ -3092,7 +3092,7 @@ static int cpu_clock_perf_counter_enable(struct perf_counter *counter) | |||
3092 | 3092 | ||
3093 | static void cpu_clock_perf_counter_disable(struct perf_counter *counter) | 3093 | static void cpu_clock_perf_counter_disable(struct perf_counter *counter) |
3094 | { | 3094 | { |
3095 | if (counter->hw.irq_period) | 3095 | if (counter->hw.sample_period) |
3096 | hrtimer_cancel(&counter->hw.hrtimer); | 3096 | hrtimer_cancel(&counter->hw.hrtimer); |
3097 | cpu_clock_perf_counter_update(counter); | 3097 | cpu_clock_perf_counter_update(counter); |
3098 | } | 3098 | } |
@@ -3132,8 +3132,8 @@ static int task_clock_perf_counter_enable(struct perf_counter *counter) | |||
3132 | atomic64_set(&hwc->prev_count, now); | 3132 | atomic64_set(&hwc->prev_count, now); |
3133 | hrtimer_init(&hwc->hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); | 3133 | hrtimer_init(&hwc->hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); |
3134 | hwc->hrtimer.function = perf_swcounter_hrtimer; | 3134 | hwc->hrtimer.function = perf_swcounter_hrtimer; |
3135 | if (hwc->irq_period) { | 3135 | if (hwc->sample_period) { |
3136 | u64 period = max_t(u64, 10000, hwc->irq_period); | 3136 | u64 period = max_t(u64, 10000, hwc->sample_period); |
3137 | __hrtimer_start_range_ns(&hwc->hrtimer, | 3137 | __hrtimer_start_range_ns(&hwc->hrtimer, |
3138 | ns_to_ktime(period), 0, | 3138 | ns_to_ktime(period), 0, |
3139 | HRTIMER_MODE_REL, 0); | 3139 | HRTIMER_MODE_REL, 0); |
@@ -3144,7 +3144,7 @@ static int task_clock_perf_counter_enable(struct perf_counter *counter) | |||
3144 | 3144 | ||
3145 | static void task_clock_perf_counter_disable(struct perf_counter *counter) | 3145 | static void task_clock_perf_counter_disable(struct perf_counter *counter) |
3146 | { | 3146 | { |
3147 | if (counter->hw.irq_period) | 3147 | if (counter->hw.sample_period) |
3148 | hrtimer_cancel(&counter->hw.hrtimer); | 3148 | hrtimer_cancel(&counter->hw.hrtimer); |
3149 | task_clock_perf_counter_update(counter, counter->ctx->time); | 3149 | task_clock_perf_counter_update(counter, counter->ctx->time); |
3150 | 3150 | ||
@@ -3223,7 +3223,7 @@ static const struct pmu *tp_perf_counter_init(struct perf_counter *counter) | |||
3223 | return NULL; | 3223 | return NULL; |
3224 | 3224 | ||
3225 | counter->destroy = tp_perf_counter_destroy; | 3225 | counter->destroy = tp_perf_counter_destroy; |
3226 | counter->hw.irq_period = counter->hw_event.irq_period; | 3226 | counter->hw.sample_period = counter->hw_event.sample_period; |
3227 | 3227 | ||
3228 | return &perf_ops_generic; | 3228 | return &perf_ops_generic; |
3229 | } | 3229 | } |
@@ -3323,15 +3323,15 @@ perf_counter_alloc(struct perf_counter_hw_event *hw_event, | |||
3323 | pmu = NULL; | 3323 | pmu = NULL; |
3324 | 3324 | ||
3325 | hwc = &counter->hw; | 3325 | hwc = &counter->hw; |
3326 | if (hw_event->freq && hw_event->irq_freq) | 3326 | if (hw_event->freq && hw_event->sample_freq) |
3327 | hwc->irq_period = div64_u64(TICK_NSEC, hw_event->irq_freq); | 3327 | hwc->sample_period = div64_u64(TICK_NSEC, hw_event->sample_freq); |
3328 | else | 3328 | else |
3329 | hwc->irq_period = hw_event->irq_period; | 3329 | hwc->sample_period = hw_event->sample_period; |
3330 | 3330 | ||
3331 | /* | 3331 | /* |
3332 | * we currently do not support PERF_RECORD_GROUP on inherited counters | 3332 | * we currently do not support PERF_SAMPLE_GROUP on inherited counters |
3333 | */ | 3333 | */ |
3334 | if (hw_event->inherit && (hw_event->record_type & PERF_RECORD_GROUP)) | 3334 | if (hw_event->inherit && (hw_event->sample_type & PERF_SAMPLE_GROUP)) |
3335 | goto done; | 3335 | goto done; |
3336 | 3336 | ||
3337 | if (perf_event_raw(hw_event)) { | 3337 | if (perf_event_raw(hw_event)) { |