Make-initrd development discussion
 help / color / mirror / Atom feed
From: Alexey Gladkov <gladkov.alexey@gmail.com>
To: make-initrd@lists.altlinux.org
Subject: [make-initrd] [PATCH] ueventd: Don't use a epoll timeout when it's not needed
Date: Sun, 21 May 2023 10:53:26 +0200
Message-ID: <20230521085326.308119-1-gladkov.alexey@gmail.com> (raw)
In-Reply-To: <5522f0c1-adac-3db7-e569-05cda6d05d58@gmail.com>

The timeout is used to process queues that have unprocessed events
(dirty ones) even when no new events have arrived in the queue. When
there are no dirty queues, then there is no point in extra iterations of
the main loop.

Signed-off-by: Alexey Gladkov <gladkov.alexey@gmail.com>
---
 datasrc/ueventd/ueventd.c | 23 ++++++++++++++++++-----
 1 file changed, 18 insertions(+), 5 deletions(-)

diff --git a/datasrc/ueventd/ueventd.c b/datasrc/ueventd/ueventd.c
index 857d3b4f..afe050d0 100644
--- a/datasrc/ueventd/ueventd.c
+++ b/datasrc/ueventd/ueventd.c
@@ -56,7 +56,8 @@ enum {
 	PIPE_MAX,
 };
 
-int pipefd[PIPE_MAX];
+static int pipefd[PIPE_MAX];
+static int dirty_queues = 0;
 
 #define EV_PAUSE_MASK (IN_CREATE | IN_DELETE | IN_ONLYDIR)
 #define EV_ROOT_MASK  (IN_CREATE | IN_ONLYDIR)
@@ -121,8 +122,10 @@ int watch_path(int inotifyfd, const char *dir, const char *name, uint32_t mask,
 	new->next      = watch_list;
 
 	if (flags & F_QUEUE_DIR) {
-		if (!empty_directory(path))
+		if (!empty_directory(path)) {
 			new->q_flags |= F_DIRTY;
+			dirty_queues++;
+		}
 		new->q_parentfd = pipefd[PIPE_WRITE];
 	}
 
@@ -339,8 +342,10 @@ int process_inotify_events(int inotifyfd)
 				continue;
 			}
 
-			if (!(p->q_flags & F_DIRTY))
+			if (!(p->q_flags & F_DIRTY)) {
 				p->q_flags |= F_DIRTY;
+				dirty_queues++;
+			}
 		}
 	}
 	return 0;
@@ -375,8 +380,10 @@ int process_pipefd_events(int readfd)
 		for (p = watch_list; p; p = p->next) {
 			if (!(p->q_flags & F_QUEUE_DIR) || p->q_watchfd != value)
 				continue;
-			if (!(p->q_flags & F_DIRTY))
+			if (!(p->q_flags & F_DIRTY)) {
 				p->q_flags |= F_DIRTY;
+				dirty_queues++;
+			}
 			break;
 		}
 	}
@@ -521,7 +528,7 @@ int main(int argc, char **argv)
 		int fdcount;
 
 		errno = 0;
-		fdcount = epoll_wait(epollfd, ev, EV_MAX, 250);
+		fdcount = epoll_wait(epollfd, ev, EV_MAX, (dirty_queues ? 250 : -1));
 
 		if (fdcount < 0) {
 			if (errno == EINTR)
@@ -542,6 +549,12 @@ int main(int argc, char **argv)
 		for (e = watch_list; e; e = e->next) {
 			if (!(e->q_flags & F_QUEUE_DIR) || !(e->q_flags & F_DIRTY) || (e->q_pid != 0) || (e->q_flags & F_PAUSED))
 				continue;
+
+			if (dirty_queues == 0)
+				rd_fatal("BUG: dirty_queues == 0, but dirty queues are present");
+
+			dirty_queues--;
+
 			e->q_flags &= ~F_DIRTY;
 			e->q_pid = spawn_worker(epollfd, e);
 		}
-- 
2.33.8



  parent reply	other threads:[~2023-05-21  8:53 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-05-04 13:42 [make-initrd] [PATCH 0/3] Reimplement ueventd Alexey Gladkov
2023-05-04 13:42 ` [make-initrd] [PATCH 1/3] " Alexey Gladkov
2023-05-05  3:08   ` Leonid Krivoshein
2023-05-05 17:02     ` Alexey Gladkov
2023-05-05  4:03   ` Leonid Krivoshein
2023-05-05 17:16     ` Alexey Gladkov
2023-05-05  5:21   ` Leonid Krivoshein
2023-05-05 17:24     ` Alexey Gladkov
2023-05-14 20:12   ` Leonid Krivoshein
2023-05-14 20:45     ` Alexey Gladkov
2023-05-14 20:57   ` Leonid Krivoshein
2023-05-15  8:52     ` Alexey Gladkov
2023-05-14 23:08   ` Leonid Krivoshein
2023-05-15  9:05     ` Alexey Gladkov
2023-05-15  0:47   ` Leonid Krivoshein
2023-05-15  9:12     ` Alexey Gladkov
2023-05-15  4:38   ` Leonid Krivoshein
2023-05-15 10:43     ` Alexey Gladkov
2023-05-18  6:39         ` Leonid Krivoshein
2023-05-18  7:05           ` Alexey Gladkov
2023-05-20  9:00   ` Leonid Krivoshein
2023-05-20 13:18     ` Alexey Gladkov
2023-05-20 15:17       ` Vladimir D. Seleznev
2023-05-20 17:23       ` Leonid Krivoshein
2023-05-20 18:51         ` Alexey Gladkov
2023-05-21  8:53         ` Alexey Gladkov [this message]
2023-05-22  4:46           ` [make-initrd] [PATCH] ueventd: Don't use a epoll timeout when it's not needed Leonid Krivoshein
2023-05-22  7:54             ` Alexey Gladkov
2023-05-22  9:19               ` Alexey Gladkov
2023-05-22  7:57             ` [make-initrd] [PATCH 1/2] ueventd: Fix memory leak Alexey Gladkov
2023-05-22  7:57             ` [make-initrd] [PATCH 2/2] ueventd: Change interface rd_asprintf_or_die Alexey Gladkov
2023-05-22  9:36               ` [make-initrd] [PATCH v2] " Alexey Gladkov
2023-05-20 16:37     ` [make-initrd] [PATCH 1/3] ueventd: Simplify call of the queue handler Alexey Gladkov
2023-05-20 16:37     ` [make-initrd] [PATCH 2/3] ueventd: Rename fd_list to fd_handler_list Alexey Gladkov
2023-05-20 16:37     ` [make-initrd] [PATCH 3/3] ueventd: Drop obsolete declarations Alexey Gladkov
2023-05-04 13:42 ` [make-initrd] [PATCH 2/3] Replace polld by uevent queue Alexey Gladkov
2023-05-04 13:42 ` [make-initrd] [PATCH 3/3] feature/kickstart: Reset rootdelay timer after kickstart Alexey Gladkov
2023-05-06 19:45 ` [make-initrd] ueventd: Add a prefix to the logging functions to avoid name collisions Alexey Gladkov
2023-05-06 19:45 ` [make-initrd] ueventd: Allow to configure the log destination Alexey Gladkov
2023-05-06 19:45 ` [make-initrd] ueventd: Pass the program name when initializing the logger Alexey Gladkov
2023-05-06 19:45 ` [make-initrd] ueventd: Rewrite logging function to make it more atomic Alexey Gladkov
2023-05-07 12:48 ` [make-initrd] [PATCH 0/3] Reimplement ueventd Alexey Gladkov
2023-05-13 11:50 ` Alexey Gladkov
2023-05-14 20:15   ` Leonid Krivoshein
2023-05-14 20:49     ` Alexey Gladkov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230521085326.308119-1-gladkov.alexey@gmail.com \
    --to=gladkov.alexey@gmail.com \
    --cc=make-initrd@lists.altlinux.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Make-initrd development discussion

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/make-initrd/0 make-initrd/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 make-initrd make-initrd/ http://lore.altlinux.org/make-initrd \
		make-initrd@lists.altlinux.org make-initrd@lists.altlinux.ru make-initrd@lists.altlinux.com
	public-inbox-index make-initrd

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.make-initrd


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git