dcavalca / rpms / systemd

Forked from rpms/systemd 4 months ago
Clone
Zbigniew Jędrzejewski-Szmek 4fcd50
From 3552ac862497bdb5ea73639851bbfd114b795fa2 Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek 4fcd50
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
Zbigniew Jędrzejewski-Szmek 4fcd50
Date: Thu, 11 Mar 2021 20:41:36 +0100
Zbigniew Jędrzejewski-Szmek 4fcd50
Subject: [PATCH] Revert "sd-event: make use of epoll_pwait2() for greater time
Zbigniew Jędrzejewski-Szmek 4fcd50
 accuracy"
Zbigniew Jędrzejewski-Szmek 4fcd50
Zbigniew Jędrzejewski-Szmek 4fcd50
This reverts commit 798445ab84cff51bde7fcf936f0fb19c37cf858c.
Zbigniew Jędrzejewski-Szmek 4fcd50
Zbigniew Jędrzejewski-Szmek 4fcd50
Unfortunately this causes test-event to hang. 32 bit architectures seem
Zbigniew Jędrzejewski-Szmek 4fcd50
affected: i686 and arm32 in fedora koji. 32 bit build of test-event hangs
Zbigniew Jędrzejewski-Szmek 4fcd50
reliably under valgrind:
Zbigniew Jędrzejewski-Szmek 4fcd50
Zbigniew Jędrzejewski-Szmek 4fcd50
$ PKG_CONFIG_LIBDIR=/usr/lib/pkgconfig meson build-32 -Dc_args=-m32 -Dc_link_args=-m32 -Dcpp_args=-m32 -Dcpp_link_args=-m32 && ninja -C build-32 test-event && valgrind build/test-event
Zbigniew Jędrzejewski-Szmek 4fcd50
---
Zbigniew Jędrzejewski-Szmek 4fcd50
 src/libsystemd/sd-event/sd-event.c | 73 ++++++------------------------
Zbigniew Jędrzejewski-Szmek 4fcd50
 1 file changed, 14 insertions(+), 59 deletions(-)
Zbigniew Jędrzejewski-Szmek 4fcd50
Zbigniew Jędrzejewski-Szmek 4fcd50
diff --git a/src/libsystemd/sd-event/sd-event.c b/src/libsystemd/sd-event/sd-event.c
Zbigniew Jędrzejewski-Szmek 4fcd50
index 8ab9d419af..69d9c5e780 100644
Zbigniew Jędrzejewski-Szmek 4fcd50
--- a/src/libsystemd/sd-event/sd-event.c
Zbigniew Jędrzejewski-Szmek 4fcd50
+++ b/src/libsystemd/sd-event/sd-event.c
Zbigniew Jędrzejewski-Szmek 4fcd50
@@ -3781,59 +3781,9 @@ pending:
Zbigniew Jędrzejewski-Szmek 4fcd50
         return r;
Zbigniew Jędrzejewski-Szmek 4fcd50
 }
Zbigniew Jędrzejewski-Szmek 4fcd50
 
Zbigniew Jędrzejewski-Szmek 4fcd50
-static int epoll_wait_usec(
Zbigniew Jędrzejewski-Szmek 4fcd50
-                int fd,
Zbigniew Jędrzejewski-Szmek 4fcd50
-                struct epoll_event *events,
Zbigniew Jędrzejewski-Szmek 4fcd50
-                int maxevents,
Zbigniew Jędrzejewski-Szmek 4fcd50
-                usec_t timeout) {
Zbigniew Jędrzejewski-Szmek 4fcd50
-
Zbigniew Jędrzejewski-Szmek 4fcd50
-        static bool epoll_pwait2_absent = false;
Zbigniew Jędrzejewski-Szmek 4fcd50
-        int r, msec;
Zbigniew Jędrzejewski-Szmek 4fcd50
-
Zbigniew Jędrzejewski-Szmek 4fcd50
-        /* A wrapper that uses epoll_pwait2() if available, and falls back to epoll_wait() if not */
Zbigniew Jędrzejewski-Szmek 4fcd50
-
Zbigniew Jędrzejewski-Szmek 4fcd50
-        if (!epoll_pwait2_absent && timeout != USEC_INFINITY) {
Zbigniew Jędrzejewski-Szmek 4fcd50
-                struct timespec ts;
Zbigniew Jędrzejewski-Szmek 4fcd50
-
Zbigniew Jędrzejewski-Szmek 4fcd50
-                r = epoll_pwait2(fd,
Zbigniew Jędrzejewski-Szmek 4fcd50
-                                 events,
Zbigniew Jędrzejewski-Szmek 4fcd50
-                                 maxevents,
Zbigniew Jędrzejewski-Szmek 4fcd50
-                                 timespec_store(&ts, timeout),
Zbigniew Jędrzejewski-Szmek 4fcd50
-                                 NULL);
Zbigniew Jędrzejewski-Szmek 4fcd50
-                if (r >= 0)
Zbigniew Jędrzejewski-Szmek 4fcd50
-                        return r;
Zbigniew Jędrzejewski-Szmek 4fcd50
-                if (!ERRNO_IS_NOT_SUPPORTED(r) && !ERRNO_IS_PRIVILEGE(r))
Zbigniew Jędrzejewski-Szmek 4fcd50
-                        return -errno; /* Only fallback to old epoll_wait() if the syscall is masked or not
Zbigniew Jędrzejewski-Szmek 4fcd50
-                                        * supported. */
Zbigniew Jędrzejewski-Szmek 4fcd50
-
Zbigniew Jędrzejewski-Szmek 4fcd50
-                epoll_pwait2_absent = true;
Zbigniew Jędrzejewski-Szmek 4fcd50
-        }
Zbigniew Jędrzejewski-Szmek 4fcd50
-
Zbigniew Jędrzejewski-Szmek 4fcd50
-        if (timeout == USEC_INFINITY)
Zbigniew Jędrzejewski-Szmek 4fcd50
-                msec = -1;
Zbigniew Jędrzejewski-Szmek 4fcd50
-        else {
Zbigniew Jędrzejewski-Szmek 4fcd50
-                usec_t k;
Zbigniew Jędrzejewski-Szmek 4fcd50
-
Zbigniew Jędrzejewski-Szmek 4fcd50
-                k = DIV_ROUND_UP(timeout, USEC_PER_MSEC);
Zbigniew Jędrzejewski-Szmek 4fcd50
-                if (k >= INT_MAX)
Zbigniew Jędrzejewski-Szmek 4fcd50
-                        msec = INT_MAX; /* Saturate */
Zbigniew Jędrzejewski-Szmek 4fcd50
-                else
Zbigniew Jędrzejewski-Szmek 4fcd50
-                        msec = (int) k;
Zbigniew Jędrzejewski-Szmek 4fcd50
-        }
Zbigniew Jędrzejewski-Szmek 4fcd50
-
Zbigniew Jędrzejewski-Szmek 4fcd50
-        r = epoll_wait(fd,
Zbigniew Jędrzejewski-Szmek 4fcd50
-                       events,
Zbigniew Jędrzejewski-Szmek 4fcd50
-                       maxevents,
Zbigniew Jędrzejewski-Szmek 4fcd50
-                       msec);
Zbigniew Jędrzejewski-Szmek 4fcd50
-        if (r < 0)
Zbigniew Jędrzejewski-Szmek 4fcd50
-                return -errno;
Zbigniew Jędrzejewski-Szmek 4fcd50
-
Zbigniew Jędrzejewski-Szmek 4fcd50
-        return r;
Zbigniew Jędrzejewski-Szmek 4fcd50
-}
Zbigniew Jędrzejewski-Szmek 4fcd50
-
Zbigniew Jędrzejewski-Szmek 4fcd50
 _public_ int sd_event_wait(sd_event *e, uint64_t timeout) {
Zbigniew Jędrzejewski-Szmek 4fcd50
         size_t n_event_queue, m;
Zbigniew Jędrzejewski-Szmek 4fcd50
-        int r;
Zbigniew Jędrzejewski-Szmek 4fcd50
+        int r, msec;
Zbigniew Jędrzejewski-Szmek 4fcd50
 
Zbigniew Jędrzejewski-Szmek 4fcd50
         assert_return(e, -EINVAL);
Zbigniew Jędrzejewski-Szmek 4fcd50
         assert_return(e = event_resolve(e), -ENOPKG);
Zbigniew Jędrzejewski-Szmek 4fcd50
@@ -3852,16 +3802,21 @@ _public_ int sd_event_wait(sd_event *e, uint64_t timeout) {
Zbigniew Jędrzejewski-Szmek 4fcd50
 
Zbigniew Jędrzejewski-Szmek 4fcd50
         /* If we still have inotify data buffered, then query the other fds, but don't wait on it */
Zbigniew Jędrzejewski-Szmek 4fcd50
         if (e->inotify_data_buffered)
Zbigniew Jędrzejewski-Szmek 4fcd50
-                timeout = 0;
Zbigniew Jędrzejewski-Szmek 4fcd50
+                msec = 0;
Zbigniew Jędrzejewski-Szmek 4fcd50
+        else
Zbigniew Jędrzejewski-Szmek 4fcd50
+                msec = timeout == (uint64_t) -1 ? -1 : (int) DIV_ROUND_UP(timeout, USEC_PER_MSEC);
Zbigniew Jędrzejewski-Szmek 4fcd50
 
Zbigniew Jędrzejewski-Szmek 4fcd50
         for (;;) {
Zbigniew Jędrzejewski-Szmek 4fcd50
-                r = epoll_wait_usec(e->epoll_fd, e->event_queue, e->event_queue_allocated, timeout);
Zbigniew Jędrzejewski-Szmek 4fcd50
-                if (r == -EINTR) {
Zbigniew Jędrzejewski-Szmek 4fcd50
-                        e->state = SD_EVENT_PENDING;
Zbigniew Jędrzejewski-Szmek 4fcd50
-                        return 1;
Zbigniew Jędrzejewski-Szmek 4fcd50
-                }
Zbigniew Jędrzejewski-Szmek 4fcd50
-                if (r < 0)
Zbigniew Jędrzejewski-Szmek 4fcd50
+                r = epoll_wait(e->epoll_fd, e->event_queue, e->event_queue_allocated, msec);
Zbigniew Jędrzejewski-Szmek 4fcd50
+                if (r < 0) {
Zbigniew Jędrzejewski-Szmek 4fcd50
+                        if (errno == EINTR) {
Zbigniew Jędrzejewski-Szmek 4fcd50
+                                e->state = SD_EVENT_PENDING;
Zbigniew Jędrzejewski-Szmek 4fcd50
+                                return 1;
Zbigniew Jędrzejewski-Szmek 4fcd50
+                        }
Zbigniew Jędrzejewski-Szmek 4fcd50
+
Zbigniew Jędrzejewski-Szmek 4fcd50
+                        r = -errno;
Zbigniew Jędrzejewski-Szmek 4fcd50
                         goto finish;
Zbigniew Jędrzejewski-Szmek 4fcd50
+                }
Zbigniew Jędrzejewski-Szmek 4fcd50
 
Zbigniew Jędrzejewski-Szmek 4fcd50
                 m = (size_t) r;
Zbigniew Jędrzejewski-Szmek 4fcd50
 
Zbigniew Jędrzejewski-Szmek 4fcd50
@@ -3874,7 +3829,7 @@ _public_ int sd_event_wait(sd_event *e, uint64_t timeout) {
Zbigniew Jędrzejewski-Szmek 4fcd50
                 if (!GREEDY_REALLOC(e->event_queue, e->event_queue_allocated, e->event_queue_allocated + n_event_queue))
Zbigniew Jędrzejewski-Szmek 4fcd50
                         return -ENOMEM;
Zbigniew Jędrzejewski-Szmek 4fcd50
 
Zbigniew Jędrzejewski-Szmek 4fcd50
-                timeout = 0;
Zbigniew Jędrzejewski-Szmek 4fcd50
+                msec = 0;
Zbigniew Jędrzejewski-Szmek 4fcd50
         }
Zbigniew Jędrzejewski-Szmek 4fcd50
 
Zbigniew Jędrzejewski-Szmek 4fcd50
         triple_timestamp_get(&e->timestamp);
Zbigniew Jędrzejewski-Szmek 4fcd50
-- 
Zbigniew Jędrzejewski-Szmek 4fcd50
2.30.1
Zbigniew Jędrzejewski-Szmek 4fcd50