[PATCH RFC POC 38/50] perf: stop putting the event descriptor back on failure
From: Christian Brauner
Date: Tue Sep 15 2026 - 09:14:17 EST
Rely on the fd exit path machinery.
Signed-off-by: Christian Brauner (Amutable) <brauner@xxxxxxxxxx>
---
kernel/events/core.c | 31 +++++++++++--------------------
1 file changed, 11 insertions(+), 20 deletions(-)
diff --git a/kernel/events/core.c b/kernel/events/core.c
index a6c8e38a3110..54834a7aca53 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -13924,7 +13924,7 @@ SYSCALL_DEFINE5(perf_event_open,
struct file *event_file = NULL;
struct task_struct *task = NULL;
struct pmu *pmu;
- int event_fd;
+ const struct fd_slot *event_fd;
int move_group = 0;
int err;
int f_flags = O_RDWR;
@@ -13990,9 +13990,9 @@ SYSCALL_DEFINE5(perf_event_open,
if (flags & PERF_FLAG_FD_CLOEXEC)
f_flags |= O_CLOEXEC;
- event_fd = get_unused_fd_flags(f_flags);
- if (event_fd < 0)
- return event_fd;
+ event_fd = fd_prepare(f_flags);
+ if (IS_ERR(event_fd))
+ return PTR_ERR(event_fd);
/*
* Event creation should be under SRCU, see perf_pmu_unregister().
@@ -14001,15 +14001,11 @@ SYSCALL_DEFINE5(perf_event_open,
CLASS(fd, group)(group_fd); // group_fd == -1 => empty
if (group_fd != -1) {
- if (!is_perf_file(group)) {
- err = -EBADF;
- goto err_fd;
- }
+ if (!is_perf_file(group))
+ return -EBADF;
group_leader = fd_file(group)->private_data;
- if (group_leader->state <= PERF_EVENT_STATE_EXIT) {
- err = -ENODEV;
- goto err_fd;
- }
+ if (group_leader->state <= PERF_EVENT_STATE_EXIT)
+ return -ENODEV;
if (flags & PERF_FLAG_FD_OUTPUT)
output_event = group_leader;
if (flags & PERF_FLAG_FD_NO_GROUP)
@@ -14018,10 +14014,8 @@ SYSCALL_DEFINE5(perf_event_open,
if (pid != -1 && !(flags & PERF_FLAG_PID_CGROUP)) {
task = find_lively_task_by_vpid(pid);
- if (IS_ERR(task)) {
- err = PTR_ERR(task);
- goto err_fd;
- }
+ if (IS_ERR(task))
+ return PTR_ERR(task);
}
if (task && group_leader &&
@@ -14298,8 +14292,7 @@ SYSCALL_DEFINE5(perf_event_open,
* This ensures destruction of the group leader will find
* the pointer to itself in perf_group_detach().
*/
- fd_install(event_fd, event_file);
- return event_fd;
+ return fd_stage(event_fd, event_file);
err_context:
put_pmu_ctx(event->pmu_ctx);
@@ -14316,8 +14309,6 @@ SYSCALL_DEFINE5(perf_event_open,
err_task:
if (task)
put_task_struct(task);
-err_fd:
- put_unused_fd(event_fd);
return err;
}
--
2.53.0