[make-initrd] [PATCH 0/3] Reimplement ueventd

Alexey Gladkov gladkov.alexey at gmail.com
Thu May 4 16:42:49 MSK 2023


# Предыстория.

Когда-то давно в initramfs был один цикл, в котором обрабатывались все эвенты из
udev и в конце каждой итерации производилась проверка возможности загрузиться.
Это давало предсказуемый порядок, но создавало проблему с производительностью.
Плюс ко всему этому требовался эвент, чтобы дать толчёк для проверки возможности
дальнейшей загрузки.

Чтобы решить эти проблемы единый цикл был разделён на ueventd (обработчик
эвентов) и polld (периодическое выполнение скриптов). Это позволило развязать
эвенты и условия дальнейшей загрузки.

С появлением необходимости обработки эвентов от сетевых устройств, конфигурации
терминалов и некоторых других, в ueventd была реализована поддержка нескольких
очередей. Эвенты каждой очереди обрабатываются последовательно, но каждая
очередь обрабатывается параллельно.

В то время распараллеливание было сделано через использование утилиты inotify из
busybox. Это работало, но поскольку inotify это утилита общего назначения, то
оптимизировать или кастомизировать работу демона было очень затруднительно.

# Изменения.

Ueventd был переписан с нуля на си. Это открыло возможность для оптимизаций,
увеличило читабильность кода, дало возможность уйти от передачи эвентов через
файловую систему.

Как следствие сейчас пропала необходимость в отдельном процессе polld. Его
фунционал может обратно вернуться в ueventd в качестве отдельной очереди. Плюс
проверка rootdelay теперь находится в этой отдельной очереди.

Возможно стоит пойти дальше и уйти от периодической проверки создав опять же
поток эвентов и "базу данных". Но это справедливо и для текущей архитектуры
эвентов.

---

Alexey Gladkov (3):
  Reimplement ueventd
  Replace polld by uevent queue
  feature/kickstart: Reset rootdelay timer after kickstart

 data/bin/initrd-sh-functions                  |   8 +
 data/bin/uevent-sh-functions                  |   3 +
 data/etc/rc.d/init.d/poll                     |  25 +-
 data/etc/rc.d/init.d/uevent                   |   9 +-
 data/lib/uevent/each/post/.gitignore          |   0
 data/lib/uevent/each/post/system-bootable     |   4 -
 data/lib/uevent/extenders/.gitignore          |   0
 data/lib/uevent/handlers/poll/100-extenders   |  22 +
 data/lib/uevent/handlers/poll/300-boot-method |  29 +
 .../poll/400-rootdelay}                       |  13 +-
 data/sbin/polld                               |  45 --
 data/sbin/process-boot-method                 |  16 -
 data/sbin/ueventd                             | 180 ------
 data/sbin/ueventd-queue                       |  65 +++
 datasrc/ueventd/Makefile.mk                   |  13 +
 datasrc/ueventd/logging.c                     |  63 ++
 datasrc/ueventd/memory.c                      |  32 +
 datasrc/ueventd/path.c                        |  80 +++
 datasrc/ueventd/process.c                     |  17 +
 datasrc/ueventd/queue-processor.c             | 116 ++++
 datasrc/ueventd/ueventd.c                     | 551 ++++++++++++++++++
 datasrc/ueventd/ueventd.h                     |  76 +++
 .../kickstart/data/etc/rc.d/init.d/kickstart  |  11 +-
 23 files changed, 1108 insertions(+), 270 deletions(-)
 create mode 100644 data/lib/uevent/each/post/.gitignore
 delete mode 100755 data/lib/uevent/each/post/system-bootable
 create mode 100644 data/lib/uevent/extenders/.gitignore
 create mode 100755 data/lib/uevent/handlers/poll/100-extenders
 create mode 100755 data/lib/uevent/handlers/poll/300-boot-method
 rename data/lib/uevent/{extenders/100-rootdelay => handlers/poll/400-rootdelay} (80%)
 delete mode 100755 data/sbin/polld
 delete mode 100755 data/sbin/process-boot-method
 delete mode 100755 data/sbin/ueventd
 create mode 100755 data/sbin/ueventd-queue
 create mode 100644 datasrc/ueventd/Makefile.mk
 create mode 100644 datasrc/ueventd/logging.c
 create mode 100644 datasrc/ueventd/memory.c
 create mode 100644 datasrc/ueventd/path.c
 create mode 100644 datasrc/ueventd/process.c
 create mode 100644 datasrc/ueventd/queue-processor.c
 create mode 100644 datasrc/ueventd/ueventd.c
 create mode 100644 datasrc/ueventd/ueventd.h

-- 
2.33.7



More information about the Make-initrd mailing list