|
@@ -4372,7 +4372,9 @@ EXPORT_SYMBOL_GPL(perf_event_read_value);
|
|
static int __perf_read_group_add(struct perf_event *leader,
|
|
static int __perf_read_group_add(struct perf_event *leader,
|
|
u64 read_format, u64 *values)
|
|
u64 read_format, u64 *values)
|
|
{
|
|
{
|
|
|
|
+ struct perf_event_context *ctx = leader->ctx;
|
|
struct perf_event *sub;
|
|
struct perf_event *sub;
|
|
|
|
+ unsigned long flags;
|
|
int n = 1; /* skip @nr */
|
|
int n = 1; /* skip @nr */
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
@@ -4402,12 +4404,15 @@ static int __perf_read_group_add(struct perf_event *leader,
|
|
if (read_format & PERF_FORMAT_ID)
|
|
if (read_format & PERF_FORMAT_ID)
|
|
values[n++] = primary_event_id(leader);
|
|
values[n++] = primary_event_id(leader);
|
|
|
|
|
|
|
|
+ raw_spin_lock_irqsave(&ctx->lock, flags);
|
|
|
|
+
|
|
list_for_each_entry(sub, &leader->sibling_list, group_entry) {
|
|
list_for_each_entry(sub, &leader->sibling_list, group_entry) {
|
|
values[n++] += perf_event_count(sub);
|
|
values[n++] += perf_event_count(sub);
|
|
if (read_format & PERF_FORMAT_ID)
|
|
if (read_format & PERF_FORMAT_ID)
|
|
values[n++] = primary_event_id(sub);
|
|
values[n++] = primary_event_id(sub);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ raw_spin_unlock_irqrestore(&ctx->lock, flags);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|