commit: 34258478c8b3a535f9f4a4666f2cbb38aecff054
Author: Michał Górny <mgorny <AT> gentoo <DOT> org>
AuthorDate: Fri Dec 19 19:32:52 2025 +0000
Commit: Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Fri Dec 19 19:32:52 2025 +0000
URL: https://gitweb.gentoo.org/proj/steve.git/commit/?id=34258478
Optimize open handler
Signed-off-by: Michał Górny <mgorny <AT> gentoo.org>
steve.cxx | 60 +++++++++++++++++++++++++++++++++---------------------------
1 file changed, 33 insertions(+), 27 deletions(-)
diff --git a/steve.cxx b/steve.cxx
index 46b2fba..433c25b 100644
--- a/steve.cxx
+++ b/steve.cxx
@@ -404,6 +404,16 @@ static void steve_open(fuse_req_t req, struct
fuse_file_info *fi)
static_assert(sizeof(fi->fh) >= sizeof(context->pid));
fi->fh = context->pid;
+ auto process_it = state->processes.find(fi->fh);
+ if (process_it != state->processes.end()) {
+ if (state->verbose)
+ std::print(stderr, "Device open again by PID {}\n",
fi->fh);
+ assert(process_it->second.pid_fd != -1);
+ assert(process_it->second.pidfd_event);
+ fuse_reply_open(req, fi);
+ return;
+ }
+
std::string cmdline;
std::string path = std::format("/proc/{}/cmdline", fi->fh);
if (FILE *cmdline_file = fopen(path.c_str(), "r")) {
@@ -419,41 +429,37 @@ static void steve_open(fuse_req_t req, struct
fuse_file_info *fi)
}
if (state->verbose) {
- if (cmdline[0]) {
+ if (!cmdline.empty()) {
std::print(stderr, "Device open by PID {} ({})\n",
fi->fh, cmdline);
} else
std::print(stderr, "Device open by PID {} (process name
unknown)\n", fi->fh);
}
- if (state->processes.find(fi->fh) != state->processes.end()) {
- assert(state->processes[fi->fh].pid_fd != -1);
- assert(state->processes[fi->fh].pidfd_event);
- } else {
- int pid_fd = syscall(SYS_pidfd_open, context->pid, 0);
- if (pid_fd == -1) {
- perror("unable to open pidfd, rejecting to open");
- fuse_reply_err(req, EIO);
- return;
- }
-
- event_ptr pidfd_event{event_new(state->evb, pid_fd,
EV_READ|EV_PERSIST, steve_handle_pidfd, state), event_free};
- if (!pidfd_event) {
- std::print(stderr, "unable to allocate event for
pidfd");
- close(pid_fd);
- fuse_reply_err(req, EIO);
- return;
- }
- if (event_add(pidfd_event.get(), nullptr) == -1) {
- std::print(stderr, "failed to enable pidfd handler");
- close(pid_fd);
- fuse_reply_err(req, EIO);
- return;
- }
+ int pid_fd = syscall(SYS_pidfd_open, context->pid, 0);
+ if (pid_fd == -1) {
+ std::print(stderr, "Unable to open pidfd for PID {}, rejecting
to open: {}\n",
+ fi->fh, strerror(errno));
+ fuse_reply_err(req, EIO);
+ return;
+ }
- state->processes[fi->fh].pid_fd = pid_fd;
- state->processes[fi->fh].pidfd_event = std::move(pidfd_event);
+ event_ptr pidfd_event{event_new(state->evb, pid_fd, EV_READ|EV_PERSIST,
steve_handle_pidfd, state), event_free};
+ if (!pidfd_event) {
+ std::print(stderr, "Unable to allocate pidfd event for PID
{}\n", fi->fh);
+ close(pid_fd);
+ fuse_reply_err(req, EIO);
+ return;
+ }
+ if (event_add(pidfd_event.get(), nullptr) == -1) {
+ std::print(stderr, "Unable to enable pidfd event for PID {}\n",
fi->fh);
+ close(pid_fd);
+ fuse_reply_err(req, EIO);
+ return;
}
+ steve_process *process = &state->processes[fi->fh];
+ process->pid_fd = pid_fd;
+ process->pidfd_event = std::move(pidfd_event);
fuse_reply_open(req, fi);
}