aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/events/core.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/events/core.c')
-rw-r--r--kernel/events/core.c24
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
256static inline void perf_get_cgroup(struct perf_event *event) 256static 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
261static inline void perf_put_cgroup(struct perf_event *event) 261static 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