[ovs-dev] [PATCH v4] rhel: support kmod build against multiple 7.2 kernels, rhel6

Martin Xu martinxu9.ovs at gmail.com
Wed Aug 1 20:54:23 UTC 2018


This patch extends commit 89dd5819cf18 (rhel: support kmod-openvswitch
build against multiple kernels, rhel6) to support building kmod RPMs
with multiple minor revisions within 3.10.0-327 kernels. It was
discovered for RHEL 7.2 that 41.3 minor revision introduced backward
incompatible changes.

Also fixes a scenario not working for RHEL7.3 in commit 89dd5819cf18.
When multiple versions passed into the kversion for the spec file, the
variable is used as is for the kernel module paths for command
weak-modules --add-modules. Then the modules cannot be found.

Fixes: 89dd5819cf18 (rhel: support kmod-openvswitch build against
multiple kernels, rhel6)

VMware-BZ: #2170334

Signed-off-by: Martin Xu <martinxu9.ovs at gmail.com>
CC: Greg Rose <gvrose8192 at gmail.com>
CC: Ben Pfaff <blp at ovn.org>
CC: Flavio Leitner <fbl at redhat.com>
CC: Yi-Hung Wei <yihung.wei at gmail.com>
---
v1->v2: added author sign-off signature
v2->v3: instead of using hard coded versions for openvswitch kernel modules,
        retrieve the information from kmod package
v3->v4: sent wrong v3 patch, some echo's for debugging not removed

 rhel/kmod-openvswitch-rhel6.spec.in                | 13 ++---
 ...sr_share_openvswitch_scripts_ovs-kmod-manage.sh | 67 +++++++++++++++++++---
 2 files changed, 64 insertions(+), 16 deletions(-)

diff --git a/rhel/kmod-openvswitch-rhel6.spec.in b/rhel/kmod-openvswitch-rhel6.spec.in
index f18802d..afbad96 100644
--- a/rhel/kmod-openvswitch-rhel6.spec.in
+++ b/rhel/kmod-openvswitch-rhel6.spec.in
@@ -31,7 +31,8 @@ BuildRoot:      %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
 # for specified kernel version.
 # Use -D 'kversion 3.10.0-693.1.1.el7.x86_64 3.10.0-693.17.1.el7.x86_64'
 # to build package for mulitple kernel versions in the same package
-# This only works for kernel 3.10.0 major revision 693
+# This only works for kernel 3.10.0 major revision 693 (RHEL 7.4)
+# and major revision 327 (RHEL 7.2)
 # By default, build against the latest installed kernel-devel
 %{!?kversion:%global kversion %(rpm -qa | egrep "^kernel(-rt|-aarch64)?-devel" | /usr/lib/rpm/redhat/rpmsort -r | head -n 1| sed "s/^kernel.*-devel-//")}
 
@@ -86,8 +87,8 @@ install -p -m 0755 rhel/usr_share_openvswitch_scripts_ovs-kmod-manage.sh \
 current_kernel=$(uname -r)
 IFS=. read installed_major installed_minor installed_micro installed_arch \
     installed_build <<<"${current_kernel##*-}"
-if [ "$installed_major" = "693" ]; then
-    # Workaround for RHEL 7.4
+if [ "$installed_major" = "327" ] || [ "$installed_major" = "693" ]; then
+    # Workaround for RHEL 7.2 and 7.4
     if [ -x "/usr/share/%{oname}/scripts/ovs-kmod-manage.sh" ]; then
         /usr/share/%{oname}/scripts/ovs-kmod-manage.sh
     fi
@@ -97,10 +98,8 @@ else
         [ -d "/lib/modules/$k/kernel/" ] && depmod -a "$k"
     done
     if [ -x "/sbin/weak-modules" ]; then
-        for m in openvswitch vport-gre vport-stt vport-geneve \
-                 vport-lisp vport-vxlan; do
-            echo "/lib/modules/%{kversion}/extra/%{oname}/$m.ko"
-        done | /sbin/weak-modules --add-modules
+        rpm -ql kmod-%{oname} | grep '\.ko$' | \
+            /sbin/weak-modules --add-modules
     fi
 fi
 
diff --git a/rhel/usr_share_openvswitch_scripts_ovs-kmod-manage.sh b/rhel/usr_share_openvswitch_scripts_ovs-kmod-manage.sh
index a6c738f..656488a 100644
--- a/rhel/usr_share_openvswitch_scripts_ovs-kmod-manage.sh
+++ b/rhel/usr_share_openvswitch_scripts_ovs-kmod-manage.sh
@@ -14,23 +14,39 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# This version of the script is intended to be used on kernel version
-# 3.10.0 major revision 693 only. It is packaged in the openvswitch kmod RPM
-# built using the rhel6 spec file, and run in the post-install for minor 
-# revision 693 kernels.
+# This version of the script is intended to be used on kernel version 3.10.0
+# major revision 327 and 693 only. It is packaged in the openvswitch kmod RPM
+# built using the rhel6 spec file, and run in the post-install for major
+# revision 327/693 kernels.
 #
-# Due to some backward incompatible changes introduced in minor revision 17.1,
+# For kernel 3.10.0-693,
+# due to some backward incompatible changes introduced in minor revision 17.1,
 # kernel modules built against kernels newer than 17.1 cannot be loaded on
 # system running kernels older than 17.1, vice versa.
 #
+# For kernel 3.10.0-327,
+# due to some backward incompatible changes introduced in minor revision 41.3,
+# kernel modules built against kernels newer than 41.3 cannot be loaded on
+# system running kernels older than 41.3, vice versa.
+#
 # This script checks the current running kernel version, and update symlinks
 # for the openvswitch kernel modules in the appropriate kernel directory,
 # provided the kmod RPM has installed kernel modules files built from both
-# 1.1 and 17.1 minor revisions.
+# minor revisions.
 # 
 # In case of a kernel minor revision change after the openvswitch kmod package
 # is installed, this script shall be run manually after system reboots and
 # switches to a different kernel
+if [ -n "$(rpm -qa kmod-openvswitch)" ]; then
+    rpmname="kmod-openvswitch"
+elif [ -n "$(rpm -qa openvswitch-kmod)" ]; then
+    rpmname="openvswitch-kmod"
+else
+    echo "openvswitch kmod package not installed, existing"
+    exit 1
+fi
+#echo $rpmname
+
 script_name=$(basename -- "$0")
 current_kernel=$(uname -r)
 echo current kernel is $current_kernel
@@ -42,7 +58,40 @@ IFS=. read installed_major installed_minor installed_micro \
 # installed_build=$installed_build
 
 expected_base_minor="el7"
-expected_minor=11
+if [ "$installed_major" = "327" ]; then
+    expected_minor=36
+elif [ "$installed_major" = "693" ]; then
+    expected_minor=11
+else
+    echo "This script is not intended to run on kernel $(uname -r)"
+    exit 1
+fi
+
+kmod_minor_versions=()
+kversion=$(rpm -ql ${rpmname} | grep '\.ko$' | \
+           sed -n -e 's/^\/lib\/modules\/\(.*\)\/extra\/.*$/\1/p' | sort | uniq)
+for kv in $kversion; do
+    IFS=. read kmod_major kmod_minor kmod_micro kmod_arch \
+        kmod_build <<<"${kv##*-}"
+#    echo kmod_major=$kmod_major kmod_minor=$kmod_minor \
+#        kmod_micro=$kmod_micro kmod_arch=$kmod_arch \
+#        kmod_build=$kmod_build
+    kmod_minor_versions+=($kmod_minor)
+done
+sorted_kmod_minor_versions=$(printf "%s\n" "${kmod_minor_versions[@]}" | \
+                             sort -n)
+#echo "$sorted_kmod_minor_versions"
+
+if [ ! -n "$sorted_kmod_minor_versions" ]; then
+    echo "No kernel modules found from package $rpmname, exiting"
+    exit 1
+else
+    # first line for kmod_minor_low_ver, last for kmod_minor_high_ver
+    kmod_minor_low_ver=$(echo "$sorted_kmod_minor_versions" | head -1)
+    kmod_minor_high_ver=$(echo "$sorted_kmod_minor_versions" | tail -1)
+fi
+#echo "Installing KMOD with minor revisions $kmod_minor_low_ver and \
+#     $kmod_minor_high_ver"
 
 found_match=false
 for kname in `ls -d /lib/modules/*`
@@ -51,14 +100,14 @@ do
 #   echo major=$major minor=$minor micro=$micro arch=$arch build=$build
     if [ "$installed_minor" = "$expected_base_minor" ] ||
        [ "$installed_minor" -le "$expected_minor" ]; then
-        if [ "$minor" = "1" ]; then
+        if [ "$minor" = "$kmod_minor_low_ver" ]; then
             requested_kernel=$kname
             found_match="true"
             echo "Installing Openvswitch KMOD from kernel $kname"
             break
         fi
     else
-        if [ "$minor" = "17" ]; then
+        if [ "$minor" = "$kmod_minor_high_ver" ]; then
             requested_kernel=$kname
             found_match="true"
             echo "Installing Openvswitch KMOD from kernel $kname"
-- 
1.8.3.1



More information about the dev mailing list