Revert "Revert "perf: Use new infrastructure to fix deadlocks in execve""

This reverts commit 396b389355 which is
commit 6914303824bb572278568330d72fc1f8f9814e67 upstream.  We want it
back for a bit to help with merges only.  It will be dropped again
afterward...

Bug: 161946584
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Change-Id: I088246e3ded009f3a0d99bda098e077a0b5302fb
This commit is contained in:
Greg Kroah-Hartman 2021-01-11 14:18:28 +01:00
commit 7ce628250f

View file

@ -1254,7 +1254,7 @@ static void put_ctx(struct perf_event_context *ctx)
* function.
*
* Lock order:
* cred_guard_mutex
* exec_update_mutex
* task_struct::perf_event_mutex
* perf_event_context::mutex
* perf_event::child_mutex;
@ -11037,14 +11037,14 @@ SYSCALL_DEFINE5(perf_event_open,
}
if (task) {
err = mutex_lock_interruptible(&task->signal->cred_guard_mutex);
err = mutex_lock_interruptible(&task->signal->exec_update_mutex);
if (err)
goto err_task;
/*
* Reuse ptrace permission checks for now.
*
* We must hold cred_guard_mutex across this and any potential
* We must hold exec_update_mutex across this and any potential
* perf_install_in_context() call for this new event to
* serialize against exec() altering our credentials (and the
* perf_event_exit_task() that could imply).
@ -11333,7 +11333,7 @@ SYSCALL_DEFINE5(perf_event_open,
mutex_unlock(&ctx->mutex);
if (task) {
mutex_unlock(&task->signal->cred_guard_mutex);
mutex_unlock(&task->signal->exec_update_mutex);
put_task_struct(task);
}
@ -11369,7 +11369,7 @@ err_alloc:
free_event(event);
err_cred:
if (task)
mutex_unlock(&task->signal->cred_guard_mutex);
mutex_unlock(&task->signal->exec_update_mutex);
err_task:
if (task)
put_task_struct(task);
@ -11674,7 +11674,7 @@ static void perf_event_exit_task_context(struct task_struct *child, int ctxn)
/*
* When a child task exits, feed back event values to parent events.
*
* Can be called with cred_guard_mutex held when called from
* Can be called with exec_update_mutex held when called from
* install_exec_creds().
*/
void perf_event_exit_task(struct task_struct *child)