{
raw_spin_lock(&ctx->lock);
- /*
- * Rotate the first entry last of non-pinned groups. Rotation might be
- * disabled by the inheritance code.
- */
- if (!ctx->rotate_disable)
- list_rotate_left(&ctx->flexible_groups);
+ /* Rotate the first entry last of non-pinned groups */
+ list_rotate_left(&ctx->flexible_groups);
raw_spin_unlock(&ctx->lock);
}
unsigned long flags;
raw_spin_lock_irqsave(&ctx->lock, flags);
- /*
- * may read while context is not active
- * (e.g., thread is blocked), in that case
- * we cannot update context time
- */
- if (ctx->is_active)
- update_context_time(ctx);
+ update_context_time(ctx);
update_event_times(event);
raw_spin_unlock_irqrestore(&ctx->lock, flags);
}
struct perf_event *event;
struct task_struct *parent = current;
int inherited_all = 1;
- unsigned long flags;
int ret = 0;
child->perf_event_ctxp = NULL;
break;
}
- /*
- * We can't hold ctx->lock when iterating the ->flexible_group list due
- * to allocations, but we need to prevent rotation because
- * rotate_ctx() will change the list from interrupt context.
- */
- raw_spin_lock_irqsave(&parent_ctx->lock, flags);
- parent_ctx->rotate_disable = 1;
- raw_spin_unlock_irqrestore(&parent_ctx->lock, flags);
-
list_for_each_entry(event, &parent_ctx->flexible_groups, group_entry) {
ret = inherit_task_group(event, parent, parent_ctx, child,
&inherited_all);
break;
}
- raw_spin_lock_irqsave(&parent_ctx->lock, flags);
- parent_ctx->rotate_disable = 0;
- raw_spin_unlock_irqrestore(&parent_ctx->lock, flags);
-
child_ctx = child->perf_event_ctxp;
if (child_ctx && inherited_all) {