diff options
Diffstat (limited to 'kernel/events/core.c')
-rw-r--r-- | kernel/events/core.c | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c index a6a9ec4cd8f5..d7d71d6ec972 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
@@ -253,9 +253,9 @@ perf_cgroup_match(struct perf_event *event) | |||
253 | return !event->cgrp || event->cgrp == cpuctx->cgrp; | 253 | return !event->cgrp || event->cgrp == cpuctx->cgrp; |
254 | } | 254 | } |
255 | 255 | ||
256 | static inline void perf_get_cgroup(struct perf_event *event) | 256 | static inline bool perf_tryget_cgroup(struct perf_event *event) |
257 | { | 257 | { |
258 | css_get(&event->cgrp->css); | 258 | return css_tryget(&event->cgrp->css); |
259 | } | 259 | } |
260 | 260 | ||
261 | static inline void perf_put_cgroup(struct perf_event *event) | 261 | static inline void perf_put_cgroup(struct perf_event *event) |
@@ -484,7 +484,11 @@ static inline int perf_cgroup_connect(int fd, struct perf_event *event, | |||
484 | event->cgrp = cgrp; | 484 | event->cgrp = cgrp; |
485 | 485 | ||
486 | /* must be done before we fput() the file */ | 486 | /* must be done before we fput() the file */ |
487 | perf_get_cgroup(event); | 487 | if (!perf_tryget_cgroup(event)) { |
488 | event->cgrp = NULL; | ||
489 | ret = -ENOENT; | ||
490 | goto out; | ||
491 | } | ||
488 | 492 | ||
489 | /* | 493 | /* |
490 | * all events in a group must monitor | 494 | * all events in a group must monitor |
@@ -3181,9 +3185,8 @@ static void perf_event_for_each(struct perf_event *event, | |||
3181 | event = event->group_leader; | 3185 | event = event->group_leader; |
3182 | 3186 | ||
3183 | perf_event_for_each_child(event, func); | 3187 | perf_event_for_each_child(event, func); |
3184 | func(event); | ||
3185 | list_for_each_entry(sibling, &event->sibling_list, group_entry) | 3188 | list_for_each_entry(sibling, &event->sibling_list, group_entry) |
3186 | perf_event_for_each_child(event, func); | 3189 | perf_event_for_each_child(sibling, func); |
3187 | mutex_unlock(&ctx->mutex); | 3190 | mutex_unlock(&ctx->mutex); |
3188 | } | 3191 | } |
3189 | 3192 | ||
@@ -4957,7 +4960,7 @@ void __perf_sw_event(u32 event_id, u64 nr, struct pt_regs *regs, u64 addr) | |||
4957 | if (rctx < 0) | 4960 | if (rctx < 0) |
4958 | return; | 4961 | return; |
4959 | 4962 | ||
4960 | perf_sample_data_init(&data, addr); | 4963 | perf_sample_data_init(&data, addr, 0); |
4961 | 4964 | ||
4962 | do_perf_sw_event(PERF_TYPE_SOFTWARE, event_id, nr, &data, regs); | 4965 | do_perf_sw_event(PERF_TYPE_SOFTWARE, event_id, nr, &data, regs); |
4963 | 4966 | ||
@@ -5215,7 +5218,7 @@ void perf_tp_event(u64 addr, u64 count, void *record, int entry_size, | |||
5215 | .data = record, | 5218 | .data = record, |
5216 | }; | 5219 | }; |
5217 | 5220 | ||
5218 | perf_sample_data_init(&data, addr); | 5221 | perf_sample_data_init(&data, addr, 0); |
5219 | data.raw = &raw; | 5222 | data.raw = &raw; |
5220 | 5223 | ||
5221 | hlist_for_each_entry_rcu(event, node, head, hlist_entry) { | 5224 | hlist_for_each_entry_rcu(event, node, head, hlist_entry) { |
@@ -5318,7 +5321,7 @@ void perf_bp_event(struct perf_event *bp, void *data) | |||
5318 | struct perf_sample_data sample; | 5321 | struct perf_sample_data sample; |
5319 | struct pt_regs *regs = data; | 5322 | struct pt_regs *regs = data; |
5320 | 5323 | ||
5321 | perf_sample_data_init(&sample, bp->attr.bp_addr); | 5324 | perf_sample_data_init(&sample, bp->attr.bp_addr, 0); |
5322 | 5325 | ||
5323 | if (!bp->hw.state && !perf_exclude_event(bp, regs)) | 5326 | if (!bp->hw.state && !perf_exclude_event(bp, regs)) |
5324 | perf_swevent_event(bp, 1, &sample, regs); | 5327 | perf_swevent_event(bp, 1, &sample, regs); |
@@ -5344,13 +5347,12 @@ static enum hrtimer_restart perf_swevent_hrtimer(struct hrtimer *hrtimer) | |||
5344 | 5347 | ||
5345 | event->pmu->read(event); | 5348 | event->pmu->read(event); |
5346 | 5349 | ||
5347 | perf_sample_data_init(&data, 0); | 5350 | perf_sample_data_init(&data, 0, event->hw.last_period); |
5348 | data.period = event->hw.last_period; | ||
5349 | regs = get_irq_regs(); | 5351 | regs = get_irq_regs(); |
5350 | 5352 | ||
5351 | if (regs && !perf_exclude_event(event, regs)) { | 5353 | if (regs && !perf_exclude_event(event, regs)) { |
5352 | if (!(event->attr.exclude_idle && is_idle_task(current))) | 5354 | if (!(event->attr.exclude_idle && is_idle_task(current))) |
5353 | if (perf_event_overflow(event, &data, regs)) | 5355 | if (__perf_event_overflow(event, 1, &data, regs)) |
5354 | ret = HRTIMER_NORESTART; | 5356 | ret = HRTIMER_NORESTART; |
5355 | } | 5357 | } |
5356 | 5358 | ||