Hi Paul,
Thanks for the review.
The motivation is to reduce initramfs boot latency. On the Qualcomm RB3
Gen 2 Core Kit, the full coldplug initializes unrelated devices, and
udevadm settle waits for their events although only the root partition
is needed.
I measured the following average boot times with this configuration:
Device: Qualcomm RB3 Gen 2 Core Kit
MACHINE: rb3gen2-core-kit
Kernel: Linux 6.18
KAS configuration:
ci/rb3gen2-core-kit.yml:ci/qcom-distro.yml:ci/performance.yml
Image: initramfs-rootfs-image
Root: PARTLABEL=rootfs
Default
full coldplug
With path
root-only enabled
Improvement
udev trigger + settle
981.6 ms
109.8 ms
871.8 ms (88.8%)
/init to rootfs EXT4 mount
1340.2 ms
441.1 ms
899.1 ms (67.1%)
This reduces the udev trigger and settle time by 871.8 ms and the time
to mount the root filesystem by 899.1 ms, corresponding to improvements
of 88.8% and 67.1%, respectively. The measurements cover three boots
with the full trigger and two boots with the root-only trigger.
For the targeted trigger, udev_trigger_root_device() returns the status
of its final udevadm command, so failure already makes the condition
false and executes the full trigger. However, I agree this is not
obvious, so I will make the error handling explicit in v2.
I will also clarify that the optimization is enabled with:
initramfs.udev-root-only=1
I will address these points in v2.
Best regards,
Wenwen
________________________________
From: Paul Barker <[email protected]>
Sent: Tuesday, August 18, 2026 16:47
To: Wenwen Fu <[email protected]>;
[email protected]
<[email protected]>
Subject: Re: [PATCH] initramfs-framework: add opt-in root-only udev trigger
WARNING: This email originated from outside of Qualcomm. Please be wary of any
links or attachments, and do not enable macros.
Hi,
Thanks for the patch, I have a couple of feedback comments.
On Wed, 2026-08-12 at 17:28 +0800, Wenwen Fu wrote:
> The initramfs udev module replays add events for the complete device tree
> and waits for every resulting event. An initramfs that only mounts a root
> partition does not need to coldplug unrelated devices.
>
> Add an opt-in initramfs.udev-root-only kernel parameter. When root uses
> PARTLABEL or PARTUUID, trigger only the matching block device. For
> PARTLABEL roots, match the PARTNAME property exposed by udev. Keep the
> existing full trigger as the default so current users and other initramfs
> modules retain their existing behaviour.
>
> If the requested root cannot be matched safely, or a targeted trigger
> fails, fall back to the original full coldplug.
This explains the mechanism, but not why we would want the option to
avoid the current behaviour. Does the current behaviour cause problems,
is it too slow, etc?
>
> Signed-off-by: Wenwen Fu <[email protected]>
> ---
> .../initrdscripts/initramfs-framework/udev | 30 ++++++++++++++++++-
> 1 file changed, 29 insertions(+), 1 deletion(-)
>
> diff --git a/meta/recipes-core/initrdscripts/initramfs-framework/udev
> b/meta/recipes-core/initrdscripts/initramfs-framework/udev
> index 4898b89246..7fa26ef807 100644
> --- a/meta/recipes-core/initrdscripts/initramfs-framework/udev
> +++ b/meta/recipes-core/initrdscripts/initramfs-framework/udev
> @@ -35,6 +35,29 @@ udev_enabled() {
> return 0
> }
>
> +udev_trigger_root_device() {
> + case "${bootparam_root:-}" in
> + PARTLABEL=?*)
> + root_match="PARTNAME=${bootparam_root#PARTLABEL=}"
> + ;;
> + PARTUUID=?*)
> + root_match="PARTUUID=${bootparam_root#PARTUUID=}"
> + ;;
> + *)
> + return 1
> + ;;
> + esac
> +
> + root_devices=$(udevadm trigger --dry-run --verbose \
> + --subsystem-match=block "--property-match=$root_match") ||
> return 1
> +
> + # udevadm succeeds even when no devices match, so check its dry-run
> output.
> + [ -n "$root_devices" ] || return 1
> +
> + udevadm trigger --subsystem-match=block \
> + "--property-match=$root_match" --action=add
The commit message says that there is a fallback to the original full
coldplug if the targeted trigger fails, but the return status of this
command is ignored.
> +}
> +
> udev_run() {
> add_module_pre_hook "udev_shutdown_hook_handler"
>
> @@ -45,6 +68,11 @@ udev_run() {
> sh -c "exec 4< /dev/console" || { exec 0> /dev/null; exec 1> /dev/null;
> exec 2> /dev/null; }
>
> $_UDEV_DAEMON --daemon
> - udevadm trigger --action=add
> + if [ "${bootparam_initramfs_udev_root_only:-}" = "1" ] &&
I don't think this enabling condition isn't explained clearly in the
commit message.
> + udev_trigger_root_device; then
> + debug "Triggered udev for root partition only"
> + else
> + udevadm trigger --action=add
> + fi
> udevadm settle
> }
Best regards,
--
Paul Barker
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#243673):
https://lists.openembedded.org/g/openembedded-core/message/243673
Mute This Topic: https://lists.openembedded.org/mt/120715520/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-