diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/perf_counter.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/kernel/perf_counter.c b/kernel/perf_counter.c index caa012cfe49a..978ecfcc7aaf 100644 --- a/kernel/perf_counter.c +++ b/kernel/perf_counter.c | |||
@@ -1510,6 +1510,8 @@ perf_read_hw(struct perf_counter *counter, char __user *buf, size_t count) | |||
1510 | if (counter->hw_event.read_format & PERF_FORMAT_TOTAL_TIME_RUNNING) | 1510 | if (counter->hw_event.read_format & PERF_FORMAT_TOTAL_TIME_RUNNING) |
1511 | values[n++] = counter->total_time_running + | 1511 | values[n++] = counter->total_time_running + |
1512 | atomic64_read(&counter->child_total_time_running); | 1512 | atomic64_read(&counter->child_total_time_running); |
1513 | if (counter->hw_event.read_format & PERF_FORMAT_ID) | ||
1514 | values[n++] = counter->id; | ||
1513 | mutex_unlock(&counter->child_mutex); | 1515 | mutex_unlock(&counter->child_mutex); |
1514 | 1516 | ||
1515 | if (count < n * sizeof(u64)) | 1517 | if (count < n * sizeof(u64)) |
@@ -2303,7 +2305,7 @@ static void perf_counter_output(struct perf_counter *counter, | |||
2303 | u32 pid, tid; | 2305 | u32 pid, tid; |
2304 | } tid_entry; | 2306 | } tid_entry; |
2305 | struct { | 2307 | struct { |
2306 | u64 event; | 2308 | u64 id; |
2307 | u64 counter; | 2309 | u64 counter; |
2308 | } group_entry; | 2310 | } group_entry; |
2309 | struct perf_callchain_entry *callchain = NULL; | 2311 | struct perf_callchain_entry *callchain = NULL; |
@@ -2416,7 +2418,7 @@ static void perf_counter_output(struct perf_counter *counter, | |||
2416 | if (sub != counter) | 2418 | if (sub != counter) |
2417 | sub->pmu->read(sub); | 2419 | sub->pmu->read(sub); |
2418 | 2420 | ||
2419 | group_entry.event = sub->hw_event.config; | 2421 | group_entry.id = sub->id; |
2420 | group_entry.counter = atomic64_read(&sub->count); | 2422 | group_entry.counter = atomic64_read(&sub->count); |
2421 | 2423 | ||
2422 | perf_output_put(&handle, group_entry); | 2424 | perf_output_put(&handle, group_entry); |
@@ -3375,6 +3377,8 @@ done: | |||
3375 | return counter; | 3377 | return counter; |
3376 | } | 3378 | } |
3377 | 3379 | ||
3380 | static atomic64_t perf_counter_id; | ||
3381 | |||
3378 | /** | 3382 | /** |
3379 | * sys_perf_counter_open - open a performance counter, associate it to a task/cpu | 3383 | * sys_perf_counter_open - open a performance counter, associate it to a task/cpu |
3380 | * | 3384 | * |
@@ -3470,6 +3474,7 @@ SYSCALL_DEFINE5(perf_counter_open, | |||
3470 | mutex_unlock(¤t->perf_counter_mutex); | 3474 | mutex_unlock(¤t->perf_counter_mutex); |
3471 | 3475 | ||
3472 | counter->ns = get_pid_ns(current->nsproxy->pid_ns); | 3476 | counter->ns = get_pid_ns(current->nsproxy->pid_ns); |
3477 | counter->id = atomic64_inc_return(&perf_counter_id); | ||
3473 | 3478 | ||
3474 | fput_light(counter_file, fput_needed2); | 3479 | fput_light(counter_file, fput_needed2); |
3475 | 3480 | ||