Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b93f7978 authored by Xiao Guangrong's avatar Xiao Guangrong Committed by Ingo Molnar
Browse files

perf_event: Allocate children's perf_event_ctxp at the right time



In current code, children task will allocate memory for
'child->perf_event_ctxp' if the parent is counted, we can
do it only if the parent allowed children inherit it.

It can save memory and reduce overhead.

Signed-off-by: default avatarXiao Guangrong <xiaoguangrong@cn.fujitsu.com>
Reviewed-by: default avatarFrederic Weisbecker <fweisbec@gmail.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Paul Mackerras <paulus@samba.org>
LKML-Reference: <4B1F19A8.5040805@cn.fujitsu.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent aa5452d7
Loading
Loading
Loading
Loading
+22 −15
Original line number Diff line number Diff line
@@ -5083,7 +5083,7 @@ again:
 */
int perf_event_init_task(struct task_struct *child)
{
	struct perf_event_context *child_ctx, *parent_ctx;
	struct perf_event_context *child_ctx = NULL, *parent_ctx;
	struct perf_event_context *cloned_ctx;
	struct perf_event *event;
	struct task_struct *parent = current;
@@ -5098,20 +5098,6 @@ int perf_event_init_task(struct task_struct *child)
	if (likely(!parent->perf_event_ctxp))
		return 0;

	/*
	 * This is executed from the parent task context, so inherit
	 * events that have been marked for cloning.
	 * First allocate and initialize a context for the child.
	 */

	child_ctx = kzalloc(sizeof(struct perf_event_context), GFP_KERNEL);
	if (!child_ctx)
		return -ENOMEM;

	__perf_event_init_context(child_ctx, child);
	child->perf_event_ctxp = child_ctx;
	get_task_struct(child);

	/*
	 * If the parent's context is a clone, pin it so it won't get
	 * swapped under us.
@@ -5142,6 +5128,26 @@ int perf_event_init_task(struct task_struct *child)
			continue;
		}

		if (!child->perf_event_ctxp) {
			/*
			 * This is executed from the parent task context, so
			 * inherit events that have been marked for cloning.
			 * First allocate and initialize a context for the
			 * child.
			 */

			child_ctx = kzalloc(sizeof(struct perf_event_context),
					    GFP_KERNEL);
			if (!child_ctx) {
				ret = -ENOMEM;
				goto exit;
			}

			__perf_event_init_context(child_ctx, child);
			child->perf_event_ctxp = child_ctx;
			get_task_struct(child);
		}

		ret = inherit_group(event, parent, parent_ctx,
					     child, child_ctx);
		if (ret) {
@@ -5170,6 +5176,7 @@ int perf_event_init_task(struct task_struct *child)
		get_ctx(child_ctx->parent_ctx);
	}

exit:
	mutex_unlock(&parent_ctx->mutex);

	perf_unpin_context(parent_ctx);