|
@@ -1562,8 +1562,10 @@ static void perf_remove_from_context(struct perf_event *event, bool detach_group
|
|
|
|
|
|
if (!task) {
|
|
|
/*
|
|
|
- * Per cpu events are removed via an smp call and
|
|
|
- * the removal is always successful.
|
|
|
+ * Per cpu events are removed via an smp call. The removal can
|
|
|
+ * fail if the CPU is currently offline, but in that case we
|
|
|
+ * already called __perf_remove_from_context from
|
|
|
+ * perf_event_exit_cpu.
|
|
|
*/
|
|
|
cpu_function_call(event->cpu, __perf_remove_from_context, &re);
|
|
|
return;
|
|
@@ -8117,7 +8119,7 @@ static void perf_pmu_rotate_stop(struct pmu *pmu)
|
|
|
|
|
|
static void __perf_event_exit_context(void *__info)
|
|
|
{
|
|
|
- struct remove_event re = { .detach_group = false };
|
|
|
+ struct remove_event re = { .detach_group = true };
|
|
|
struct perf_event_context *ctx = __info;
|
|
|
|
|
|
perf_pmu_rotate_stop(ctx->pmu);
|