From 4e93e028263dd6a0122c9606115593ad66175324 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Tue, 1 Feb 2022 15:13:59 -0500 Subject: [PATCH] import powerpc-utils-1.3.8-9.el8_5 --- ...c50d8de1a8b171675ee6b742c9f0250c28a1.patch | 320 ++++++++++++++++++ SPECS/powerpc-utils.spec | 10 +- 2 files changed, 329 insertions(+), 1 deletion(-) create mode 100644 SOURCES/powerpc-utils-1.3.8-4c6dc50d8de1a8b171675ee6b742c9f0250c28a1.patch diff --git a/SOURCES/powerpc-utils-1.3.8-4c6dc50d8de1a8b171675ee6b742c9f0250c28a1.patch b/SOURCES/powerpc-utils-1.3.8-4c6dc50d8de1a8b171675ee6b742c9f0250c28a1.patch new file mode 100644 index 0000000..b75245b --- /dev/null +++ b/SOURCES/powerpc-utils-1.3.8-4c6dc50d8de1a8b171675ee6b742c9f0250c28a1.patch @@ -0,0 +1,320 @@ +commit 4c6dc50d8de1a8b171675ee6b742c9f0250c28a1 +Author: Scott Cheloha +Date: Tue Jul 27 11:30:58 2021 -0500 + + lsdevinfo: optimize criteria filtering + + lsdevinfo is significantly slower when a criteria filter is set with the + -q flag. + + There are two culprits: + + 1. The criteria string given on the command line is parsed every time + we call check_criteria(). We're forking two sed(1) processes whenever + we hit that function. We hit it a lot. + + 2. Criteria checking runs in constant time. We call check_criteria() and + do the parsing in (1) for every relevant attribute, even if we already + have a match from a prior check_criteria() invocation. + + We can fix issue (1) by parsing the criteria string once at the start + of the script. I have added a function, parse_criteria(), that parses + the $criteria string and selects an appropriate matching function. + + This approach also fixes problem (2), but we first need to check + whether the user's criteria is relevant to the attributes the script + cares about before calling the matching function. We do this with + criteria_is_relevant(). + + The speed improvement is nice. Consider my test machine with around + thirty devices. On this machine, lsdevinfo without any options runs + in 1.35s, but with the "status=1" criteria it runs in 2.12s: + + $ /usr/sbin/lsdevinfo | fgrep -c device: + 29 + $ command time -p /usr/sbin/lsdevinfo > /dev/null + real 1.35 + user 1.42 + sys 0.16 + $ command time -p /usr/sbin/lsdevinfo -q status=1 > /dev/null + real 2.12 + user 2.22 + sys 0.30 + + With this patch, lsdevinfo with the "status=1" criteria now runs in + 1.35s: + + $ command time -p /usr/sbin/lsdevinfo -q status=1 > /dev/null + real 1.35 + user 1.41 + sys 0.18 + + This patch eliminates nearly all of the criteria-checking overhead in + the current code. + + Signed-off-by: Scott Cheloha + Signed-off-by: Tyrel Datwyler + +diff --git a/scripts/lsdevinfo b/scripts/lsdevinfo +index 1d9597b..7a3cba3 100755 +--- a/scripts/lsdevinfo ++++ b/scripts/lsdevinfo +@@ -61,37 +61,113 @@ show_version() + echo "Written by: Santiago Leon " + } + +-# check_criteria +-# Modifies $show if the the attribute in the first parameter matches the +-# criteria from the command line. +-# The operands (=, !=, and LIKE) are defined the the lsdevinfo spec. + # +-check_criteria() ++# Criteria matching boilerplate. ++# ++_class_eq() { [[ $class = $crit_rhs ]]; } ++_class_neq() { [[ $class != $crit_rhs ]]; } ++_class_like() { [[ $class =~ $crit_rhs ]]; } ++ ++_driver_eq() { [[ $driver = $crit_rhs ]]; } ++_driver_neq() { [[ $driver != $crit_rhs ]]; } ++_driver_like() { [[ $driver =~ $crit_rhs ]]; } ++ ++_name_eq() { [[ $name = $crit_rhs ]]; } ++_name_neq() { [[ $name != $crit_rhs ]]; } ++_name_like() { [[ $name =~ $crit_rhs ]]; } ++ ++_parent_eq() { [[ $parent = $crit_rhs ]]; } ++_parent_neq() { [[ $parent != $crit_rhs ]]; } ++_parent_like() { [[ $parent =~ $crit_rhs ]]; } ++ ++_physloc_eq() { [[ $physloc = $crit_rhs ]]; } ++_physloc_neq() { [[ $physloc != $crit_rhs ]]; } ++_physloc_like() { [[ $physloc =~ $crit_rhs ]]; } ++ ++_prefix_eq() { [[ $prefix = $crit_rhs ]]; } ++_prefix_neq() { [[ $prefix != $crit_rhs ]]; } ++_prefix_like() { [[ $prefix =~ $crit_rhs ]]; } ++ ++_status_eq() { [[ $status = $crit_rhs ]]; } ++_status_neq() { [[ $status != $crit_rhs ]]; } ++_status_like() { [[ $status =~ $crit_rhs ]]; } ++ ++_subclass_eq() { [[ $subclass = $crit_rhs ]]; } ++_subclass_neq() { [[ $subclass != $crit_rhs ]]; } ++_subclass_like() { [[ $subclass =~ $crit_rhs ]]; } ++ ++_type_eq() { [[ $type = $crit_rhs ]]; } ++_type_neq() { [[ $type != $crit_rhs ]]; } ++_type_like() { [[ $type =~ $crit_rhs ]]; } ++ ++_uniquetype_eq() { [[ $uniquetype = $crit_rhs ]]; } ++_uniquetype_neq() { [[ $uniquetype != $crit_rhs ]]; } ++_uniquetype_like() { [[ $uniquetype =~ $crit_rhs ]]; } ++ ++# Check if the attribute we're filtering on appears in the string ++# given as argument. ++criteria_is_relevant() + { +- attr=$1 +- attr_val=${!attr} ++ [[ "$1" =~ "$crit_lhs" ]] ++} + ++# Run the criteria-matching function. ++criteria_matches() ++{ ++ $criteria_checker ++} ++ ++# Select a criteria-matching function based on the $criteria string. ++parse_criteria() ++{ + if [[ $criteria =~ "!=" ]] ; then +- # Pull out the operands from the criteria (everything to the left of +- # the operand, and everything on the right of the operand) +- crit_opd1=$(echo $criteria | $SED -e "s/[ ]*!=.*//") +- crit_opd2=$(echo $criteria | $SED -e "s/.*!=[ ]*//") +- # Perfom the comparison of the attribute and its value +- if [[ $crit_opd1 == $attr && $crit_opd2 != $attr_val ]]; then +- show=1 +- fi ++ crit_lhs=$(echo $criteria | $SED -e "s/[ ]*!=.*//") ++ crit_rhs=$(echo $criteria | $SED -e "s/.*!=[ ]*//") ++ case "$crit_lhs" in ++ class) criteria_checker=_class_neq;; ++ driver) criteria_checker=_driver_neq;; ++ name) criteria_checker=_name_neq;; ++ parent) criteria_checker=_parent_neq;; ++ physloc) criteria_checker=_physloc_neq;; ++ prefix) criteria_checker=_prefix_neq;; ++ status) criteria_checker=_status_neq;; ++ subclass) criteria_checker=_subclass_neq;; ++ type) criteria_checker=_type_neq;; ++ uniquetype) criteria_checker=_uniquetype_neq;; ++ *) criteria_checker=false;; ++ esac + elif [[ $criteria =~ "=" ]]; then +- crit_opd1=$(echo $criteria | $SED -e "s/[ ]*=.*//") +- crit_opd2=$(echo $criteria | $SED -e "s/.*=[ ]*//") +- if [[ $crit_opd1 == $attr && $crit_opd2 == $attr_val ]]; then +- show=1 +- fi ++ crit_lhs=$(echo $criteria | $SED -e "s/[ ]*=.*//") ++ crit_rhs=$(echo $criteria | $SED -e "s/.*=[ ]*//") ++ case "$crit_lhs" in ++ class) criteria_checker=_class_eq;; ++ driver) criteria_checker=_driver_eq;; ++ name) criteria_checker=_name_eq;; ++ parent) criteria_checker=_parent_eq;; ++ physloc) criteria_checker=_physloc_eq;; ++ prefix) criteria_checker=_prefix_eq;; ++ status) criteria_checker=_status_eq;; ++ subclass) criteria_checker=_subclass_eq;; ++ type) criteria_checker=_type_eq;; ++ uniquetype) criteria_checker=_uniquetype_eq;; ++ *) criteria_checker=false;; ++ esac + elif [[ $criteria =~ " LIKE " ]]; then +- crit_opd1=$(echo $criteria | $SED -e "s/[ ]*LIKE.*//") +- crit_opd2=$(echo $criteria | $SED -e "s/.*LIKE[ ]*//") +- if [[ $crit_opd1 == $attr && $attr_val =~ $crit_opd2 ]]; then +- show=1 +- fi ++ crit_lhs=$(echo $criteria | $SED -e "s/[ ]*LIKE.*//") ++ crit_rhs=$(echo $criteria | $SED -e "s/.*LIKE[ ]*//") ++ case "$crit_lhs" in ++ class) criteria_checker=_class_like;; ++ driver) criteria_checker=_driver_like;; ++ name) criteria_checker=_name_like;; ++ parent) criteria_checker=_parent_like;; ++ physloc) criteria_checker=_physloc_like;; ++ prefix) criteria_checker=_prefix_like;; ++ status) criteria_checker=_status_like;; ++ subclass) criteria_checker=_subclass_like;; ++ type) criteria_checker=_type_like;; ++ uniquetype) criteria_checker=_uniquetype_like;; ++ *) criteria_checker=false;; ++ esac + else + echo "Criteria must have =, !=, or LIKE operand. Exiting." + exit 1 +@@ -124,6 +200,8 @@ recursive=0 + + # default: display all devices + criteria="" ++criteria_checker=: ++crit_lhs="" + + # default: display all attributes + format="" +@@ -162,6 +240,12 @@ if [[ $criteria =~ " AND " ]] ; then + exit 1 + fi + ++# If we have a criteria string, parse it and choose a criteria ++# matching function. ++if [[ -n "$criteria" ]]; then ++ parse_criteria ++fi ++ + # Fill variables for the two display formats (regular and comma-separated) so + # we can print the output in a single place. + if [[ $comma_sep -eq 0 ]]; then +@@ -184,15 +268,10 @@ show_eth () + # if there is a criteria in the command line, check if this device matches + if [[ $criteria != "" ]] ; then + show=0 +- check_criteria "name" +- check_criteria "physloc" +- check_criteria "uniquetype" +- check_criteria "class" +- check_criteria "subclass" +- check_criteria "type" +- check_criteria "prefix" +- check_criteria "driver" +- check_criteria "status" ++ attrs="name physloc uniquetype class subclass type prefix driver status" ++ if criteria_is_relevant "$attrs" && criteria_matches; then ++ show=1 ++ fi + fi + + # print the info only if the device matches the criteria +@@ -330,15 +409,10 @@ for dev in $($LS -d /proc/device-tree/vdevice/v-scsi* 2> /dev/null) ; do + # device matches + if [[ $criteria != "" ]] ; then + show=0 +- check_criteria "name" +- check_criteria "physloc" +- check_criteria "status" +- check_criteria "uniquetype" +- check_criteria "class" +- check_criteria "subclass" +- check_criteria "type" +- check_criteria "prefix" +- check_criteria "driver" ++ attrs="name physloc status uniquetype class subclass type prefix driver" ++ if criteria_is_relevant "$attrs" && criteria_matches; then ++ show=1 ++ fi + fi + + if [[ $show -ne 0 ]]; then +@@ -395,14 +469,10 @@ for dev in $($LS -d /proc/device-tree/vdevice/v-scsi* 2> /dev/null) ; do + # if there is a criteria in the command line, check if this + # device matches + show=0 +- check_criteria "name" +- check_criteria "status" +- check_criteria "physloc" +- check_criteria "parent" +- check_criteria "uniquetype" +- check_criteria "class" +- check_criteria "subclass" +- check_criteria "type" ++ attrs="name status physloc parent uniquetype class subclass type" ++ if criteria_is_relevant "$attrs" && criteria_matches; then ++ show=1 ++ fi + else + show=1 + fi +@@ -475,15 +545,10 @@ for dev in $($LS -d /proc/device-tree/vdevice/vfc-client* 2> /dev/null) ; do + # device matches + if [[ $criteria != "" ]] ; then + show=0 +- check_criteria "name" +- check_criteria "physloc" +- check_criteria "status" +- check_criteria "uniquetype" +- check_criteria "class" +- check_criteria "subclass" +- check_criteria "type" +- check_criteria "prefix" +- check_criteria "driver" ++ attrs="name physloc status uniquetype class subclass type prefix driver" ++ if criteria_is_relevant "$attrs" && criteria_matches; then ++ show=1 ++ fi + fi + + if [[ $show -ne 0 ]]; then +@@ -543,14 +608,10 @@ for dev in $($LS -d /proc/device-tree/vdevice/vfc-client* 2> /dev/null) ; do + # if there is a criteria in the command line, check if this + # device matches + show=0 +- check_criteria "name" +- check_criteria "physloc" +- check_criteria "status" +- check_criteria "parent" +- check_criteria "uniquetype" +- check_criteria "class" +- check_criteria "subclass" +- check_criteria "type" ++ attrs="name physloc status parent uniquetype class subclass type" ++ if criteria_is_relevant "$attrs" && criteria_matches; then ++ show=1 ++ fi + else + show=1 + fi diff --git a/SPECS/powerpc-utils.spec b/SPECS/powerpc-utils.spec index 1790fd0..b68f124 100644 --- a/SPECS/powerpc-utils.spec +++ b/SPECS/powerpc-utils.spec @@ -1,6 +1,6 @@ Name: powerpc-utils Version: 1.3.8 -Release: 7%{?dist} +Release: 9%{?dist} Summary: PERL-based scripts for maintaining and servicing PowerPC systems Group: System Environment/Base @@ -52,6 +52,8 @@ Patch24: 0001-drmgr-fix-remove-by-index-operation.patch Patch25: powerpc-utils-1.3.8-numa-header.patch # https://github.com/ibm-power-utilities/powerpc-utils/pull/66 Patch26: powerpc-1.3.8-1b8437319660ed7c69b84ea81032458e615ff3c6.patch +# lsdevinfo: optimize criteria filtering +Patch27: powerpc-utils-1.3.8-4c6dc50d8de1a8b171675ee6b742c9f0250c28a1.patch %description PERL-based scripts for maintaining and servicing PowerPC systems. @@ -218,6 +220,12 @@ systemctl daemon-reload >/dev/null 2>&1 || : %{_mandir}/man8/drmgr.8* %changelog +* Mon Oct 18 2021 Than Ngo - 1.3.8-9 +- Rebuilt + +* Mon Oct 11 2021 Than Ngo - 1.3.8-8 +- lsdevinfo: optimize criteria filtering + * Fri Jul 16 2021 Than Ngo - 1.3.8-7 - Related: #1938420, Fix checking HCNID array size at boot time