[DTrace-devel] [PATCH v4 05/23] dtprobed: handle signals hitting dtprobed better
Nick Alcock
nick.alcock at oracle.com
Wed Feb 21 20:47:59 UTC 2024
dtprobed is long-running and thus might get hit by signals at almost any
time. These will cause long-running operations to return -EINTR, which
needs handling. We were handling -EINTR when a fuse_session_receive_buf()
happened, but dtprobed spends almost all its time blocked on poll() and that
isn't handling -EINTR at all. This came to light when tests were written
that intentionally hit dtprobed with signals: fix it by checking the poll()
for EINTR too. (Done in two places because the core FUSE loop is duplicated
for FUSE 2 and 3.)
Signed-off-by: Nick Alcock <nick.alcock at oracle.com>
---
dtprobed/dtprobed.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/dtprobed/dtprobed.c b/dtprobed/dtprobed.c
index 910b4773a89a0..4d21b3a20c9c6 100644
--- a/dtprobed/dtprobed.c
+++ b/dtprobed/dtprobed.c
@@ -779,8 +779,11 @@ loop(void)
fds[0].events = POLLIN;
while (!fuse_session_exited(cuse_session)) {
- if ((ret = poll(fds, 1, -1)) < 0)
+ if (poll(fds, 1, -1) < 0) {
+ if (errno == EINTR)
+ continue;
break;
+ }
if (fds[0].revents != 0) {
if ((ret = fuse_session_receive_buf(cuse_session,
@@ -822,8 +825,11 @@ loop(void)
struct fuse_buf fbuf = { .mem = buf, .size = bufsize };
struct fuse_chan *tmpch = cuse_chan;
- if ((ret = poll(fds, 1, -1)) < 0)
+ if (poll(fds, 1, -1) < 0) {
+ if (errno == EINTR)
+ continue;
break;
+ }
if (fds[0].revents != 0) {
if ((ret = fuse_session_receive_buf(cuse_session,
--
2.43.0.272.gce700b77fd
More information about the DTrace-devel
mailing list