Issue #23485: select.epoll.poll() is now retried when interrupted by a signal
diff --git a/Lib/selectors.py b/Lib/selectors.py
index bf48ebf..2a0a44c 100644
--- a/Lib/selectors.py
+++ b/Lib/selectors.py
@@ -423,11 +423,9 @@
             # FD is registered.
             max_ev = max(len(self._fd_to_key), 1)
 
+            fd_event_list = self._epoll.poll(timeout, max_ev)
+
             ready = []
-            try:
-                fd_event_list = self._epoll.poll(timeout, max_ev)
-            except InterruptedError:
-                return ready
             for fd, event in fd_event_list:
                 events = 0
                 if event & ~select.EPOLLIN:
diff --git a/Lib/test/eintrdata/eintr_tester.py b/Lib/test/eintrdata/eintr_tester.py
index 3da964d..0df9762 100644
--- a/Lib/test/eintrdata/eintr_tester.py
+++ b/Lib/test/eintrdata/eintr_tester.py
@@ -329,6 +329,17 @@
         dt = time.monotonic() - t0
         self.assertGreaterEqual(dt, self.sleep_time)
 
+    @unittest.skipUnless(hasattr(select, 'epoll'), 'need select.epoll')
+    def test_epoll(self):
+        poller = select.epoll()
+        self.addCleanup(poller.close)
+
+        t0 = time.monotonic()
+        poller.poll(self.sleep_time)
+        self.stop_alarm()
+        dt = time.monotonic() - t0
+        self.assertGreaterEqual(dt, self.sleep_time)
+
 
 def test_main():
     support.run_unittest(