tevent: avoid epoll_check_reopen() overhead unless required
authorStefan Metzmacher <metze@samba.org>
Thu, 20 Apr 2023 12:59:33 +0000 (12:59 +0000)
committerAndreas Schneider <asn@cryptomilk.org>
Wed, 19 Jul 2023 08:02:33 +0000 (08:02 +0000)
The preparation, function call and cleanup for epoll_check_reopen()
is quite some overhead and not needed most of the time!

So check the pid in the caller avoids most of it.

Review with: git show -w

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
lib/tevent/tevent_epoll.c

index f77f50995e2fbc6fe500ebae1c962a792205bffb..8636fdac5e62212eec4262e77cd5456f3c311f5c 100644 (file)
@@ -800,9 +800,11 @@ static int epoll_event_fd_destructor(struct tevent_fd *fde)
        }
 
        epoll_ev->panic_state = &panic_triggered;
-       epoll_check_reopen(epoll_ev);
-       if (panic_triggered) {
-               return tevent_common_fd_destructor(fde);
+       if (epoll_ev->pid != tevent_cached_getpid()) {
+               epoll_check_reopen(epoll_ev);
+               if (panic_triggered) {
+                       return tevent_common_fd_destructor(fde);
+               }
        }
 
        if (mpx_fde != NULL) {
@@ -847,12 +849,14 @@ static struct tevent_fd *epoll_event_add_fd(struct tevent_context *ev, TALLOC_CT
 
        talloc_set_destructor(fde, epoll_event_fd_destructor);
 
-       epoll_ev->panic_state = &panic_triggered;
-       epoll_check_reopen(epoll_ev);
-       if (panic_triggered) {
-               return fde;
+       if (epoll_ev->pid != tevent_cached_getpid()) {
+               epoll_ev->panic_state = &panic_triggered;
+               epoll_check_reopen(epoll_ev);
+               if (panic_triggered) {
+                       return fde;
+               }
+               epoll_ev->panic_state = NULL;
        }
-       epoll_ev->panic_state = NULL;
 
        epoll_update_event(epoll_ev, fde);
 
@@ -876,12 +880,14 @@ static void epoll_event_set_fd_flags(struct tevent_fd *fde, uint16_t flags)
 
        fde->flags = flags;
 
-       epoll_ev->panic_state = &panic_triggered;
-       epoll_check_reopen(epoll_ev);
-       if (panic_triggered) {
-               return;
+       if (epoll_ev->pid != tevent_cached_getpid()) {
+               epoll_ev->panic_state = &panic_triggered;
+               epoll_check_reopen(epoll_ev);
+               if (panic_triggered) {
+                       return;
+               }
+               epoll_ev->panic_state = NULL;
        }
-       epoll_ev->panic_state = NULL;
 
        epoll_update_event(epoll_ev, fde);
 }
@@ -916,15 +922,17 @@ static int epoll_event_loop_once(struct tevent_context *ev, const char *location
                return 0;
        }
 
-       epoll_ev->panic_state = &panic_triggered;
-       epoll_ev->panic_force_replay = true;
-       epoll_check_reopen(epoll_ev);
-       if (panic_triggered) {
-               errno = EINVAL;
-               return -1;
+       if (epoll_ev->pid != tevent_cached_getpid()) {
+               epoll_ev->panic_state = &panic_triggered;
+               epoll_ev->panic_force_replay = true;
+               epoll_check_reopen(epoll_ev);
+               if (panic_triggered) {
+                       errno = EINVAL;
+                       return -1;
+               }
+               epoll_ev->panic_force_replay = false;
+               epoll_ev->panic_state = NULL;
        }
-       epoll_ev->panic_force_replay = false;
-       epoll_ev->panic_state = NULL;
 
        return epoll_event_loop(epoll_ev, &tval);
 }