Revert "perf: Break deadlock involving exec_update_mutex"

This reverts commit 71b8355ba6 which is
commit 78af4dc949daaa37b3fcd5f348f373085b4e858f upstream.

It breaks the ABI and isn't needed for 5.4 at the moment.

Bug: 161946584
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Change-Id: I7f08da307b31be1b9395aa0492ae15d42b7cdb44
This commit is contained in:
Greg Kroah-Hartman 2021-01-11 14:42:01 +01:00
commit 488fa3f59b

View file

@ -11036,6 +11036,24 @@ SYSCALL_DEFINE5(perf_event_open,
goto err_task;
}
if (task) {
err = mutex_lock_interruptible(&task->signal->exec_update_mutex);
if (err)
goto err_task;
/*
* Reuse ptrace permission checks for now.
*
* 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).
*/
err = -EACCES;
if (!ptrace_may_access(task, PTRACE_MODE_READ_REALCREDS))
goto err_cred;
}
if (flags & PERF_FLAG_PID_CGROUP)
cgroup_fd = pid;
@ -11043,7 +11061,7 @@ SYSCALL_DEFINE5(perf_event_open,
NULL, NULL, cgroup_fd);
if (IS_ERR(event)) {
err = PTR_ERR(event);
goto err_task;
goto err_cred;
}
if (is_sampling_event(event)) {
@ -11162,24 +11180,6 @@ SYSCALL_DEFINE5(perf_event_open,
goto err_context;
}
if (task) {
err = mutex_lock_interruptible(&task->signal->exec_update_mutex);
if (err)
goto err_file;
/*
* Preserve ptrace permission check for backwards compatibility.
*
* 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).
*/
err = -EACCES;
if (!ptrace_may_access(task, PTRACE_MODE_READ_REALCREDS))
goto err_cred;
}
if (move_group) {
gctx = __perf_event_ctx_lock_double(group_leader, ctx);
@ -11355,10 +11355,7 @@ err_locked:
if (move_group)
perf_event_ctx_unlock(group_leader, gctx);
mutex_unlock(&ctx->mutex);
err_cred:
if (task)
mutex_unlock(&task->signal->exec_update_mutex);
err_file:
/* err_file: */
fput(event_file);
err_context:
perf_unpin_context(ctx);
@ -11370,6 +11367,9 @@ err_alloc:
*/
if (!event_file)
free_event(event);
err_cred:
if (task)
mutex_unlock(&task->signal->exec_update_mutex);
err_task:
if (task)
put_task_struct(task);