[RFC PATCH v2 2/4] Add eventfd option to --decode-fds
Sahil Siddiq
icegambit91 at gmail.com
Wed May 1 17:27:59 UTC 2024
Having an eventfd option for --decode-fds will help
examine the eventfd counter associated with an eventfd
file descriptor.
* src/filter_qualify.c
(decode_fd_str_to_uint): Add "eventfd" option.
* src/number_set.h: Add DECODE_FD_EVENTFD.
* src/strace.c: Add "eventfd" option.
* src/util.c: Parse eventfd-counter and eventfd-id.
Signed-off-by: Sahil Siddiq <icegambit91 at gmail.com>
---
Changes v1 -> v2:
- src/filter_qualify.c
(parse_inject_token): Shift changes to patch #1.
- src/util.c
(parse_fdinfo_efd_id): New function.
(printeventfd): Retrieve eventfd-id. Implement "else" branch.
src/filter_qualify.c | 1 +
src/number_set.h | 1 +
src/strace.c | 3 ++-
src/util.c | 52 ++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 56 insertions(+), 1 deletion(-)
diff --git a/src/filter_qualify.c b/src/filter_qualify.c
index 87c1a6106..a79045468 100644
--- a/src/filter_qualify.c
+++ b/src/filter_qualify.c
@@ -105,6 +105,7 @@ decode_fd_str_to_uint(const char *str)
{ DECODE_FD_PATH, "path" },
{ DECODE_FD_SOCKET, "socket" },
{ DECODE_FD_DEV, "dev" },
+ { DECODE_FD_EVENTFD, "eventfd" },
{ DECODE_FD_PIDFD, "pidfd" },
{ DECODE_FD_SIGNALFD, "signalfd" },
};
diff --git a/src/number_set.h b/src/number_set.h
index 0ce2b2db6..d28ac0cdd 100644
--- a/src/number_set.h
+++ b/src/number_set.h
@@ -75,6 +75,7 @@ enum decode_fd_bits {
DECODE_FD_PATH,
DECODE_FD_SOCKET,
DECODE_FD_DEV,
+ DECODE_FD_EVENTFD,
DECODE_FD_PIDFD,
DECODE_FD_SIGNALFD,
diff --git a/src/strace.c b/src/strace.c
index c8f76cada..a5f87c3bb 100644
--- a/src/strace.c
+++ b/src/strace.c
@@ -378,7 +378,8 @@ Output format:\n\
print exit reason of kvm vcpu\n\
-e decode-fds=SET, --decode-fds=SET\n\
what kinds of file descriptor information details to decode\n\
- details: dev (device major/minor for block/char device files)\n\
+ details: dev (device major/minor for block/char device files),\n\
+ eventfd (associated eventfd counter for eventfds),\n\
path (file path),\n\
pidfd (associated PID for pidfds),\n\
socket (protocol-specific information for socket descriptors),\n\
diff --git a/src/util.c b/src/util.c
index 4140cb718..15d3dbd8b 100644
--- a/src/util.c
+++ b/src/util.c
@@ -858,6 +858,55 @@ printsignalfd(pid_t pid_of_fd, int fd, const char *path)
print_fdinfo_sigmask, NULL);
}
+static bool
+parse_fdinfo_efd_id(const char *value, void *data)
+{
+ int *efd_id = data;
+ *efd_id = string_to_uint_ex(value, NULL, INT_MAX, "\n", 10);
+ return true;
+}
+
+static bool
+parse_fdinfo_efd_counter(const char *value, void *data)
+{
+ uint64_t *efd_counter = data;
+ *efd_counter = string_to_uint_ex(value, NULL, ULLONG_MAX, "\n", 16);
+ return true;
+}
+
+static bool
+printeventfd(pid_t pid_of_fd, int fd, const char *path)
+{
+ static const char eventfd_path[] = "anon_inode:[eventfd]";
+ static const char efd_counter_pfx[] = "eventfd-count:";
+ static const char efd_id_pfx[] = "eventfd-id:";
+
+ if (strcmp(path, eventfd_path))
+ return false;
+
+ uint64_t efd_counter = -1ULL;
+ int efd_id = -1;
+
+ scan_fdinfo(pid_of_fd, fd, efd_counter_pfx, sizeof(efd_counter_pfx) - 1,
+ parse_fdinfo_efd_counter, &efd_counter);
+
+ scan_fdinfo(pid_of_fd, fd, efd_id_pfx, sizeof(efd_id_pfx) - 1,
+ parse_fdinfo_efd_id, &efd_id);
+
+ if (efd_counter != -1ULL && efd_id != -1) {
+ tprint_associated_info_begin();
+ tprints_string("eventfd-count:");
+ PRINT_VAL_U(efd_counter);
+ tprint_arg_next();
+ tprints_string("eventfd-id:");
+ PRINT_VAL_U(efd_id);
+ tprint_associated_info_end();
+ } else
+ print_string_in_angle_brackets(path);
+
+ return true;
+}
+
static void
print_quoted_string_in_angle_brackets(const char *str, const bool deleted)
{
@@ -886,6 +935,9 @@ printfd_pid_with_finfo(struct tcb *tcp, pid_t pid, int fd, const struct finfo *f
if (is_number_in_set(DECODE_FD_DEV, decode_fd_set) &&
printdev(tcp, fd, path, finfo))
goto printed;
+ if (is_number_in_set(DECODE_FD_EVENTFD, decode_fd_set) &&
+ printeventfd(pid, fd, path))
+ goto printed;
if (is_number_in_set(DECODE_FD_PIDFD, decode_fd_set) &&
printpidfd(pid, fd, path))
goto printed;
--
2.44.0
More information about the Strace-devel
mailing list