|
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 |
|