From 0e7ce3752e3fb2eef7daf9d125d74b9f3b47df0c Mon Sep 17 00:00:00 2001 From: Jiping Ma Date: Mon, 29 Apr 2024 22:43:36 -0400 Subject: [PATCH] Support the single driver switch In order to select between the in-tree and OOT drivers for the single driver, a cmdline parameter out-of-tree-drivers need be used. The cmdline parameter out-of-tree-drivers will be set driver names that these drivers will be used as the out of tree drivers. For example "out-of-tree-drivers=ice,i40e,iavf", the OOT drivers ice, i40e, iavf will be loaded by "insmod" command before udevd is started, and that ensures that the OOT drivers will be loaded rather than the in-tree drivers. The default drivers will be the in-tree drivers if there is not out-of-tree-drivers in the cmdline parameters or they are not set correct. 1. Switch the single driver as the following step. a) ice * switch the ice driver to the OOT version out-of-tree-drivers=ice * switch the ice driver to the in-tree version remove ice from out-of-tree-drivers or set any value except ice b) i40e * switch the i40e driver to the OOT version out-of-tree-drivers=i40e * switch the i40e driver to the in-tree version remove i40e from out-of-tree-drivers or set any value except i40e c) iavf * switch the iavf driver to the OOT version out-of-tree-drivers=iavf * switch the iavf driver to the in-tree version remove iavf from out-of-tree-drivers or set any value except iavf 2. Switch the bundle driver as the following step. * switch the bundle drivers to the OOT version. out-of-tree-drivers=ice,iavf,i40e * switch the bundle drivers to the in-tree version out-of-tree-drivers= or remove out-of-tree-drivers from the boot commandline. or out-of-tree-drivers=aaa,bb,xx(any value except ice,i40e,iavf) 3. Switch any two ones. * switch ice and iavf to the OOT version. out-of-tree-drivers=ice,iavf * switch i40e and iavf to the OOT version. out-of-tree-drivers=i40e,iavf * switch to the in-tree version. just remove driver name from out-of-tree-drivers or set any value except ice, iavf and i40e. Verification: Switch drivers between the OOT and in-tree drivers. - switch to the OOT drivers 1. Add cmdline parameter out-of-tree-drivers=ice,iavf,i40e 2. reboot can switch to the OOT drivers for ice, iavf and i40e. - switch to the in-tree drivers 1. Remove cmdline parameter out-of-tree-drivers 2. reboot can switch to the in-tree drivers for ice, iavf and i40e. - switch to the OOT ice driver(for iavf and i40e is same with ice) 1. Add cmdline parameter out-of-tree-drivers=ice 2. reboot can switch to the OOT driver for ice - switch to the OOT drivers for ice and iavf (for the combination of the other two drivers are same with this one. ) 1. Add cmdline parameter out-of-tree-drivers=ice,iavf 2. reboot can switch to the OOT drivers for ice, iavf. - Set the cmdline parameter out-of-tree-drivers=ice,iavf,aaa It can switch to the OOT driver for ice and iavf. Story: 2011056 Task: 50002 Change-Id: I927b0754d132796141caa2036bf626da527068ee Signed-off-by: Jiping Ma (cherry picked from commit 8a0d36a154a9e41286ed61b3da4cb4c4f6f9b225) --- ...019-Support-the-single-driver-switch.patch | 150 ++++++++++++++++++ ostree/initramfs-ostree/debian/patches/series | 1 + 2 files changed, 151 insertions(+) create mode 100644 ostree/initramfs-ostree/debian/patches/0019-Support-the-single-driver-switch.patch diff --git a/ostree/initramfs-ostree/debian/patches/0019-Support-the-single-driver-switch.patch b/ostree/initramfs-ostree/debian/patches/0019-Support-the-single-driver-switch.patch new file mode 100644 index 000000000..f3d75a8b2 --- /dev/null +++ b/ostree/initramfs-ostree/debian/patches/0019-Support-the-single-driver-switch.patch @@ -0,0 +1,150 @@ +From 27da188f7054f4aec1d94f1ef3d16ee5d0a23f9c Mon Sep 17 00:00:00 2001 +From: Jiping Ma +Date: Thu, 25 Apr 2024 23:05:07 -0700 +Subject: [PATCH 19/19] Support the single driver switch + +In order to select between the in-tree and OOT drivers for the single +driver, a cmdline parameter out-of-tree-drivers need be used. The +cmdline parameter out-of-tree-drivers will be set driver names that +these drivers will be used as the out of tree drivers. For example +"out-of-tree-drivers=ice,i40e,iavf", the OOT drivers ice, i40e, iavf +will be loaded by "insmod" command before udevd is started, and that +ensures that the OOT drivers will be loaded rather than the in-tree +drivers. + +The default drivers will be the in-tree drivers if there is not +out-of-tree-drivers in the cmdline parameters or they are not set +correct. + +1. Switch the single driver as the following step. + a) ice + * switch the ice driver to the OOT version + out-of-tree-drivers=ice + * switch the ice driver to the in-tree version + remove ice from out-of-tree-drivers + b) i40e + * switch the i40e driver to the OOT version + out-of-tree-drivers=i40e + * switch the i40e driver to the in-tree version + remove i40e from out-of-tree-drivers + c) iavf + * switch the iavf driver to the OOT version + out-of-tree-drivers=iavf + * switch the iavf driver to the in-tree version + remove iavf from out-of-tree-drivers +2. Switch the bundle driver as the following step. + * switch the bundle drivers to the OOT version. + out-of-tree-drivers=ice,iavf,i40e + * switch the bundle drivers to the in-tree version + out-of-tree-drivers= + or + remove out-of-tree-drivers from the boot commandline. +3. Switch any two ones. + * switch ice and iavf to the OOT version. + out-of-tree-drivers=ice,iavf + * switch i40e and iavf to the OOT version. + out-of-tree-drivers=i40e,iavf + * switch to the in-tree version. + just remove driver name from out-of-tree-drivers. + +Signed-off-by: Jiping Ma +--- + init-ostree-install.sh | 28 +++++++++++++--------------- + init-ostree.sh | 27 ++++++++++++--------------- + 2 files changed, 25 insertions(+), 30 deletions(-) + +diff --git a/init-ostree-install.sh b/init-ostree-install.sh +index c9172de..0d047fb 100644 +--- a/init-ostree-install.sh ++++ b/init-ostree-install.sh +@@ -476,20 +476,18 @@ do_mount_fs() { + [[ -e /proc/mounts ]] && { grep -q -e "^$1 $2 $1" /proc/mounts && { log_info "$2 ($1) already mounted"; return 0; } } + mount -t "$1" "$1" "$2" || fatal "Error mounting $2" + } ++ + network_modules() { +- if grep -s -q '\smulti-drivers-switch=' /proc/cmdline ; then +- if [ -d /lib/modules/"$(uname -r)"/weak-updates/ice-"${DRIVER_VERSION}" ]; then +- insmod /lib/modules/"$(uname -r)"/weak-updates/ice-"${DRIVER_VERSION}"/ice.ko +- insmod /lib/modules/"$(uname -r)"/weak-updates/i40e-"${DRIVER_VERSION}"/i40e.ko +- insmod /lib/modules/"$(uname -r)"/weak-updates/iavf-"${DRIVER_VERSION}"/iavf.ko +- echo "OOT NIC ${DRIVER_VERSION} drivers have been activated" +- else +- ln -s /lib/firmware/updates/intel/ice/ddp/ice-*.pkg /lib/firmware/intel/ice/ddp/ice.pkg +- echo "In-tree NIC drivers have been activated" +- fi +- else +- ln -s /lib/firmware/updates/intel/ice/ddp/ice-*.pkg /lib/firmware/intel/ice/ddp/ice.pkg +- echo "In-tree NIC drivers have been activated" ++ ln -s /lib/firmware/updates/intel/ice/ddp/ice-*.pkg /lib/firmware/intel/ice/ddp/ice.pkg ++ if grep -s -q '\sout-of-tree-drivers=' /proc/cmdline ; then ++ drivers=(`echo ${OOT_DRIVERS} | tr ',' ' '` ) ++ for driver in ${drivers[@]} ++ do ++ if [ -e /lib/modules/"$(uname -r)"/weak-updates/"${driver}"*/"${driver}".ko ]; then ++ insmod /lib/modules/"$(uname -r)"//weak-updates/"${driver}"*/"${driver}".ko ++ echo "OOT driver ${driver} have been activated" ++ fi ++ done + fi + } + +@@ -746,8 +744,8 @@ read_args() { + OSTREE_ROOT_B_DEVICE=$optarg ;; + inst_ostree_var=*) + OSTREE_VAR_DEVICE=$optarg ;; +- multi-drivers-switch=*) +- DRIVER_VERSION=$optarg ;; ++ out-of-tree-drivers=*) ++ OOT_DRIVERS=$optarg ;; + esac + done + # defaults if not set +diff --git a/init-ostree.sh b/init-ostree.sh +index c74f350..d1f6416 100644 +--- a/init-ostree.sh ++++ b/init-ostree.sh +@@ -68,19 +68,16 @@ do_mount_fs() { + } + + network_modules() { +- if grep -s -q '\smulti-drivers-switch=' /proc/cmdline ; then +- if [ -d /lib/modules/"$(uname -r)"/weak-updates/ice-"${DRIVER_VERSION}" ]; then +- insmod /lib/modules/"$(uname -r)"/weak-updates/ice-"${DRIVER_VERSION}"/ice.ko +- insmod /lib/modules/"$(uname -r)"/weak-updates/i40e-"${DRIVER_VERSION}"/i40e.ko +- insmod /lib/modules/"$(uname -r)"/weak-updates/iavf-"${DRIVER_VERSION}"/iavf.ko +- echo "OOT NIC ${DRIVER_VERSION} drivers have been activated" +- else +- ln -s /lib/firmware/updates/intel/ice/ddp/ice-*.pkg /lib/firmware/intel/ice/ddp/ice.pkg +- echo "In-tree NIC drivers have been activated" +- fi +- else +- ln -s /lib/firmware/updates/intel/ice/ddp/ice-*.pkg /lib/firmware/intel/ice/ddp/ice.pkg +- echo "In-tree NIC drivers have been activated" ++ ln -s /lib/firmware/updates/intel/ice/ddp/ice-*.pkg /lib/firmware/intel/ice/ddp/ice.pkg ++ if grep -s -q '\sout-of-tree-drivers=' /proc/cmdline ; then ++ drivers=(`echo ${OOT_DRIVERS} | tr ',' ' '` ) ++ for driver in ${drivers[@]} ++ do ++ if [ -e /lib/modules/"$(uname -r)"/weak-updates/"${driver}"*/"${driver}".ko ]; then ++ insmod /lib/modules/"$(uname -r)"//weak-updates/"${driver}"*/"${driver}".ko ++ echo "OOT driver ${driver} have been activated" ++ fi ++ done + fi + } + +@@ -209,8 +206,8 @@ read_args() { + HW_SETTLE=$optarg ;; + multipath=*) + MULTIPATH=$optarg ;; +- multi-drivers-switch=*) +- DRIVER_VERSION=$optarg ;; ++ out-of-tree-drivers=*) ++ OOT_DRIVERS=$optarg ;; + ostree_var=*) + OSTREE_VAR_DEVICE=${optarg} ;; + esac +-- +2.43.0 + diff --git a/ostree/initramfs-ostree/debian/patches/series b/ostree/initramfs-ostree/debian/patches/series index 95260137c..df7b5c54a 100644 --- a/ostree/initramfs-ostree/debian/patches/series +++ b/ostree/initramfs-ostree/debian/patches/series @@ -16,3 +16,4 @@ 0016-init-ostree-install.sh-skip-eject-operation-through-.patch 0017-Allow-adjusting-boot-order.patch 0018-Support-OOT-and-In-tree-drivers-switch.patch +0019-Support-the-single-driver-switch.patch