From 977d52de34f68b9d1599649b9b4454ab4469f8e1 Mon Sep 17 00:00:00 2001 From: Elliott Mitchell Date: Sun, 20 Sep 2020 21:28:53 -0700 Subject: [PATCH] debian/scripts: Optimize runtime scripts Fewer fork()s and execve()s quickly add up to significant savings. I'm concerned Debian is slowly headed towards recreating SunOS^WSolaris 5.7^W2.7^W7 and the layers and layers of scripts which killed performance. As these runtime scripts are heavily used, avoid all uses of external programs by them. Signed-off-by: Elliott Mitchell Acked-by: Hans van Kranenburg --- debian/scripts/xen-utils-wrapper | 43 +++++++++++++++++++++++++++++--- debian/scripts/xen-version | 6 +++-- 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/debian/scripts/xen-utils-wrapper b/debian/scripts/xen-utils-wrapper index 4d27a62d33..6247fd0b29 100755 --- a/debian/scripts/xen-utils-wrapper +++ b/debian/scripts/xen-utils-wrapper @@ -1,6 +1,41 @@ -#!/bin/sh -e +#!/bin/sh -COMMAND="$(basename $0)" -DIR=$(/usr/lib/xen-common/bin/xen-dir) +# This portion is fast-path, avoid external programs, NOTE: NOT -e HERE! + +COMMAND="${0##*/}" + +DIR=/sys/hypervisor/version +# these return non-zero if hypervisor is absent, this is detected below +read major 2> /dev/null < $DIR/major +read minor 2> /dev/null < $DIR/minor +VERSION="$major.$minor" + +DIR="/usr/lib/xen-$VERSION/bin" + +[ -x "$DIR/$COMMAND" ] && exec "$DIR/$COMMAND" "$@" + + +# Certainly didn't work, now report failures, slower-path +set -e + +error() { + err="$1" + shift + echo "ERROR: " "$@" >&2 + exit $err +} + +[ -e "/sys/hypervisor/type" ] || error 1 "Can't find hypervisor information in sysfs!" + +read type < /sys/hypervisor/type +if [ "$type" != xen ]; then + [ -n "$type" ] || error 1 "Can't read hypervisor type from sysfs!" + error 1 "Hypervisor is not xen but '$type'!" +fi + +if [ ! -d "/usr/lib/xen-$VERSION" ]; then + error 127 "Can't find version $VERSION of xen utils (maybe xen-utils-$VERSION was already removed before rebooting out of Xen $VERSION), bailing out!" +fi + +error 127 "Unable to execute $DIR/$COMMAND" -exec "$DIR/bin/$COMMAND" "$@" diff --git a/debian/scripts/xen-version b/debian/scripts/xen-version index 492070a43b..5c42ad7351 100755 --- a/debian/scripts/xen-version +++ b/debian/scripts/xen-version @@ -6,10 +6,12 @@ error() { } if [ -e "/sys/hypervisor/type" ]; then - type="$(cat /sys/hypervisor/type)" + read type < /sys/hypervisor/type if [ "$type" = xen ]; then DIR=/sys/hypervisor/version - VERSION="$(cat $DIR/major).$(cat $DIR/minor)" + read major < $DIR/major + read minor < $DIR/minor + VERSION="$major.$minor" elif [ -z "$type" ]; then error "Can't read hypervisor type from sysfs!" else -- 2.30.2