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