From a4145f8760f0f75240fb44c7a010bfd12a5c1c7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=BD=D0=B0=D0=B1?= Date: Fri, 14 Oct 2022 15:20:33 +0200 Subject: [PATCH] perf(dracut-functions.sh): optimise get_persistent_dev() This shaves ~40ms (from ~50ms; average case, huge variance up to 700ms on the old one), and makes 99base go from real 0m0.350s user 0m0.250s sys 0m0.119s to real 0m0.216s user 0m0.162s sys 0m0.076s --- dracut-functions.sh | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/dracut-functions.sh b/dracut-functions.sh index ff6749a151..a9123ce52e 100755 --- a/dracut-functions.sh +++ b/dracut-functions.sh @@ -268,9 +268,9 @@ get_devpath_block() { # get a persistent path from a device get_persistent_dev() { - local i _tmp _dev _pol + local _dev _pol - _dev=$(get_maj_min "$1") + _dev=$(stat -L -c $'%t:%T' "$1" 2> /dev/null) [ -z "$_dev" ] && return if [[ -n $persistent_policy ]]; then @@ -279,7 +279,8 @@ get_persistent_dev() { _pol= fi - for i in \ + # shellcheck disable=SC2086 + printf '%s\0' \ $_pol \ /dev/mapper/* \ /dev/disk/by-uuid/* \ @@ -287,17 +288,9 @@ get_persistent_dev() { /dev/disk/by-partuuid/* \ /dev/disk/by-partlabel/* \ /dev/disk/by-id/* \ - /dev/disk/by-path/*; do - [[ -e $i ]] || continue - [[ $i == /dev/mapper/control ]] && continue - [[ $i == /dev/mapper/mpath* ]] && continue - _tmp=$(get_maj_min "$i") - if [ "$_tmp" = "$_dev" ]; then - printf -- "%s" "$i" - return - fi - done - printf -- "%s" "$1" + /dev/disk/by-path/* \ + | xargs -0 stat -L -c $'%n\t%t:%T' 2> /dev/null \ + | awk -v_dev="$_dev" -vdfl="$1" '$0 ~ ("\t" _dev "$") {--NF; print; dfl=0; exit} END {if(dfl) print dfl}' } expand_persistent_dev() {