From: Yu Watanabe Date: Sat, 26 Apr 2025 06:09:12 +0000 (+0900) Subject: udev: cache last queued event entry X-Git-Tag: v258-rc1~654^2~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4478546649e3943ea629f6344f2db89afbbb8872;p=thirdparty%2Fsystemd.git udev: cache last queued event entry When we have N queued events, LIST_APPEND() takes O(N). Let's cache the last event to optimize queueing. --- diff --git a/src/udev/udev-manager.c b/src/udev/udev-manager.c index 259321e29d2..bfe1a978ab1 100644 --- a/src/udev/udev-manager.c +++ b/src/udev/udev-manager.c @@ -94,8 +94,11 @@ static Event* event_free(Event *event) { if (!event) return NULL; - if (event->manager) + if (event->manager) { + if (event->manager->last_event == event) + event->manager->last_event = event->event_prev; LIST_REMOVE(event, event->manager->events, event); + } if (event->worker) event->worker->event = NULL; @@ -875,7 +878,8 @@ static int event_queue_insert(Manager *manager, sd_device *dev) { .state = EVENT_QUEUED, }; - LIST_APPEND(event, manager->events, event); + LIST_INSERT_AFTER(event, manager->events, manager->last_event, event); + manager->last_event = event; event->manager = manager; TAKE_PTR(event); log_device_uevent(dev, "Device is queued"); diff --git a/src/udev/udev-manager.h b/src/udev/udev-manager.h index 4a2225d1c2d..87af431f2d9 100644 --- a/src/udev/udev-manager.h +++ b/src/udev/udev-manager.h @@ -50,6 +50,7 @@ typedef struct Manager { sd_event *event; Hashmap *workers; LIST_HEAD(Event, events); + Event *last_event; char *cgroup; UdevRules *rules;