diff options
Diffstat (limited to 'kernel/events/core.c')
| -rw-r--r-- | kernel/events/core.c | 20 | 
1 files changed, 11 insertions, 9 deletions
| diff --git a/kernel/events/core.c b/kernel/events/core.c index f79fd8b87f75..435815d3be3f 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -2163,7 +2163,7 @@ static void perf_group_detach(struct perf_event *event)  		/* Inherit group flags from the previous leader */  		sibling->group_caps = event->group_caps; -		if (!RB_EMPTY_NODE(&event->group_node)) { +		if (sibling->attach_state & PERF_ATTACH_CONTEXT) {  			add_event_to_groups(sibling, event->ctx);  			if (sibling->state == PERF_EVENT_STATE_ACTIVE) @@ -3872,7 +3872,7 @@ ctx_sched_in(struct perf_event_context *ctx, enum event_type_t event_type)  	if (likely(!ctx->nr_events))  		return; -	if (is_active ^ EVENT_TIME) { +	if (!(is_active & EVENT_TIME)) {  		/* start ctx time */  		__update_context_time(ctx, false);  		perf_cgroup_set_timestamp(cpuctx); @@ -9187,7 +9187,7 @@ static void perf_event_bpf_output(struct perf_event *event, void *data)  	perf_event_header__init_id(&bpf_event->event_id.header,  				   &sample, event); -	ret = perf_output_begin(&handle, data, event, +	ret = perf_output_begin(&handle, &sample, event,  				bpf_event->event_id.header.size);  	if (ret)  		return; @@ -12173,7 +12173,7 @@ perf_event_set_output(struct perf_event *event, struct perf_event *output_event)  	/*  	 * If its not a per-cpu rb, it must be the same task.  	 */ -	if (output_event->cpu == -1 && output_event->ctx != event->ctx) +	if (output_event->cpu == -1 && output_event->hw.target != event->hw.target)  		goto out;  	/* @@ -12893,12 +12893,14 @@ void perf_pmu_migrate_context(struct pmu *pmu, int src_cpu, int dst_cpu)  	__perf_pmu_remove(src_ctx, src_cpu, pmu, &src_ctx->pinned_groups, &events);  	__perf_pmu_remove(src_ctx, src_cpu, pmu, &src_ctx->flexible_groups, &events); -	/* -	 * Wait for the events to quiesce before re-instating them. -	 */ -	synchronize_rcu(); +	if (!list_empty(&events)) { +		/* +		 * Wait for the events to quiesce before re-instating them. +		 */ +		synchronize_rcu(); -	__perf_pmu_install(dst_ctx, dst_cpu, pmu, &events); +		__perf_pmu_install(dst_ctx, dst_cpu, pmu, &events); +	}  	mutex_unlock(&dst_ctx->mutex);  	mutex_unlock(&src_ctx->mutex); |