Patch to fix tests on i686 and arm32
This commit is contained in:
		
							parent
							
								
									0a7c16de28
								
							
						
					
					
						commit
						4fcd500d9b
					
				
							
								
								
									
										123
									
								
								0001-Revert-sd-event-make-use-of-epoll_pwait2-for-greater.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										123
									
								
								0001-Revert-sd-event-make-use-of-epoll_pwait2-for-greater.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,123 @@ | |||||||
|  | From 3552ac862497bdb5ea73639851bbfd114b795fa2 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> | ||||||
|  | Date: Thu, 11 Mar 2021 20:41:36 +0100 | ||||||
|  | Subject: [PATCH] Revert "sd-event: make use of epoll_pwait2() for greater time | ||||||
|  |  accuracy" | ||||||
|  | 
 | ||||||
|  | This reverts commit 798445ab84cff51bde7fcf936f0fb19c37cf858c. | ||||||
|  | 
 | ||||||
|  | Unfortunately this causes test-event to hang. 32 bit architectures seem | ||||||
|  | affected: i686 and arm32 in fedora koji. 32 bit build of test-event hangs | ||||||
|  | reliably under valgrind: | ||||||
|  | 
 | ||||||
|  | $ 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 | ||||||
|  | ---
 | ||||||
|  |  src/libsystemd/sd-event/sd-event.c | 73 ++++++------------------------ | ||||||
|  |  1 file changed, 14 insertions(+), 59 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/libsystemd/sd-event/sd-event.c b/src/libsystemd/sd-event/sd-event.c
 | ||||||
|  | index 8ab9d419af..69d9c5e780 100644
 | ||||||
|  | --- a/src/libsystemd/sd-event/sd-event.c
 | ||||||
|  | +++ b/src/libsystemd/sd-event/sd-event.c
 | ||||||
|  | @@ -3781,59 +3781,9 @@ pending:
 | ||||||
|  |          return r; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -static int epoll_wait_usec(
 | ||||||
|  | -                int fd,
 | ||||||
|  | -                struct epoll_event *events,
 | ||||||
|  | -                int maxevents,
 | ||||||
|  | -                usec_t timeout) {
 | ||||||
|  | -
 | ||||||
|  | -        static bool epoll_pwait2_absent = false;
 | ||||||
|  | -        int r, msec;
 | ||||||
|  | -
 | ||||||
|  | -        /* A wrapper that uses epoll_pwait2() if available, and falls back to epoll_wait() if not */
 | ||||||
|  | -
 | ||||||
|  | -        if (!epoll_pwait2_absent && timeout != USEC_INFINITY) {
 | ||||||
|  | -                struct timespec ts;
 | ||||||
|  | -
 | ||||||
|  | -                r = epoll_pwait2(fd,
 | ||||||
|  | -                                 events,
 | ||||||
|  | -                                 maxevents,
 | ||||||
|  | -                                 timespec_store(&ts, timeout),
 | ||||||
|  | -                                 NULL);
 | ||||||
|  | -                if (r >= 0)
 | ||||||
|  | -                        return r;
 | ||||||
|  | -                if (!ERRNO_IS_NOT_SUPPORTED(r) && !ERRNO_IS_PRIVILEGE(r))
 | ||||||
|  | -                        return -errno; /* Only fallback to old epoll_wait() if the syscall is masked or not
 | ||||||
|  | -                                        * supported. */
 | ||||||
|  | -
 | ||||||
|  | -                epoll_pwait2_absent = true;
 | ||||||
|  | -        }
 | ||||||
|  | -
 | ||||||
|  | -        if (timeout == USEC_INFINITY)
 | ||||||
|  | -                msec = -1;
 | ||||||
|  | -        else {
 | ||||||
|  | -                usec_t k;
 | ||||||
|  | -
 | ||||||
|  | -                k = DIV_ROUND_UP(timeout, USEC_PER_MSEC);
 | ||||||
|  | -                if (k >= INT_MAX)
 | ||||||
|  | -                        msec = INT_MAX; /* Saturate */
 | ||||||
|  | -                else
 | ||||||
|  | -                        msec = (int) k;
 | ||||||
|  | -        }
 | ||||||
|  | -
 | ||||||
|  | -        r = epoll_wait(fd,
 | ||||||
|  | -                       events,
 | ||||||
|  | -                       maxevents,
 | ||||||
|  | -                       msec);
 | ||||||
|  | -        if (r < 0)
 | ||||||
|  | -                return -errno;
 | ||||||
|  | -
 | ||||||
|  | -        return r;
 | ||||||
|  | -}
 | ||||||
|  | -
 | ||||||
|  |  _public_ int sd_event_wait(sd_event *e, uint64_t timeout) { | ||||||
|  |          size_t n_event_queue, m; | ||||||
|  | -        int r;
 | ||||||
|  | +        int r, msec;
 | ||||||
|  |   | ||||||
|  |          assert_return(e, -EINVAL); | ||||||
|  |          assert_return(e = event_resolve(e), -ENOPKG); | ||||||
|  | @@ -3852,16 +3802,21 @@ _public_ int sd_event_wait(sd_event *e, uint64_t timeout) {
 | ||||||
|  |   | ||||||
|  |          /* If we still have inotify data buffered, then query the other fds, but don't wait on it */ | ||||||
|  |          if (e->inotify_data_buffered) | ||||||
|  | -                timeout = 0;
 | ||||||
|  | +                msec = 0;
 | ||||||
|  | +        else
 | ||||||
|  | +                msec = timeout == (uint64_t) -1 ? -1 : (int) DIV_ROUND_UP(timeout, USEC_PER_MSEC);
 | ||||||
|  |   | ||||||
|  |          for (;;) { | ||||||
|  | -                r = epoll_wait_usec(e->epoll_fd, e->event_queue, e->event_queue_allocated, timeout);
 | ||||||
|  | -                if (r == -EINTR) {
 | ||||||
|  | -                        e->state = SD_EVENT_PENDING;
 | ||||||
|  | -                        return 1;
 | ||||||
|  | -                }
 | ||||||
|  | -                if (r < 0)
 | ||||||
|  | +                r = epoll_wait(e->epoll_fd, e->event_queue, e->event_queue_allocated, msec);
 | ||||||
|  | +                if (r < 0) {
 | ||||||
|  | +                        if (errno == EINTR) {
 | ||||||
|  | +                                e->state = SD_EVENT_PENDING;
 | ||||||
|  | +                                return 1;
 | ||||||
|  | +                        }
 | ||||||
|  | +
 | ||||||
|  | +                        r = -errno;
 | ||||||
|  |                          goto finish; | ||||||
|  | +                }
 | ||||||
|  |   | ||||||
|  |                  m = (size_t) r; | ||||||
|  |   | ||||||
|  | @@ -3874,7 +3829,7 @@ _public_ int sd_event_wait(sd_event *e, uint64_t timeout) {
 | ||||||
|  |                  if (!GREEDY_REALLOC(e->event_queue, e->event_queue_allocated, e->event_queue_allocated + n_event_queue)) | ||||||
|  |                          return -ENOMEM; | ||||||
|  |   | ||||||
|  | -                timeout = 0;
 | ||||||
|  | +                msec = 0;
 | ||||||
|  |          } | ||||||
|  |   | ||||||
|  |          triple_timestamp_get(&e->timestamp); | ||||||
|  | -- 
 | ||||||
|  | 2.30.1 | ||||||
|  | 
 | ||||||
| @ -71,6 +71,7 @@ GIT_DIR=../../src/systemd/.git git diffab -M v233..master@{2017-06-15} -- hwdb/[ | |||||||
| %endif | %endif | ||||||
| 
 | 
 | ||||||
| # Backports of patches from upstream (0000–0499) | # Backports of patches from upstream (0000–0499) | ||||||
|  | Patch0001:      0001-Revert-sd-event-make-use-of-epoll_pwait2-for-greater.patch | ||||||
| 
 | 
 | ||||||
| # Downstream-only patches (5000–9999) | # Downstream-only patches (5000–9999) | ||||||
| # https://bugzilla.redhat.com/show_bug.cgi?id=1738828 | # https://bugzilla.redhat.com/show_bug.cgi?id=1738828 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user