diff --git a/.gitignore b/.gitignore
index a859ef0..efb4f34 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,3 @@
 SOURCES/eppic-e8844d3.tar.gz
-SOURCES/kexec-tools-2.0.24.tar.xz
-SOURCES/makedumpfile-1.7.1.tar.gz
+SOURCES/kexec-tools-2.0.25.tar.xz
+SOURCES/makedumpfile-1.7.2.tar.gz
diff --git a/.kexec-tools.metadata b/.kexec-tools.metadata
index cea0d50..5fcdc81 100644
--- a/.kexec-tools.metadata
+++ b/.kexec-tools.metadata
@@ -1,3 +1,3 @@
 80ac3f5e77d3c79883edadf14428734db4720009 SOURCES/eppic-e8844d3.tar.gz
-62b7a99779d66ffd07a1684f7b640d32c9697f0c SOURCES/kexec-tools-2.0.24.tar.xz
-8f8485c2a1edbc730f4fa1b96ae3ec8d8f1f9761 SOURCES/makedumpfile-1.7.1.tar.gz
+78d5d4f7e9d358ca234db9c84a551d9d411eb0b5 SOURCES/kexec-tools-2.0.25.tar.xz
+24bce02cd42cdbb960ada4d9e733355582e35784 SOURCES/makedumpfile-1.7.2.tar.gz
diff --git a/SOURCES/60-fadump.install b/SOURCES/60-fadump.install
new file mode 100755
index 0000000..75318ff
--- /dev/null
+++ b/SOURCES/60-fadump.install
@@ -0,0 +1,31 @@
+#!/usr/bin/bash
+
+COMMAND="$1"
+KERNEL_VERSION="$2"
+
+if ! [[ ${KERNEL_INSTALL_MACHINE_ID-x} ]]; then
+    exit 0
+fi
+
+# Currently, fadump is supported only in environments with
+# writable /boot directory.
+if [[ ! -w "/boot" ]]; then
+    exit 0
+fi
+
+FADUMP_INITRD="/boot/.initramfs-${KERNEL_VERSION}.img.default"
+FADUMP_INITRD_CHECKSUM="$FADUMP_INITRD.checksum"
+
+ret=0
+case "$COMMAND" in
+    add)
+        # Do nothing, fadump initramfs is strictly host only
+        # and managed by kdump service
+        ;;
+    remove)
+        rm -f -- "$FADUMP_INITRD"
+        rm -f -- "$FADUMP_INITRD_CHECKSUM"
+        ret=$?
+        ;;
+esac
+exit $ret
diff --git a/SOURCES/92-crashkernel.install b/SOURCES/92-crashkernel.install
index 1d67a13..19bd078 100755
--- a/SOURCES/92-crashkernel.install
+++ b/SOURCES/92-crashkernel.install
@@ -7,7 +7,7 @@ KERNEL_IMAGE="$4"
 
 case "$COMMAND" in
 add)
-	kdumpctl reset-crashkernel-for-installed_kernel "$KERNEL_VERSION"
+	kdumpctl _reset-crashkernel-for-installed_kernel "$KERNEL_VERSION"
 	exit 0
 	;;
 esac
diff --git a/SOURCES/crashkernel-howto.txt b/SOURCES/crashkernel-howto.txt
index 6573847..54e1141 100644
--- a/SOURCES/crashkernel-howto.txt
+++ b/SOURCES/crashkernel-howto.txt
@@ -82,6 +82,8 @@ kernels to the default value is:
 
 	grubby --update-kernel ALL --args "crashkernel=$(kdumpctl get-default-crashkernel)"
 
+NOTE: On s390x you also need to run zipl for the change to take effect.
+
 Estimate crashkernel
 ====================
 
diff --git a/SOURCES/dracut-kdump.sh b/SOURCES/dracut-kdump.sh
index b69bc98..06e2c02 100755
--- a/SOURCES/dracut-kdump.sh
+++ b/SOURCES/dracut-kdump.sh
@@ -162,9 +162,15 @@ dump_fs()
 	$CORE_COLLECTOR /proc/vmcore "$_dump_fs_path/vmcore-incomplete"
 	_dump_exitcode=$?
 	if [ $_dump_exitcode -eq 0 ]; then
-		mv "$_dump_fs_path/vmcore-incomplete" "$_dump_fs_path/vmcore"
-		sync
-		dinfo "saving vmcore complete"
+		sync -f "$_dump_fs_path/vmcore-incomplete"
+		_sync_exitcode=$?
+		if [ $_sync_exitcode -eq 0 ]; then
+			mv "$_dump_fs_path/vmcore-incomplete" "$_dump_fs_path/vmcore"
+			dinfo "saving vmcore complete"
+		else
+			derror "sync vmcore failed, exitcode:$_sync_exitcode"
+			return 1
+		fi
 	else
 		derror "saving vmcore failed, exitcode:$_dump_exitcode"
 	fi
@@ -472,27 +478,54 @@ save_vmcore_dmesg_ssh()
 	fi
 }
 
-get_host_ip()
+wait_online_network()
 {
-	if is_nfs_dump_target || is_ssh_dump_target; then
-		kdumpnic=$(getarg kdumpnic=)
-		if [ -z "$kdumpnic" ]; then
-			derror "failed to get kdumpnic!"
-			return 1
-		fi
-		if ! kdumphost=$(ip addr show dev "$kdumpnic" | grep '[ ]*inet'); then
-			derror "wrong kdumpnic: $kdumpnic"
-			return 1
-		fi
-		kdumphost=$(echo "$kdumphost" | head -n 1 | awk '{print $2}')
-		kdumphost="${kdumphost%%/*}"
-		if [ -z "$kdumphost" ]; then
-			derror "wrong kdumpnic: $kdumpnic"
-			return 1
+	# In some cases, network may still not be ready because nm-online is called
+	# with "-s" which means to wait for NetworkManager startup to complete, rather
+	# than waiting for network connectivity specifically. Wait 10mins more for the
+	# network to be truely ready in these cases.
+	_loop=0
+	while [ $_loop -lt 600 ]; do
+		sleep 1
+		_loop=$((_loop + 1))
+		if _route=$(kdump_get_ip_route "$1" 2> /dev/null); then
+			printf "%s" "$_route"
+			return
 		fi
-		HOST_IP=$kdumphost
+	done
+
+	derror "Oops. The network still isn't ready after waiting 10mins."
+	exit 1
+}
+
+get_host_ip()
+{
+
+	if ! is_nfs_dump_target && ! is_ssh_dump_target; then
+		return 0
 	fi
-	return 0
+
+	_kdump_remote_ip=$(getarg kdump_remote_ip=)
+
+	if [ -z "$_kdump_remote_ip" ]; then
+		derror "failed to get remote IP address!"
+		return 1
+	fi
+
+	if ! _route=$(wait_online_network "$_kdump_remote_ip"); then
+		return 1
+	fi
+
+	_netdev=$(kdump_get_ip_route_field "$_route" "dev")
+
+	if ! _kdumpip=$(ip addr show dev "$_netdev" | grep '[ ]*inet'); then
+		derror "Failed to get IP of $_netdev"
+		return 1
+	fi
+
+	_kdumpip=$(echo "$_kdumpip" | head -n 1 | awk '{print $2}')
+	_kdumpip="${_kdumpip%%/*}"
+	HOST_IP=$_kdumpip
 }
 
 read_kdump_confs()
@@ -515,7 +548,7 @@ read_kdump_confs()
 				DUMP_INSTRUCTION="dump_fs $config_val"
 			fi
 			;;
-		ext[234] | xfs | btrfs | minix | nfs)
+		ext[234] | xfs | btrfs | minix | nfs | virtiofs)
 			config_val=$(get_mntpoint_from_target "$config_val")
 			DUMP_INSTRUCTION="dump_fs $config_val"
 			;;
diff --git a/SOURCES/dracut-module-setup.sh b/SOURCES/dracut-module-setup.sh
index c319fc2..d01c5d9 100755
--- a/SOURCES/dracut-module-setup.sh
+++ b/SOURCES/dracut-module-setup.sh
@@ -1,10 +1,22 @@
 #!/bin/bash
 
+_DRACUT_KDUMP_NM_TMP_DIR="$DRACUT_TMPDIR/$$-DRACUT_KDUMP_NM"
+
+_save_kdump_netifs() {
+    unique_netifs[$1]=1
+}
+
+_get_kdump_netifs() {
+    echo -n "${!unique_netifs[@]}"
+}
+
 kdump_module_init() {
     if ! [[ -d "${initdir}/tmp" ]]; then
         mkdir -p "${initdir}/tmp"
     fi
 
+    mkdir -p "$_DRACUT_KDUMP_NM_TMP_DIR"
+
     . /lib/kdump/kdump-lib.sh
 }
 
@@ -40,6 +52,14 @@ depends() {
         _dep="$_dep ssh-client"
     fi
 
+    if is_lvm2_thinp_dump_target; then
+        if grep -q lvmthinpool-monitor <<< $(dracut --list-modules); then
+            add_opt_module lvmthinpool-monitor
+        else
+            dwarning "Required lvmthinpool-monitor modules is missing! Please upgrade dracut >= 057."
+        fi
+    fi
+
     if [[ "$(uname -m)" == "s390x" ]]; then
         _dep="$_dep znet"
     fi
@@ -84,39 +104,6 @@ source_ifcfg_file() {
     fi
 }
 
-kdump_setup_dns() {
-    local _netdev="$1"
-    local _conpath="$2"
-    local _nameserver _dns _tmp array
-    local _dnsfile=${initdir}/etc/cmdline.d/42dns.conf
-
-    _tmp=$(get_nmcli_field_by_conpath "IP4.DNS" "$_conpath")
-    # shellcheck disable=SC2206
-    array=(${_tmp//|/ })
-    if [[ ${array[*]} ]]; then
-        for _dns in "${array[@]}"; do
-            echo "nameserver=$_dns" >> "$_dnsfile"
-        done
-    else
-        dwarning "Failed to get DNS info via nmcli output. Now try sourcing ifcfg script"
-        source_ifcfg_file "$_netdev"
-        [[ -n $DNS1 ]] && echo "nameserver=$DNS1" > "$_dnsfile"
-        [[ -n $DNS2 ]] && echo "nameserver=$DNS2" >> "$_dnsfile"
-    fi
-
-    while read -r content; do
-        _nameserver=$(echo "$content" | grep ^nameserver)
-        [[ -z $_nameserver ]] && continue
-
-        _dns=$(echo "$_nameserver" | awk '{print $2}')
-        [[ -z $_dns ]] && continue
-
-        if [[ ! -f $_dnsfile ]] || ! grep -q "$_dns" "$_dnsfile"; then
-            echo "nameserver=$_dns" >> "$_dnsfile"
-        fi
-    done < "/etc/resolv.conf"
-}
-
 # $1: repeat times
 # $2: string to be repeated
 # $3: separator
@@ -227,291 +214,309 @@ cal_netmask_by_prefix() {
     fi
 }
 
-#$1: netdev name
-#$2: srcaddr
-#if it use static ip echo it, or echo null
-kdump_static_ip() {
-    local _netdev="$1" _srcaddr="$2" kdumpnic="$3" _ipv6_flag
-    local _netmask _gateway _ipaddr _target _nexthop _prefix
+kdump_get_mac_addr() {
+    cat "/sys/class/net/$1/address"
+}
 
-    _ipaddr=$(ip addr show dev "$_netdev" permanent | awk "/ $_srcaddr\/.* /{print \$2}")
+#Bonding or team master modifies the mac address
+#of its slaves, we should use perm address
+kdump_get_perm_addr() {
+    local addr
+    addr=$(ethtool -P "$1" | sed -e 's/Permanent address: //')
+    if [[ -z $addr ]] || [[ $addr == "00:00:00:00:00:00" ]]; then
+        derror "Can't get the permanent address of $1"
+    else
+        echo "$addr"
+    fi
+}
 
-    if is_ipv6_address "$_srcaddr"; then
-        _ipv6_flag="-6"
+apply_nm_initrd_generator_timeouts() {
+    local _timeout_conf
+
+    _timeout_conf=$_DRACUT_KDUMP_NM_TMP_DIR/timeout_conf
+    cat << EOF > "$_timeout_conf"
+[device-95-kdump]
+carrier-wait-timeout=30000
+
+[connection-95-kdump]
+ipv4.dhcp-timeout=90
+ipv6.dhcp-timeout=90
+EOF
+
+    inst "$_timeout_conf" "/etc/NetworkManager/conf.d/95-kdump-timeouts.conf"
+}
+
+use_ipv4_or_ipv6() {
+    local _netif=$1 _uuid=$2
+
+    if [[ -v "ipv4_usage[$_netif]" ]]; then
+        nmcli connection modify --temporary "$_uuid" ipv4.may-fail no &> >(ddebug)
     fi
 
-    if [[ -n $_ipaddr ]]; then
-        _gateway=$(ip $_ipv6_flag route list dev "$_netdev" \
-            | awk '/^default /{print $3}' | head -n 1)
+    if [[ -v "ipv6_usage[$_netif]" ]]; then
+        nmcli connection modify --temporary "$_uuid" ipv6.may-fail no &> >(ddebug)
+    fi
 
-        if [[ "x" != "x"$_ipv6_flag ]]; then
-            # _ipaddr="2002::56ff:feb6:56d5/64", _netmask is the number after "/"
-            _netmask=${_ipaddr#*\/}
-            _srcaddr="[$_srcaddr]"
-            _gateway="[$_gateway]"
-        else
-            _prefix=$(cut -d'/' -f2 <<< "$_ipaddr")
-            if ! _netmask=$(cal_netmask_by_prefix "$_prefix" "$_ipv6_flag"); then
-                derror "Failed to calculate netmask for $_ipaddr"
-                exit 1
-            fi
-        fi
-        echo -n "${_srcaddr}::${_gateway}:${_netmask}::"
+    if [[ -v "ipv4_usage[$_netif]" ]] && [[ ! -v "ipv6_usage[$_netif]" ]]; then
+        nmcli connection modify --temporary "$_uuid" ipv6.method disabled &> >(ddebug)
+    elif [[ ! -v "ipv4_usage[$_netif]" ]] && [[ -v "ipv6_usage[$_netif]" ]]; then
+        nmcli connection modify --temporary "$_uuid" ipv4.method disabled &> >(ddebug)
     fi
+}
 
-    /sbin/ip $_ipv6_flag route show | grep -v default \
-        | grep ".*via.* $_netdev " | grep -v "^[[:space:]]*nexthop" \
-        | while read -r _route; do
-            _target=$(echo "$_route" | awk '{print $1}')
-            _nexthop=$(echo "$_route" | awk '{print $3}')
-            if [[ "x" != "x"$_ipv6_flag ]]; then
-                _target="[$_target]"
-                _nexthop="[$_nexthop]"
-            fi
-            echo "rd.route=$_target:$_nexthop:$kdumpnic"
-        done >> "${initdir}/etc/cmdline.d/45route-static.conf"
+_clone_nmconnection() {
+    local _clone_output _name _unique_id
+
+    _unique_id=$1
+    _name=$(nmcli --get-values connection.id connection show "$_unique_id")
+    if _clone_output=$(nmcli connection clone --temporary uuid "$_unique_id" "$_name"); then
+        sed -E -n "s/.* \(.*\) cloned as.*\((.*)\)\.$/\1/p" <<< "$_clone_output"
+        return 0
+    fi
 
-    kdump_handle_mulitpath_route "$_netdev" "$_srcaddr" "$kdumpnic"
+    return 1
 }
 
-kdump_handle_mulitpath_route() {
-    local _netdev="$1" _srcaddr="$2" kdumpnic="$3" _ipv6_flag
-    local _target _nexthop _route _weight _max_weight _rule
+_match_nmconnection_by_mac() {
+    local _unique_id _dev _mac _mac_field
 
-    if is_ipv6_address "$_srcaddr"; then
-        _ipv6_flag="-6"
+    _unique_id=$1
+    _dev=$2
+
+    _mac=$(kdump_get_perm_addr "$_dev")
+    [[ $_mac != 'not set' ]] || return
+    _mac_field=$(nmcli --get-values connection.type connection show "$_unique_id").mac-address
+    nmcli connection modify --temporary "$_unique_id" "$_mac_field" "$_mac" &> >(ddebug)
+    nmcli connection modify --temporary "$_unique_id" "connection.interface-name" "" &> >(ddebug)
+}
+
+# Clone and modify NM connection profiles
+#
+# This function makes use of "nmcli clone" to automatically convert ifcfg-*
+# files to Networkmanager .nmconnection connection profiles and also modify the
+# properties of .nmconnection if necessary.
+clone_and_modify_nmconnection() {
+    local _dev _cloned_nmconnection_file_path _tmp_nmconnection_file_path _old_uuid _uuid
+
+    _dev=$1
+    _nmconnection_file_path=$2
+
+    _old_uuid=$(nmcli --get-values connection.uuid connection show filename "$_nmconnection_file_path")
+
+    if ! _uuid=$(_clone_nmconnection "$_old_uuid"); then
+        derror "Failed to clone $_old_uuid"
+        exit 1
     fi
 
-    while IFS="" read -r _route; do
-        if [[ $_route =~ [[:space:]]+nexthop ]]; then
-            _route=${_route##[[:space:]]}
-            # Parse multipath route, using previous _target
-            [[ $_target == 'default' ]] && continue
-            [[ $_route =~ .*via.*\ $_netdev ]] || continue
-
-            _weight=$(echo "$_route" | cut -d ' ' -f7)
-            if [[ $_weight -gt $_max_weight ]]; then
-                _nexthop=$(echo "$_route" | cut -d ' ' -f3)
-                _max_weight=$_weight
-                if [[ "x" != "x"$_ipv6_flag ]]; then
-                    _rule="rd.route=[$_target]:[$_nexthop]:$kdumpnic"
-                else
-                    _rule="rd.route=$_target:$_nexthop:$kdumpnic"
-                fi
-            fi
+    use_ipv4_or_ipv6 "$_dev" "$_uuid"
+
+    nmcli connection modify --temporary uuid "$_uuid" connection.wait-device-timeout 60000 &> >(ddebug)
+    # For physical NIC i.e. non-user created NIC, ask NM to match a
+    # connection profile based on MAC address
+    _match_nmconnection_by_mac "$_uuid" "$_dev"
+
+    _cloned_nmconnection_file_path=$(nmcli --get-values UUID,FILENAME connection show | sed -n "s/^${_uuid}://p")
+    _tmp_nmconnection_file_path=$_DRACUT_KDUMP_NM_TMP_DIR/$(basename "$_nmconnection_file_path")
+    cp "$_cloned_nmconnection_file_path" "$_tmp_nmconnection_file_path"
+    # change uuid back to old value in case it's refered by other connection
+    # profile e.g. connection.master could be interface name of the master
+    # device or UUID of the master connection.
+    sed -i -E "s/(^uuid=).*$/\1${_old_uuid}/g" "$_tmp_nmconnection_file_path"
+    nmcli connection del "$_uuid" &> >(ddebug)
+    echo -n "$_tmp_nmconnection_file_path"
+}
+
+_install_nmconnection() {
+    local _src _nmconnection_name _dst
+
+    _src=$1
+    _nmconnection_name=$(basename "$_src")
+    _dst="/etc/NetworkManager/system-connections/$_nmconnection_name"
+    inst "$_src" "$_dst"
+}
+
+kdump_install_nmconnections() {
+    local _netif _nm_conn_path _cloned_nm_path
+
+    while IFS=: read -r _netif _nm_conn_path; do
+        [[ -v "unique_netifs[$_netif]" ]] || continue
+        if _cloned_nm_path=$(clone_and_modify_nmconnection "$_netif" "$_nm_conn_path"); then
+            _install_nmconnection "$_cloned_nm_path"
         else
-            [[ -n $_rule ]] && echo "$_rule"
-            _target=$(echo "$_route" | cut -d ' ' -f1)
-            _rule="" _max_weight=0 _weight=0
+            derror "Failed to install the .nmconnection for $_netif"
+            exit 1
         fi
-    done >> "${initdir}/etc/cmdline.d/45route-static.conf" \
-        <<< "$(/sbin/ip $_ipv6_flag route show)"
+    done <<< "$(nmcli -t -f device,filename connection show --active)"
 
-    [[ -n $_rule ]] && echo "$_rule" >> "${initdir}/etc/cmdline.d/45route-static.conf"
+    # Stop dracut 35network-manger to calling nm-initrd-generator.
+    # Note this line of code can be removed after NetworkManager >= 1.35.2
+    # gets released.
+    echo > "${initdir}/usr/libexec/nm-initrd-generator"
 }
 
-kdump_get_mac_addr() {
-    cat "/sys/class/net/$1/address"
+kdump_install_nm_netif_allowlist() {
+    local _netif _except_netif _netif_allowlist _netif_allowlist_nm_conf
+
+    for _netif in $1; do
+        _per_mac=$(kdump_get_perm_addr "$_netif")
+        if [[ "$_per_mac" != 'not set' ]]; then
+            _except_netif="mac:$_per_mac"
+        else
+            _except_netif="interface-name:$_netif"
+        fi
+        _netif_allowlist="${_netif_allowlist}except:${_except_netif};"
+    done
+
+    _netif_allowlist_nm_conf=$_DRACUT_KDUMP_NM_TMP_DIR/netif_allowlist_nm_conf
+    cat << EOF > "$_netif_allowlist_nm_conf"
+[device-others]
+match-device=${_netif_allowlist}
+managed=false
+EOF
+
+    inst "$_netif_allowlist_nm_conf" "/etc/NetworkManager/conf.d/10-kdump-netif_allowlist.conf"
 }
 
-#Bonding or team master modifies the mac address
-#of its slaves, we should use perm address
-kdump_get_perm_addr() {
-    local addr
-    addr=$(ethtool -P "$1" | sed -e 's/Permanent address: //')
-    if [[ -z $addr ]] || [[ $addr == "00:00:00:00:00:00" ]]; then
-        derror "Can't get the permanent address of $1"
-    else
-        echo "$addr"
-    fi
+_get_nic_driver() {
+    ethtool -i "$1" | sed -n -E "s/driver: (.*)/\1/p"
 }
 
-# Prefix kernel assigned names with "kdump-". EX: eth0 -> kdump-eth0
-# Because kernel assigned names are not persistent between 1st and 2nd
-# kernel. We could probably end up with eth0 being eth1, eth0 being
-# eth1, and naming conflict happens.
-kdump_setup_ifname() {
-    local _ifname
-
-    # If ifname already has 'kdump-' prefix, we must be switching from
-    # fadump to kdump. Skip prefixing 'kdump-' in this case as adding
-    # another prefix may truncate the ifname. Since an ifname with
-    # 'kdump-' is already persistent, this should be fine.
-    if [[ $1 =~ eth* ]] && [[ ! $1 =~ ^kdump-* ]]; then
-        _ifname="kdump-$1"
-    else
-        _ifname="$1"
-    fi
+_get_hpyerv_physical_driver() {
+    local _physical_nic
+
+    _physical_nic=$(find /sys/class/net/"$1"/ -name 'lower_*' | sed -En "s/\/.*lower_(.*)/\1/p")
+    [[ -n $_physical_nic ]] || return
+    _get_nic_driver "$_physical_nic"
+}
+
+kdump_install_nic_driver() {
+    local _netif _driver _drivers
+
+    _drivers=()
+
+    for _netif in $1; do
+        [[ $_netif == lo ]] && continue
+        _driver=$(_get_nic_driver "$_netif")
+        if [[ -z $_driver ]]; then
+            derror "Failed to get the driver of $_netif"
+            exit 1
+        fi
+
+        if [[ $_driver == "802.1Q VLAN Support" ]]; then
+            # ethtool somehow doesn't return the driver name for a VLAN NIC
+            _driver=8021q
+        elif [[ $_driver == "team" ]]; then
+            # install the team mode drivers like team_mode_roundrobin.ko as well
+            _driver='=drivers/net/team'
+        elif [[ $_driver == "hv_netvsc" ]]; then
+            # A Hyper-V VM may have accelerated networking
+            # https://learn.microsoft.com/en-us/azure/virtual-network/accelerated-networking-overview
+            # Install the driver of physical NIC as well
+            _drivers+=("$(_get_hpyerv_physical_driver "$_netif")")
+        fi
 
-    echo "$_ifname"
+        _drivers+=("$_driver")
+    done
+
+    [[ -n ${_drivers[*]} ]] || return
+    instmods "${_drivers[@]}"
 }
 
 kdump_setup_bridge() {
     local _netdev=$1
-    local _brif _dev _mac _kdumpdev
+    local _dev
     for _dev in "/sys/class/net/$_netdev/brif/"*; do
         [[ -e $_dev ]] || continue
         _dev=${_dev##*/}
-        _kdumpdev=$_dev
         if kdump_is_bond "$_dev"; then
-            (kdump_setup_bond "$_dev" "$(get_nmcli_connection_apath_by_ifname "$_dev")") || exit 1
+            kdump_setup_bond "$_dev" || return 1
         elif kdump_is_team "$_dev"; then
             kdump_setup_team "$_dev"
         elif kdump_is_vlan "$_dev"; then
             kdump_setup_vlan "$_dev"
-        else
-            _mac=$(kdump_get_mac_addr "$_dev")
-            _kdumpdev=$(kdump_setup_ifname "$_dev")
-            echo -n " ifname=$_kdumpdev:$_mac" >> "${initdir}/etc/cmdline.d/41bridge.conf"
         fi
-        _brif+="$_kdumpdev,"
+        _save_kdump_netifs "$_dev"
     done
-    echo " bridge=$_netdev:${_brif%,}" >> "${initdir}/etc/cmdline.d/41bridge.conf"
 }
 
-# drauct takes bond=<bondname>[:<bondslaves>:[:<options>]] syntax to parse
-#    bond. For example:
-#     bond=bond0:eth0,eth1:mode=balance-rr
 kdump_setup_bond() {
     local _netdev="$1"
-    local _conpath="$2"
-    local _dev _mac _slaves _kdumpdev _bondoptions
-    for _dev in $(cat "/sys/class/net/$_netdev/bonding/slaves"); do
-        _mac=$(kdump_get_perm_addr "$_dev")
-        _kdumpdev=$(kdump_setup_ifname "$_dev")
-        echo -n " ifname=$_kdumpdev:$_mac" >> "${initdir}/etc/cmdline.d/42bond.conf"
-        _slaves+="$_kdumpdev,"
-    done
-    echo -n " bond=$_netdev:${_slaves%,}" >> "${initdir}/etc/cmdline.d/42bond.conf"
-
-    _bondoptions=$(get_nmcli_field_by_conpath "bond.options" "$_conpath")
-
-    if [[ -z $_bondoptions ]]; then
-        dwarning "Failed to get bond configuration via nmlci output. Now try sourcing ifcfg script."
-        source_ifcfg_file "$_netdev"
-        _bondoptions="$(echo "$BONDING_OPTS" | xargs echo | tr " " ",")"
-    fi
-
-    if [[ -z $_bondoptions ]]; then
-        derror "Get empty bond options"
-        exit 1
-    fi
+    local _dev
 
-    echo ":$_bondoptions" >> "${initdir}/etc/cmdline.d/42bond.conf"
+    for _dev in $(< "/sys/class/net/$_netdev/bonding/slaves"); do
+        _save_kdump_netifs "$_dev"
+    done
 }
 
 kdump_setup_team() {
     local _netdev=$1
-    local _dev _mac _slaves _kdumpdev
+    local _dev
     for _dev in $(teamnl "$_netdev" ports | awk -F':' '{print $2}'); do
-        _mac=$(kdump_get_perm_addr "$_dev")
-        _kdumpdev=$(kdump_setup_ifname "$_dev")
-        echo -n " ifname=$_kdumpdev:$_mac" >> "${initdir}/etc/cmdline.d/44team.conf"
-        _slaves+="$_kdumpdev,"
+        _save_kdump_netifs "$_dev"
     done
-    echo " team=$_netdev:${_slaves%,}" >> "${initdir}/etc/cmdline.d/44team.conf"
-    #Buggy version teamdctl outputs to stderr!
-    #Try to use the latest version of teamd.
-    if ! teamdctl "$_netdev" config dump > "${initdir}/tmp/$$-$_netdev.conf"; then
-        derror "teamdctl failed."
-        exit 1
-    fi
-    inst_dir /etc/teamd
-    inst_simple "${initdir}/tmp/$$-$_netdev.conf" "/etc/teamd/$_netdev.conf"
-    rm -f "${initdir}/tmp/$$-$_netdev.conf"
 }
 
 kdump_setup_vlan() {
     local _netdev=$1
-    local _phydev
-    local _netmac
-    local _kdumpdev
+    local _parent_netif
 
-    _phydev="$(awk '/^Device:/{print $2}' /proc/net/vlan/"$_netdev")"
-    _netmac="$(kdump_get_mac_addr "$_phydev")"
+    _parent_netif="$(awk '/^Device:/{print $2}' /proc/net/vlan/"$_netdev")"
 
     #Just support vlan over bond and team
-    if kdump_is_bridge "$_phydev"; then
+    if kdump_is_bridge "$_parent_netif"; then
         derror "Vlan over bridge is not supported!"
         exit 1
-    elif kdump_is_bond "$_phydev"; then
-        (kdump_setup_bond "$_phydev" "$(get_nmcli_connection_apath_by_ifname "$_phydev")") || exit 1
-        echo " vlan=$(kdump_setup_ifname "$_netdev"):$_phydev" > "${initdir}/etc/cmdline.d/43vlan.conf"
-    else
-        _kdumpdev="$(kdump_setup_ifname "$_phydev")"
-        echo " vlan=$(kdump_setup_ifname "$_netdev"):$_kdumpdev ifname=$_kdumpdev:$_netmac" > "${initdir}/etc/cmdline.d/43vlan.conf"
+    elif kdump_is_bond "$_parent_netif"; then
+        kdump_setup_bond "$_parent_netif" || return 1
+    elif kdump_is_team "$_parent_netif"; then
+        kdump_setup_team "$_parent_netif" || return 1
     fi
+
+    _save_kdump_netifs "$_parent_netif"
 }
 
-# find online znet device
-# return ifname (_netdev)
-# code reaped from the list_configured function of
-# https://github.com/hreinecke/s390-tools/blob/master/zconf/znetconf
-find_online_znet_device() {
-    local CCWGROUPBUS_DEVICEDIR="/sys/bus/ccwgroup/devices"
-    local NETWORK_DEVICES d ifname ONLINE
-
-    [[ ! -d $CCWGROUPBUS_DEVICEDIR ]] && return
-    NETWORK_DEVICES=$(find $CCWGROUPBUS_DEVICEDIR)
-    for d in $NETWORK_DEVICES; do
-        [[ ! -f "$d/online" ]] && continue
-        read -r ONLINE < "$d/online"
-        if [[ $ONLINE -ne 1 ]]; then
-            continue
-        fi
-        # determine interface name, if there (only for qeth and if
-        # device is online)
-        if [[ -f $d/if_name ]]; then
-            read -r ifname < "$d/if_name"
-        elif [[ -d $d/net ]]; then
-            ifname=$(ls "$d/net/")
-        fi
-        [[ -n $ifname ]] && break
-    done
-    echo -n "$ifname"
+_find_znet_nmconnection() {
+    LANG=C grep -s -E -i -l \
+        "^s390-subchannels=([0-9]\.[0-9]\.[a-f0-9]+;){0,2}" \
+        "$1"/*.nmconnection | LC_ALL=C sed -e "$2"
 }
 
-# setup s390 znet cmdline
-# $1: netdev (ifname)
-# $2: nmcli connection path
+# setup s390 znet
+#
+# Note part of code is extracted from ccw_init provided by s390utils
 kdump_setup_znet() {
-    local _netdev="$1"
-    local _conpath="$2"
-    local s390_prefix="802-3-ethernet.s390-"
-    local _options=""
-    local NETTYPE
-    local SUBCHANNELS
-
-    NETTYPE=$(get_nmcli_field_by_conpath "${s390_prefix}nettype" "$_conpath")
-    SUBCHANNELS=$(get_nmcli_field_by_conpath "${s390_prefix}subchannels" "$_conpath")
-    _options=$(get_nmcli_field_by_conpath "${s390_prefix}options" "$_conpath")
-
-    if [[ -z $NETTYPE || -z $SUBCHANNELS || -z $_options ]]; then
-        dwarning "Failed to get znet configuration via nmlci output. Now try sourcing ifcfg script."
-        source_ifcfg_file "$_netdev"
-        for i in $OPTIONS; do
-            _options=${_options},$i
-        done
+    local _config_file _unique_name _NM_conf_dir
+    local __sed_discard_ignored_files='/\(~\|\.bak\|\.old\|\.orig\|\.rpmnew\|\.rpmorig\|\.rpmsave\)$/d'
+
+    if [[ "$(uname -m)" != "s390x" ]]; then
+        return
     fi
 
-    if [[ -z $NETTYPE || -z $SUBCHANNELS || -z $_options ]]; then
-        exit 1
+    _NM_conf_dir="/etc/NetworkManager/system-connections"
+
+    _config_file=$(_find_znet_nmconnection "$initdir/$_NM_conf_dir" "$__sed_discard_ignored_files")
+    if [[ -n "$_config_file" ]]; then
+        ddebug "$_config_file has already contained the znet config"
+        return
     fi
 
-    echo "rd.znet=${NETTYPE},${SUBCHANNELS},${_options} rd.znet_ifname=$_netdev:${SUBCHANNELS}" > "${initdir}/etc/cmdline.d/30znet.conf"
-}
+    _config_file=$(LANG=C grep -s -E -i -l \
+        "^[[:space:]]*SUBCHANNELS=['\"]?([0-9]\.[0-9]\.[a-f0-9]+,){0,2}" \
+        /etc/sysconfig/network-scripts/ifcfg-* \
+        | LC_ALL=C sed -e "$__sed_discard_ignored_files")
 
-kdump_get_ip_route() {
-    local _route
-    if ! _route=$(/sbin/ip -o route get to "$1" 2>&1); then
-        derror "Bad kdump network destination: $1"
-        exit 1
+    if [[ -z "$_config_file" ]]; then
+        _config_file=$(_find_znet_nmconnection "$_NM_conf_dir" "$__sed_discard_ignored_files")
+    fi
+
+    if [[ -n "$_config_file" ]]; then
+        _unique_name=$(cat /proc/sys/kernel/random/uuid)
+        nmcli connection clone --temporary "$_config_file" "$_unique_name" &> >(ddebug)
+        nmcli connection modify --temporary "$_unique_name" connection.autoconnect false
+        inst "/run/NetworkManager/system-connections/${_unique_name}.nmconnection" "${_NM_conf_dir}/${_unique_name}.nmconnection"
+        nmcli connection del "$_unique_name" &> >(ddebug)
     fi
-    echo "$_route"
-}
 
-kdump_get_ip_route_field() {
-    echo "$1" | sed -n -e "s/^.*\<$2\>\s\+\(\S\+\).*$/\1/p"
 }
 
 kdump_get_remote_ip() {
@@ -527,83 +532,55 @@ kdump_get_remote_ip() {
     echo "$_remote"
 }
 
-# Setup dracut to bring up network interface that enable
-# initramfs accessing giving destination
+# Collect netifs needed by kdump
 # $1: destination host
-kdump_install_net() {
-    local _destaddr _srcaddr _route _netdev _conpath kdumpnic
-    local _static _proto _ip_conf _ip_opts _ifname_opts
-    local _znet_netdev _znet_conpath
+kdump_collect_netif_usage() {
+    local _destaddr _srcaddr _route _netdev
 
     _destaddr=$(kdump_get_remote_ip "$1")
     _route=$(kdump_get_ip_route "$_destaddr")
     _srcaddr=$(kdump_get_ip_route_field "$_route" "src")
     _netdev=$(kdump_get_ip_route_field "$_route" "dev")
-    _conpath=$(get_nmcli_connection_apath_by_ifname "$_netdev")
-    _netmac=$(kdump_get_mac_addr "$_netdev")
-    kdumpnic=$(kdump_setup_ifname "$_netdev")
-
-    _znet_netdev=$(find_online_znet_device)
-    if [[ -n $_znet_netdev ]]; then
-        _znet_conpath=$(get_nmcli_connection_apath_by_ifname "$_znet_netdev")
-        if ! (kdump_setup_znet "$_znet_netdev" "$_znet_conpath"); then
-            derror "Failed to set up znet"
-            exit 1
-        fi
-    fi
-
-    _static=$(kdump_static_ip "$_netdev" "$_srcaddr" "$kdumpnic")
-    if [[ -n $_static ]]; then
-        _proto=none
-    elif is_ipv6_address "$_srcaddr"; then
-        _proto=auto6
-    else
-        _proto=dhcp
-    fi
-
-    _ip_conf="${initdir}/etc/cmdline.d/40ip.conf"
-    _ip_opts=" ip=${_static}$kdumpnic:${_proto}"
-
-    # dracut doesn't allow duplicated configuration for same NIC, even they're exactly the same.
-    # so we have to avoid adding duplicates
-    # We should also check /proc/cmdline for existing ip=xx arg.
-    # For example, iscsi boot will specify ip=xxx arg in cmdline.
-    if [[ ! -f $_ip_conf ]] || ! grep -q "$_ip_opts" "$_ip_conf" \
-        && ! grep -q "ip=[^[:space:]]*$_netdev" /proc/cmdline; then
-        echo "$_ip_opts" >> "$_ip_conf"
-    fi
 
     if kdump_is_bridge "$_netdev"; then
         kdump_setup_bridge "$_netdev"
     elif kdump_is_bond "$_netdev"; then
-        (kdump_setup_bond "$_netdev" "$_conpath") || exit 1
+        kdump_setup_bond "$_netdev" || return 1
     elif kdump_is_team "$_netdev"; then
         kdump_setup_team "$_netdev"
     elif kdump_is_vlan "$_netdev"; then
         kdump_setup_vlan "$_netdev"
-    else
-        _ifname_opts=" ifname=$kdumpnic:$_netmac"
-        echo "$_ifname_opts" >> "$_ip_conf"
     fi
-
-    kdump_setup_dns "$_netdev" "$_conpath"
+    _save_kdump_netifs "$_netdev"
 
     if [[ ! -f ${initdir}/etc/cmdline.d/50neednet.conf ]]; then
         # network-manager module needs this parameter
         echo "rd.neednet" >> "${initdir}/etc/cmdline.d/50neednet.conf"
     fi
 
-    # Save netdev used for kdump as cmdline
-    # Whoever calling kdump_install_net() is setting up the default gateway,
-    # ie. bootdev/kdumpnic. So don't override the setting if calling
-    # kdump_install_net() for another time. For example, after setting eth0 as
-    # the default gate way for network dump, eth1 in the fence kdump path will
-    # call kdump_install_net again and we don't want eth1 to be the default
-    # gateway.
-    if [[ ! -f ${initdir}/etc/cmdline.d/60kdumpnic.conf ]] \
-        && [[ ! -f ${initdir}/etc/cmdline.d/70bootdev.conf ]]; then
-        echo "kdumpnic=$kdumpnic" > "${initdir}/etc/cmdline.d/60kdumpnic.conf"
-        echo "bootdev=$kdumpnic" > "${initdir}/etc/cmdline.d/70bootdev.conf"
+    if [[ ! -f ${initdir}/etc/cmdline.d/60kdumpip.conf ]]; then
+        echo "kdump_remote_ip=$_destaddr" > "${initdir}/etc/cmdline.d/60kdumpip.conf"
+    fi
+
+    if is_ipv6_address "$_srcaddr"; then
+        ipv6_usage[$_netdev]=1
+    else
+        ipv4_usage[$_netdev]=1
+    fi
+}
+
+# Setup dracut to bring up network interface that enable
+# initramfs accessing giving destination
+kdump_install_net() {
+    local _netifs
+
+    _netifs=$(_get_kdump_netifs)
+    if [[ -n "$_netifs" ]]; then
+        kdump_install_nmconnections
+        apply_nm_initrd_generator_timeouts
+        kdump_setup_znet
+        kdump_install_nm_netif_allowlist "$_netifs"
+        kdump_install_nic_driver "$_netifs"
     fi
 }
 
@@ -642,7 +619,7 @@ default_dump_target_install_conf() {
 
     _fstype=$(get_fs_type_from_target "$_target")
     if is_fs_type_nfs "$_fstype"; then
-        kdump_install_net "$_target"
+        kdump_collect_netif_usage "$_target"
         _fstype="nfs"
     else
         _target=$(kdump_get_persistent_dev "$_target")
@@ -673,16 +650,16 @@ kdump_install_conf() {
                 _pdev=$(persistent_policy="by-id" kdump_get_persistent_dev "$_val")
                 sed -i -e "s#^${_opt}[[:space:]]\+$_val#$_opt $_pdev#" "${initdir}/tmp/$$-kdump.conf"
                 ;;
-            ext[234] | xfs | btrfs | minix)
+            ext[234] | xfs | btrfs | minix | virtiofs)
                 _pdev=$(kdump_get_persistent_dev "$_val")
                 sed -i -e "s#^${_opt}[[:space:]]\+$_val#$_opt $_pdev#" "${initdir}/tmp/$$-kdump.conf"
                 ;;
             ssh | nfs)
-                kdump_install_net "$_val"
+                kdump_collect_netif_usage "$_val"
                 ;;
             dracut_args)
                 if [[ $(get_dracut_args_fstype "$_val") == nfs* ]]; then
-                    kdump_install_net "$(get_dracut_args_target "$_val")"
+                    kdump_collect_netif_usage "$(get_dracut_args_target "$_val")"
                 fi
                 ;;
             kdump_pre | kdump_post | extra_bins)
@@ -804,7 +781,7 @@ kdump_setup_iscsi_device() {
 
     [[ -n $username_in ]] && userpwd_in_str=":$username_in:$password_in"
 
-    kdump_install_net "$tgt_ipaddr"
+    kdump_collect_netif_usage "$tgt_ipaddr"
 
     # prepare netroot= command line
     # FIXME: Do we need to parse and set other parameters like protocol, port
@@ -840,7 +817,7 @@ kdump_check_iscsi_targets() {
     # If our prerequisites are not met, fail anyways.
     type -P iscsistart > /dev/null || return 1
 
-    kdump_check_setup_iscsi() (
+    kdump_check_setup_iscsi() {
         local _dev
         _dev=$1
 
@@ -850,7 +827,7 @@ kdump_check_iscsi_targets() {
             cd ..
         done
         [[ -d iscsi_session ]] && kdump_setup_iscsi_device "$PWD"
-    )
+    }
 
     [[ $hostonly ]] || [[ $mount_needs ]] && {
         for_each_host_dev_and_slaves_all kdump_check_setup_iscsi
@@ -968,7 +945,7 @@ kdump_configure_fence_kdump() {
 
     # setup network for each node
     for node in ${nodes}; do
-        kdump_install_net "$node"
+        kdump_collect_netif_usage "$node"
     done
 
     dracut_install /etc/hosts
@@ -1017,6 +994,7 @@ remove_cpu_online_rule() {
 }
 
 install() {
+    declare -A unique_netifs ipv4_usage ipv6_usage
     local arch
 
     kdump_module_init
@@ -1076,6 +1054,8 @@ install() {
         inst "ip"
     fi
 
+    kdump_install_net
+
     # For the lvm type target under kdump, in /etc/lvm/lvm.conf we can
     # safely replace "reserved_memory=XXXX"(default value is 8192) with
     # "reserved_memory=1024" to lower memory pressure under kdump. We do
diff --git a/SOURCES/gen-kdump-conf.sh b/SOURCES/gen-kdump-conf.sh
new file mode 100755
index 0000000..a9f124f
--- /dev/null
+++ b/SOURCES/gen-kdump-conf.sh
@@ -0,0 +1,231 @@
+#!/bin/bash
+# $1: target arch
+
+SED_EXP=""
+
+generate()
+{
+	sed "$SED_EXP" << EOF
+# This file contains a series of commands to perform (in order) in the kdump
+# kernel after a kernel crash in the crash kernel(1st kernel) has happened.
+#
+# Directives in this file are only applicable to the kdump initramfs, and have
+# no effect once the root filesystem is mounted and the normal init scripts are
+# processed.
+#
+# Currently, only one dump target and path can be specified.  If the dumping to
+# the configured target fails, the failure action which can be configured via
+# the "failure_action" directive will be performed.
+#
+# Supported options:
+#
+# auto_reset_crashkernel <yes|no>
+#           - whether to reset kernel crashkernel to new default value
+#             or not when kexec-tools updates the default crashkernel value and
+#             existing kernels using the old default kernel crashkernel value.
+#             The default value is yes.
+#
+# raw <partition>
+#           - Will dd /proc/vmcore into <partition>.
+#             Use persistent device names for partition devices,
+#             such as /dev/vg/<devname>.
+#
+# nfs <nfs mount>
+#           - Will mount nfs to <mnt>, and copy /proc/vmcore to
+#             <mnt>/<path>/%HOST-%DATE/, supports DNS.
+#
+# ssh <user@server>
+#           - Will save /proc/vmcore to <user@server>:<path>/%HOST-%DATE/,
+#             supports DNS.
+#             NOTE: make sure the user has write permissions on the server.
+#
+# sshkey <path>
+#           - Will use the sshkey to do ssh dump.
+#             Specify the path of the ssh key to use when dumping
+#             via ssh. The default value is /root/.ssh/kdump_id_rsa.
+#
+# <fs type> <partition>
+#           - Will mount -t <fs type> <partition> <mnt>, and copy
+#             /proc/vmcore to <mnt>/<path>/%HOST_IP-%DATE/.
+#             NOTE: <partition> can be a device node, label or uuid.
+#             It's recommended to use persistent device names
+#             such as /dev/vg/<devname>.
+#             Otherwise it's suggested to use label or uuid.
+#             Supported fs types: ext[234], xfs, btrfs, minix, virtiofs
+#
+# path <path>
+#           - "path" represents the file system path in which vmcore
+#             will be saved.  If a dump target is specified in
+#             kdump.conf, then "path" is relative to the specified
+#             dump target.
+#
+#             Interpretation of "path" changes a bit if the user didn't
+#             specify any dump target explicitly in kdump.conf.  In this
+#             case, "path" represents the absolute path from root. The
+#             dump target and adjusted path are arrived at automatically
+#             depending on what's mounted in the current system.
+#
+#             Ignored for raw device dumps.  If unset, will use the default
+#             "/var/crash".
+#
+# core_collector <command> <options>
+#           - This allows you to specify the command to copy
+#             the vmcore.  The default is makedumpfile, which on
+#             some architectures can drastically reduce vmcore size.
+#             See /sbin/makedumpfile --help for a list of options.
+#             Note that the -i and -g options are not needed here,
+#             as the initrd will automatically be populated with a
+#             config file appropriate for the running kernel.
+#             The default core_collector for raw/ssh dump is:
+#             "makedumpfile -F -l --message-level 7 -d 31".
+#             The default core_collector for other targets is:
+#             "makedumpfile -l --message-level 7 -d 31".
+#
+#             "makedumpfile -F" will create a flattened vmcore.
+#             You need to use "makedumpfile -R" to rearrange the dump data to
+#             a normal dumpfile readable with analysis tools.  For example:
+#             "makedumpfile -R vmcore < vmcore.flat".
+#
+#             For core_collector format details, you can refer to
+#             kexec-kdump-howto.txt or kdump.conf manpage.
+#
+# kdump_post <binary | script>
+#           - This directive allows you to run a executable binary
+#             or script after the vmcore dump process terminates.
+#             The exit status of the current dump process is fed to
+#             the executable binary or script as its first argument.
+#             All files under /etc/kdump/post.d are collectively sorted
+#             and executed in lexical order, before binary or script
+#             specified kdump_post parameter is executed.
+#
+# kdump_pre <binary | script>
+#           - Works like the "kdump_post" directive, but instead of running
+#             after the dump process, runs immediately before it.
+#             Exit status of this binary is interpreted as follows:
+#               0 - continue with dump process as usual
+#               non 0 - run the final action (reboot/poweroff/halt)
+#             All files under /etc/kdump/pre.d are collectively sorted and
+#             executed in lexical order, after binary or script specified
+#             kdump_pre parameter is executed.
+#             Even if the binary or script in /etc/kdump/pre.d directory
+#             returns non 0 exit status, the processing is continued.
+#
+# extra_bins <binaries | shell scripts>
+#           - This directive allows you to specify additional binaries or
+#             shell scripts to be included in the kdump initrd.
+#             Generally they are useful in conjunction with a kdump_post
+#             or kdump_pre binary or script which depends on these extra_bins.
+#
+# extra_modules <module(s)>
+#           - This directive allows you to specify extra kernel modules
+#             that you want to be loaded in the kdump initrd.
+#             Multiple modules can be listed, separated by spaces, and any
+#             dependent modules will automatically be included.
+#
+# failure_action <reboot | halt | poweroff | shell | dump_to_rootfs>
+#           - Action to perform in case dumping fails.
+#             reboot:   Reboot the system.
+#             halt:     Halt the system.
+#             poweroff: Power down the system.
+#             shell:    Drop to a bash shell.
+#                       Exiting the shell reboots the system by default,
+#                       or perform "final_action".
+#             dump_to_rootfs:  Dump vmcore to rootfs from initramfs context and
+#                       reboot by default or perform "final_action".
+#                       Useful when non-root dump target is specified.
+#             The default option is "reboot".
+#
+# default <reboot | halt | poweroff | shell | dump_to_rootfs>
+#           - Same as the "failure_action" directive above, but this directive
+#             is obsolete and will be removed in the future.
+#
+# final_action <reboot | halt | poweroff>
+#           - Action to perform in case dumping succeeds. Also performed
+#             when "shell" or "dump_to_rootfs" failure action finishes.
+#             Each action is same as the "failure_action" directive above.
+#             The default is "reboot".
+#
+# force_rebuild <0 | 1>
+#           - By default, kdump initrd will only be rebuilt when necessary.
+#             Specify 1 to force rebuilding kdump initrd every time when kdump
+#             service starts.
+#
+# force_no_rebuild <0 | 1>
+#           - By default, kdump initrd will be rebuilt when necessary.
+#             Specify 1 to bypass rebuilding of kdump initrd.
+#
+#             force_no_rebuild and force_rebuild options are mutually
+#             exclusive and they should not be set to 1 simultaneously.
+#
+# override_resettable <0 | 1>
+#           - Usually an unresettable block device can't be a dump target.
+#             Specifying 1 when you want to dump even though the block
+#             target is unresettable
+#             By default, it is 0, which will not try dumping destined to fail.
+#
+# dracut_args <arg(s)>
+#           - Pass extra dracut options when rebuilding kdump initrd.
+#
+# fence_kdump_args <arg(s)>
+#           - Command line arguments for fence_kdump_send (it can contain
+#             all valid arguments except hosts to send notification to).
+#
+# fence_kdump_nodes <node(s)>
+#           - List of cluster node(s) except localhost, separated by spaces,
+#             to send fence_kdump notifications to.
+#             (this option is mandatory to enable fence_kdump).
+#
+
+#raw /dev/vg/lv_kdump
+#ext4 /dev/vg/lv_kdump
+#ext4 LABEL=/boot
+#ext4 UUID=03138356-5e61-4ab3-b58e-27507ac41937
+#virtiofs myfs
+#nfs my.server.com:/export/tmp
+#nfs [2001:db8::1:2:3:4]:/export/tmp
+#ssh user@my.server.com
+#ssh user@2001:db8::1:2:3:4
+#sshkey /root/.ssh/kdump_id_rsa
+auto_reset_crashkernel yes
+path /var/crash
+core_collector makedumpfile -l --message-level 7 -d 31
+#core_collector scp
+#kdump_post /var/crash/scripts/kdump-post.sh
+#kdump_pre /var/crash/scripts/kdump-pre.sh
+#extra_bins /usr/bin/lftp
+#extra_modules gfs2
+#failure_action shell
+#force_rebuild 1
+#force_no_rebuild 1
+#dracut_args --omit-drivers "cfg80211 snd" --add-drivers "ext2 ext3"
+#fence_kdump_args -p 7410 -f auto -c 0 -i 10
+#fence_kdump_nodes node1 node2
+EOF
+}
+
+update_param()
+{
+	SED_EXP="${SED_EXP}s/^$1.*$/$1 $2/;"
+}
+
+case "$1" in
+aarch64) ;;
+
+i386) ;;
+
+ppc64) ;;
+
+ppc64le) ;;
+
+s390x)
+	update_param core_collector \
+		"makedumpfile -c --message-level 7 -d 31"
+	;;
+x86_64) ;;
+
+*)
+	echo "Warning: Unknown architecture '$1', using default kdump.conf template."
+	;;
+esac
+
+generate
diff --git a/SOURCES/kdump-lib-initramfs.sh b/SOURCES/kdump-lib-initramfs.sh
index 9be0fe9..a8ec3fe 100755
--- a/SOURCES/kdump-lib-initramfs.sh
+++ b/SOURCES/kdump-lib-initramfs.sh
@@ -7,6 +7,7 @@ DEFAULT_PATH="/var/crash/"
 KDUMP_CONFIG_FILE="/etc/kdump.conf"
 FENCE_KDUMP_CONFIG_FILE="/etc/sysconfig/fence_kdump"
 FENCE_KDUMP_SEND="/usr/libexec/fence_kdump_send"
+LVM_CONF="/etc/lvm/lvm.conf"
 
 # Read kdump config in well formated style
 kdump_read_conf()
@@ -54,6 +55,11 @@ is_fs_type_nfs()
 	[ "$1" = "nfs" ] || [ "$1" = "nfs4" ]
 }
 
+is_fs_type_virtiofs()
+{
+	[ "$1" = "virtiofs" ]
+}
+
 # If $1 contains dracut_args "--mount", return <filesystem type>
 get_dracut_args_fstype()
 {
@@ -109,6 +115,23 @@ is_raw_dump_target()
 	[ -n "$(kdump_get_conf_val raw)" ]
 }
 
+is_virtiofs_dump_target()
+{
+	if [ -n "$(kdump_get_conf_val virtiofs)" ]; then
+		return 0
+	fi
+
+	if is_fs_type_virtiofs "$(get_dracut_args_fstype "$(kdump_get_conf_val dracut_args)")"; then
+		return 0
+	fi
+
+	if is_fs_type_virtiofs "$(get_fs_type_from_target "$(get_target_from_path "$(get_save_path)")")"; then
+		return 0
+	fi
+
+	return 1
+}
+
 is_nfs_dump_target()
 {
 	if [ -n "$(kdump_get_conf_val nfs)" ]; then
@@ -128,5 +151,28 @@ is_nfs_dump_target()
 
 is_fs_dump_target()
 {
-	[ -n "$(kdump_get_conf_val "ext[234]\|xfs\|btrfs\|minix")" ]
+	[ -n "$(kdump_get_conf_val "ext[234]\|xfs\|btrfs\|minix\|virtiofs")" ]
+}
+
+is_lvm2_thinp_device()
+{
+	_device_path=$1
+	_lvm2_thin_device=$(lvm lvs -S 'lv_layout=sparse && lv_layout=thin' \
+		--nosuffix --noheadings -o vg_name,lv_name "$_device_path" 2> /dev/null)
+
+	[ -n "$_lvm2_thin_device" ]
+}
+
+kdump_get_ip_route()
+{
+	if ! _route=$(/sbin/ip -o route get to "$1" 2>&1); then
+		derror "Bad kdump network destination: $1"
+		exit 1
+	fi
+	echo "$_route"
+}
+
+kdump_get_ip_route_field()
+{
+	echo "$1" | sed -n -e "s/^.*\<$2\>\s\+\(\S\+\).*$/\1/p"
 }
diff --git a/SOURCES/kdump-lib.sh b/SOURCES/kdump-lib.sh
index 2b58ddd..bc725c0 100755
--- a/SOURCES/kdump-lib.sh
+++ b/SOURCES/kdump-lib.sh
@@ -34,6 +34,12 @@ is_zstd_command_available()
 	[[ -x "$(command -v zstd)" ]]
 }
 
+dracut_have_option()
+{
+	local _option=$1
+	! dracut "$_option" 2>&1 | grep -q "unrecognized option"
+}
+
 perror_exit()
 {
 	derror "$@"
@@ -78,35 +84,31 @@ to_dev_name()
 
 is_user_configured_dump_target()
 {
-	[[ $(kdump_get_conf_val "ext[234]\|xfs\|btrfs\|minix\|raw\|nfs\|ssh") ]] || is_mount_in_dracut_args
-}
-
-get_user_configured_dump_disk()
-{
-	local _target
-
-	_target=$(kdump_get_conf_val "ext[234]\|xfs\|btrfs\|minix\|raw")
-	[[ -n $_target ]] && echo "$_target" && return
-
-	_target=$(get_dracut_args_target "$(kdump_get_conf_val "dracut_args")")
-	[[ -b $_target ]] && echo "$_target"
+	[[ $(kdump_get_conf_val "ext[234]\|xfs\|btrfs\|minix\|raw\|nfs\|ssh\|virtiofs") ]] || is_mount_in_dracut_args
 }
 
 get_block_dump_target()
 {
-	local _target _path
+	local _target _fstype
 
 	if is_ssh_dump_target || is_nfs_dump_target; then
 		return
 	fi
 
-	_target=$(get_user_configured_dump_disk)
+	_target=$(kdump_get_conf_val "ext[234]\|xfs\|btrfs\|minix\|raw\|virtiofs")
 	[[ -n $_target ]] && to_dev_name "$_target" && return
 
-	# Get block device name from local save path
-	_path=$(get_save_path)
-	_target=$(get_target_from_path "$_path")
-	[[ -b $_target ]] && to_dev_name "$_target"
+	_target=$(get_dracut_args_target "$(kdump_get_conf_val "dracut_args")")
+	[[ -b $_target ]] && to_dev_name "$_target" && return
+
+	_fstype=$(get_dracut_args_fstype "$(kdump_get_conf_val "dracut_args")")
+	is_fs_type_virtiofs "$_fstype" && echo "$_target" && return
+
+	_target=$(get_target_from_path "$(get_save_path)")
+	[[ -b $_target ]] && to_dev_name "$_target" && return
+
+	_fstype=$(get_fs_type_from_target "$_target")
+	is_fs_type_virtiofs "$_fstype" && echo "$_target" && return
 }
 
 is_dump_to_rootfs()
@@ -114,6 +116,12 @@ is_dump_to_rootfs()
 	[[ $(kdump_get_conf_val 'failure_action\|default') == dump_to_rootfs ]]
 }
 
+is_lvm2_thinp_dump_target()
+{
+	_target=$(get_block_dump_target)
+	[ -n "$_target" ] && is_lvm2_thinp_device "$_target"
+}
+
 get_failure_action_target()
 {
 	local _target
@@ -122,6 +130,7 @@ get_failure_action_target()
 		# Get rootfs device name
 		_target=$(get_root_fs_device)
 		[[ -b $_target ]] && to_dev_name "$_target" && return
+		is_fs_type_virtiofs "$(get_fs_type_from_target "$_target")" && echo "$_target" && return
 		# Then, must be nfs root
 		echo "nfs"
 	fi
@@ -245,9 +254,9 @@ kdump_get_persistent_dev()
 	echo $(get_persistent_dev "$dev")
 }
 
-is_atomic()
+is_ostree()
 {
-	grep -q "ostree" /proc/cmdline
+	test -f /run/ostree-booted
 }
 
 # get ip address or hostname from nfs/ssh config value
@@ -448,8 +457,7 @@ is_wdt_active()
 
 have_compression_in_dracut_args()
 {
-	[[ "$(kdump_get_conf_val dracut_args)" =~ \
-		(^|[[:space:]])--(gzip|bzip2|lzma|xz|lzo|lz4|zstd|no-compress|compress)([[:space:]]|$) ]]
+	[[ "$(kdump_get_conf_val dracut_args)" =~ (^|[[:space:]])--(gzip|bzip2|lzma|xz|lzo|lz4|zstd|no-compress|compress|squash-compressor)([[:space:]]|$) ]]
 }
 
 # If "dracut_args" contains "--mount" information, use it
@@ -641,8 +649,13 @@ prepare_kdump_kernel()
 	boot_dirlist=${KDUMP_BOOTDIR:-"/boot /boot/efi /efi /"}
 	boot_imglist="$KDUMP_IMG-$kdump_kernelver$KDUMP_IMG_EXT $machine_id/$kdump_kernelver/$KDUMP_IMG"
 
+	# The kernel of OSTree based systems is not in the standard locations.
+	if is_ostree; then
+		boot_dirlist="$(echo /boot/ostree/*) $boot_dirlist"
+	fi
+
 	# Use BOOT_IMAGE as reference if possible, strip the GRUB root device prefix in (hd0,gpt1) format
-	boot_img="$(sed "s/^BOOT_IMAGE=\((\S*)\)\?\(\S*\) .*/\2/" /proc/cmdline)"
+	boot_img="$(grep -P -o '^BOOT_IMAGE=(\S+)' /proc/cmdline | sed "s/^BOOT_IMAGE=\((\S*)\)\?\(\S*\)/\2/")"
 	if [[ "$boot_img" == *"$kdump_kernelver" ]]; then
 		boot_imglist="$boot_img $boot_imglist"
 	fi
@@ -672,7 +685,13 @@ prepare_kdump_bootinfo()
 
 	if [[ -z $KDUMP_KERNELVER ]]; then
 		KDUMP_KERNELVER=$(uname -r)
-		nondebug_kernelver=$(sed -n -e 's/\(.*\)+debug$/\1/p' <<< "$KDUMP_KERNELVER")
+
+		# Fadump uses the regular bootloader, unlike kdump. So, use the same version
+		# for default kernel and capture kernel unless specified explicitly with
+		# KDUMP_KERNELVER option.
+		if ! is_fadump_capable; then
+			nondebug_kernelver=$(sed -n -e 's/\(.*\)+debug$/\1/p' <<< "$KDUMP_KERNELVER")
+		fi
 	fi
 
 	# Use nondebug kernel if possible, because debug kernel will consume more memory and may oom.
diff --git a/SOURCES/kdump.conf b/SOURCES/kdump.conf
deleted file mode 100644
index d4fc78b..0000000
--- a/SOURCES/kdump.conf
+++ /dev/null
@@ -1,192 +0,0 @@
-# This file contains a series of commands to perform (in order) in the kdump
-# kernel after a kernel crash in the crash kernel(1st kernel) has happened.
-#
-# Directives in this file are only applicable to the kdump initramfs, and have
-# no effect once the root filesystem is mounted and the normal init scripts are
-# processed.
-#
-# Currently, only one dump target and path can be specified.  If the dumping to
-# the configured target fails, the failure action which can be configured via
-# the "failure_action" directive will be performed.
-#
-# Supported options:
-#
-# auto_reset_crashkernel <yes|no>
-#           - whether to reset kernel crashkernel to new default value
-#             or not when kexec-tools updates the default crashkernel value and
-#             existing kernels using the old default kernel crashkernel value.
-#             The default value is yes.
-#
-# raw <partition>
-#           - Will dd /proc/vmcore into <partition>.
-#             Use persistent device names for partition devices,
-#             such as /dev/vg/<devname>.
-#
-# nfs <nfs mount>
-#           - Will mount nfs to <mnt>, and copy /proc/vmcore to
-#             <mnt>/<path>/%HOST-%DATE/, supports DNS.
-#
-# ssh <user@server>
-#           - Will save /proc/vmcore to <user@server>:<path>/%HOST-%DATE/,
-#             supports DNS.
-#             NOTE: make sure the user has write permissions on the server.
-#
-# sshkey <path>
-#           - Will use the sshkey to do ssh dump.
-#             Specify the path of the ssh key to use when dumping
-#             via ssh. The default value is /root/.ssh/kdump_id_rsa.
-#
-# <fs type> <partition>
-#           - Will mount -t <fs type> <partition> <mnt>, and copy
-#             /proc/vmcore to <mnt>/<path>/%HOST_IP-%DATE/.
-#             NOTE: <partition> can be a device node, label or uuid.
-#             It's recommended to use persistent device names
-#             such as /dev/vg/<devname>.
-#             Otherwise it's suggested to use label or uuid.
-#
-# path <path>
-#           - "path" represents the file system path in which vmcore
-#             will be saved.  If a dump target is specified in
-#             kdump.conf, then "path" is relative to the specified
-#             dump target.
-#
-#             Interpretation of "path" changes a bit if the user didn't
-#             specify any dump target explicitly in kdump.conf.  In this
-#             case, "path" represents the absolute path from root. The
-#             dump target and adjusted path are arrived at automatically
-#             depending on what's mounted in the current system.
-#
-#             Ignored for raw device dumps.  If unset, will use the default
-#             "/var/crash".
-#
-# core_collector <command> <options>
-#           - This allows you to specify the command to copy
-#             the vmcore.  The default is makedumpfile, which on
-#             some architectures can drastically reduce vmcore size.
-#             See /sbin/makedumpfile --help for a list of options.
-#             Note that the -i and -g options are not needed here,
-#             as the initrd will automatically be populated with a
-#             config file appropriate for the running kernel.
-#             The default core_collector for raw/ssh dump is:
-#             "makedumpfile -F -l --message-level 7 -d 31".
-#             The default core_collector for other targets is:
-#             "makedumpfile -l --message-level 7 -d 31".
-#
-#             "makedumpfile -F" will create a flattened vmcore.
-#             You need to use "makedumpfile -R" to rearrange the dump data to
-#             a normal dumpfile readable with analysis tools.  For example:
-#             "makedumpfile -R vmcore < vmcore.flat".
-#
-#             For core_collector format details, you can refer to
-#             kexec-kdump-howto.txt or kdump.conf manpage.
-#
-# kdump_post <binary | script>
-#           - This directive allows you to run a executable binary
-#             or script after the vmcore dump process terminates.
-#             The exit status of the current dump process is fed to
-#             the executable binary or script as its first argument.
-#             All files under /etc/kdump/post.d are collectively sorted
-#             and executed in lexical order, before binary or script
-#             specified kdump_post parameter is executed.
-#
-# kdump_pre <binary | script>
-#           - Works like the "kdump_post" directive, but instead of running
-#             after the dump process, runs immediately before it.
-#             Exit status of this binary is interpreted as follows:
-#               0 - continue with dump process as usual
-#               non 0 - run the final action (reboot/poweroff/halt)
-#             All files under /etc/kdump/pre.d are collectively sorted and
-#             executed in lexical order, after binary or script specified
-#             kdump_pre parameter is executed.
-#             Even if the binary or script in /etc/kdump/pre.d directory
-#             returns non 0 exit status, the processing is continued.
-#
-# extra_bins <binaries | shell scripts>
-#           - This directive allows you to specify additional binaries or
-#             shell scripts to be included in the kdump initrd.
-#             Generally they are useful in conjunction with a kdump_post
-#             or kdump_pre binary or script which depends on these extra_bins.
-#
-# extra_modules <module(s)>
-#           - This directive allows you to specify extra kernel modules
-#             that you want to be loaded in the kdump initrd.
-#             Multiple modules can be listed, separated by spaces, and any
-#             dependent modules will automatically be included.
-#
-# failure_action <reboot | halt | poweroff | shell | dump_to_rootfs>
-#           - Action to perform in case dumping fails.
-#             reboot:   Reboot the system.
-#             halt:     Halt the system.
-#             poweroff: Power down the system.
-#             shell:    Drop to a bash shell.
-#                       Exiting the shell reboots the system by default,
-#                       or perform "final_action".
-#             dump_to_rootfs:  Dump vmcore to rootfs from initramfs context and
-#                       reboot by default or perform "final_action".
-#                       Useful when non-root dump target is specified.
-#             The default option is "reboot".
-#
-# default <reboot | halt | poweroff | shell | dump_to_rootfs>
-#           - Same as the "failure_action" directive above, but this directive
-#             is obsolete and will be removed in the future.
-#
-# final_action <reboot | halt | poweroff>
-#           - Action to perform in case dumping succeeds. Also performed
-#             when "shell" or "dump_to_rootfs" failure action finishes.
-#             Each action is same as the "failure_action" directive above.
-#             The default is "reboot".
-#
-# force_rebuild <0 | 1>
-#           - By default, kdump initrd will only be rebuilt when necessary.
-#             Specify 1 to force rebuilding kdump initrd every time when kdump
-#             service starts.
-#
-# force_no_rebuild <0 | 1>
-#           - By default, kdump initrd will be rebuilt when necessary.
-#             Specify 1 to bypass rebuilding of kdump initrd.
-#
-#             force_no_rebuild and force_rebuild options are mutually
-#             exclusive and they should not be set to 1 simultaneously.
-#
-# override_resettable <0 | 1>
-#           - Usually an unresettable block device can't be a dump target.
-#             Specifying 1 when you want to dump even though the block
-#             target is unresettable
-#             By default, it is 0, which will not try dumping destined to fail.
-#
-# dracut_args <arg(s)>
-#           - Pass extra dracut options when rebuilding kdump initrd.
-#
-# fence_kdump_args <arg(s)>
-#           - Command line arguments for fence_kdump_send (it can contain
-#             all valid arguments except hosts to send notification to).
-#
-# fence_kdump_nodes <node(s)>
-#           - List of cluster node(s) except localhost, separated by spaces,
-#             to send fence_kdump notifications to.
-#             (this option is mandatory to enable fence_kdump).
-#
-
-#raw /dev/vg/lv_kdump
-#ext4 /dev/vg/lv_kdump
-#ext4 LABEL=/boot
-#ext4 UUID=03138356-5e61-4ab3-b58e-27507ac41937
-#nfs my.server.com:/export/tmp
-#nfs [2001:db8::1:2:3:4]:/export/tmp
-#ssh user@my.server.com
-#ssh user@2001:db8::1:2:3:4
-#sshkey /root/.ssh/kdump_id_rsa
-auto_reset_crashkernel yes
-path /var/crash
-core_collector makedumpfile -l --message-level 7 -d 31
-#core_collector scp
-#kdump_post /var/crash/scripts/kdump-post.sh
-#kdump_pre /var/crash/scripts/kdump-pre.sh
-#extra_bins /usr/bin/lftp
-#extra_modules gfs2
-#failure_action shell
-#force_rebuild 1
-#force_no_rebuild 1
-#dracut_args --omit-drivers "cfg80211 snd" --add-drivers "ext2 ext3"
-#fence_kdump_args -p 7410 -f auto -c 0 -i 10
-#fence_kdump_nodes node1 node2
diff --git a/SOURCES/kdump.sysconfig.ppc64 b/SOURCES/kdump.sysconfig.ppc64
index 1b0cdc7..7d9df72 100644
--- a/SOURCES/kdump.sysconfig.ppc64
+++ b/SOURCES/kdump.sysconfig.ppc64
@@ -21,7 +21,7 @@ KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet log_buf_len swio
 
 # This variable lets us append arguments to the current kdump commandline
 # after processed by KDUMP_COMMANDLINE_REMOVE
-KDUMP_COMMANDLINE_APPEND="irqpoll maxcpus=1 noirqdistrib reset_devices cgroup_disable=memory numa=off udev.children-max=2 ehea.use_mcs=0 panic=10 kvm_cma_resv_ratio=0 transparent_hugepage=never novmcoredd hugetlb_cma=0"
+KDUMP_COMMANDLINE_APPEND="irqpoll maxcpus=1 noirqdistrib reset_devices cgroup_disable=memory numa=off udev.children-max=2 ehea.use_mcs=0 panic=10 kvm_cma_resv_ratio=0 transparent_hugepage=never novmcoredd hugetlb_cma=0 srcutree.big_cpu_lim=0"
 
 # Any additional kexec arguments required.  In most situations, this should
 # be left empty
diff --git a/SOURCES/kdump.sysconfig.ppc64le b/SOURCES/kdump.sysconfig.ppc64le
index d951def..789661f 100644
--- a/SOURCES/kdump.sysconfig.ppc64le
+++ b/SOURCES/kdump.sysconfig.ppc64le
@@ -21,7 +21,7 @@ KDUMP_COMMANDLINE_REMOVE="hugepages hugepagesz slub_debug quiet log_buf_len swio
 
 # This variable lets us append arguments to the current kdump commandline
 # after processed by KDUMP_COMMANDLINE_REMOVE
-KDUMP_COMMANDLINE_APPEND="irqpoll maxcpus=1 noirqdistrib reset_devices cgroup_disable=memory numa=off udev.children-max=2 ehea.use_mcs=0 panic=10 kvm_cma_resv_ratio=0 transparent_hugepage=never novmcoredd hugetlb_cma=0"
+KDUMP_COMMANDLINE_APPEND="irqpoll maxcpus=1 noirqdistrib reset_devices cgroup_disable=memory numa=off udev.children-max=2 ehea.use_mcs=0 panic=10 kvm_cma_resv_ratio=0 transparent_hugepage=never novmcoredd hugetlb_cma=0 srcutree.big_cpu_lim=0"
 
 # Any additional kexec arguments required.  In most situations, this should
 # be left empty
diff --git a/SOURCES/kdumpctl b/SOURCES/kdumpctl
index d169089..3eb2f73 100755
--- a/SOURCES/kdumpctl
+++ b/SOURCES/kdumpctl
@@ -11,10 +11,10 @@ MKFADUMPRD="/sbin/mkfadumprd"
 DRACUT_MODULES_FILE="/usr/lib/dracut/modules.txt"
 SAVE_PATH=/var/crash
 SSH_KEY_LOCATION="/root/.ssh/kdump_id_rsa"
-INITRD_CHECKSUM_LOCATION="/boot/.fadump_initrd_checksum"
 DUMP_TARGET=""
 DEFAULT_INITRD=""
 DEFAULT_INITRD_BAK=""
+INITRD_CHECKSUM_LOCATION=""
 KDUMP_INITRD=""
 TARGET_INITRD=""
 FADUMP_REGISTER_SYS_NODE="/sys/kernel/fadump_registered"
@@ -44,9 +44,16 @@ fi
 
 single_instance_lock()
 {
-	local rc timeout=5
+	local rc timeout=5 lockfile
 
-	if ! exec 9> /var/lock/kdump; then
+	if [[ -d /run/lock ]]; then
+		lockfile=/run/lock/kdump
+	else
+		# when updating package using virt-customize, /run/lock doesn't exist
+		lockfile=/tmp/kdump.lock
+	fi
+
+	if ! exec 9> $lockfile; then
 		derror "Create file lock failed"
 		exit 1
 	fi
@@ -181,7 +188,8 @@ backup_default_initrd()
 		sha1sum "$DEFAULT_INITRD" > "$INITRD_CHECKSUM_LOCATION"
 		if ! cp "$DEFAULT_INITRD" "$DEFAULT_INITRD_BAK"; then
 			dwarn "WARNING: failed to backup $DEFAULT_INITRD."
-			rm -f "$DEFAULT_INITRD_BAK"
+			rm -f -- "$INITRD_CHECKSUM_LOCATION"
+			rm -f -- "$DEFAULT_INITRD_BAK"
 		fi
 	fi
 }
@@ -232,7 +240,7 @@ check_config()
 			fi
 			config_opt=_target
 			;;
-		ext[234] | minix | btrfs | xfs | nfs | ssh)
+		ext[234] | minix | btrfs | xfs | nfs | ssh | virtiofs)
 			config_opt=_target
 			;;
 		sshkey | path | core_collector | kdump_post | kdump_pre | extra_bins | extra_modules | failure_action | default | final_action | force_rebuild | force_no_rebuild | fence_kdump_args | fence_kdump_nodes | auto_reset_crashkernel) ;;
@@ -307,6 +315,7 @@ setup_initrd()
 	fi
 
 	DEFAULT_INITRD_BAK="$KDUMP_BOOTDIR/.$(basename "$DEFAULT_INITRD").default"
+	INITRD_CHECKSUM_LOCATION="$DEFAULT_INITRD_BAK.checksum"
 	if [[ $DEFAULT_DUMP_MODE == "fadump" ]]; then
 		TARGET_INITRD="$DEFAULT_INITRD"
 
@@ -380,6 +389,7 @@ check_files_modified()
 
 	# HOOKS is mandatory and need to check the modification time
 	files="$files $HOOKS"
+	is_lvm2_thinp_dump_target && files="$files $LVM_CONF"
 	check_exist "$files" && check_executable "$EXTRA_BINS" || return 2
 
 	for file in $files; do
@@ -468,8 +478,9 @@ check_fs_modified()
 	fi
 
 	# No need to check in case of raw target.
-	# Currently we do not check also if ssh/nfs target is specified
-	if is_ssh_dump_target || is_nfs_dump_target || is_raw_dump_target; then
+	# Currently we do not check also if ssh/nfs/virtiofs/thinp target is specified
+	if is_ssh_dump_target || is_nfs_dump_target || is_raw_dump_target ||
+		is_virtiofs_dump_target || is_lvm2_thinp_dump_target; then
 		return 0
 	fi
 
@@ -666,6 +677,7 @@ load_kdump()
 	# and release it.
 	exec 12>&2
 	exec 2>> $KDUMP_LOG_PATH/kdump.log
+	chmod 600 $KDUMP_LOG_PATH/kdump.log
 	PS4='+ $(date "+%Y-%m-%d %H:%M:%S") ${BASH_SOURCE}@${LINENO}: '
 	set -x
 
@@ -1068,7 +1080,7 @@ start()
 		return 1
 	fi
 
-	if check_current_status; then
+	if [[ $DEFAULT_DUMP_MODE == "kdump" ]] && check_current_kdump_status; then
 		dwarn "Kdump already running: [WARNING]"
 		return 0
 	fi
@@ -1212,7 +1224,7 @@ do_estimate()
 	local kdump_mods
 	local -A large_mods
 	local baseline
-	local kernel_size mod_size initrd_size baseline_size runtime_size reserved_size estimated_size recommended_size
+	local kernel_size mod_size initrd_size baseline_size runtime_size reserved_size estimated_size recommended_size _cryptsetup_overhead
 	local size_mb=$((1024 * 1024))
 
 	setup_initrd
@@ -1261,12 +1273,22 @@ do_estimate()
 	for _dev in $(get_all_kdump_crypt_dev); do
 		_crypt_info=$(cryptsetup luksDump "/dev/block/$_dev")
 		[[ $(echo "$_crypt_info" | sed -n "s/^Version:\s*\(.*\)/\1/p") == "2" ]] || continue
-		for _mem in $(echo "$_crypt_info" | sed -n "s/\sMemory:\s*\(.*\)/\1/p" | sort -n); do
+		for _mem in $(echo "$_crypt_info" | sed -n "s/\sMemory:\s*\(.*\)/\1/p" | sort -n -r); do
 			crypt_size=$((crypt_size + _mem * 1024))
 			break
 		done
 	done
-	[[ $crypt_size -ne 0 ]] && echo -e "Encrypted kdump target requires extra memory, assuming using the keyslot with minimun memory requirement\n"
+
+	if [[ $crypt_size -ne 0 ]]; then
+		if [[ $(uname -m) == aarch64 ]]; then
+			_cryptsetup_overhead=50
+		else
+			_cryptsetup_overhead=20
+		fi
+
+		crypt_size=$((crypt_size + _cryptsetup_overhead * size_mb))
+		echo -e "Encrypted kdump target requires extra memory, assuming using the keyslot with maximum memory requirement\n"
+	fi
 
 	estimated_size=$((kernel_size + mod_size + initrd_size + runtime_size + crypt_size))
 	if [[ $baseline_size -gt $estimated_size ]]; then
@@ -1360,7 +1382,7 @@ _filter_grubby_kernel_str()
 _find_kernel_path_by_release()
 {
 	local _release="$1" _grubby_kernel_str _kernel_path
-	_grubby_kernel_str=$(grubby --info ALL | grep "^kernel=.*$_release")
+	_grubby_kernel_str=$(grubby --info ALL | grep "^kernel=.*$_release\"$")
 	_kernel_path=$(_filter_grubby_kernel_str "$_grubby_kernel_str")
 	if [[ -z $_kernel_path ]]; then
 		derror "kernel $_release doesn't exist"
@@ -1381,26 +1403,25 @@ _get_current_running_kernel_path()
 	fi
 }
 
-_update_grub()
+_update_kernel_cmdline()
 {
 	local _kernel_path=$1 _crashkernel=$2 _dump_mode=$3 _fadump_val=$4
 
-	if is_atomic; then
+	if is_ostree; then
 		if rpm-ostree kargs | grep -q "crashkernel="; then
 			rpm-ostree kargs --replace="crashkernel=$_crashkernel"
 		else
 			rpm-ostree kargs --append="crashkernel=$_crashkernel"
 		fi
 	else
-		[[ -f /etc/zipl.conf ]] && zipl_arg="--zipl"
-		grubby --args "crashkernel=$_crashkernel" --update-kernel "$_kernel_path" $zipl_arg
+		grubby --args "crashkernel=$_crashkernel" --update-kernel "$_kernel_path"
 		if [[ $_dump_mode == kdump ]]; then
 			grubby --remove-args="fadump" --update-kernel "$_kernel_path"
 		else
 			grubby --args="fadump=$_fadump_val" --update-kernel "$_kernel_path"
 		fi
 	fi
-	[[ $zipl_arg ]] && zipl > /dev/null
+	[[ -f /etc/zipl.conf ]] && zipl > /dev/null
 }
 
 _valid_grubby_kernel_path()
@@ -1448,6 +1469,10 @@ _update_kernel_arg_in_grub_etc_default()
 {
 	local _para=$1 _val=$2 _para_val
 
+	if [[ $(uname -m) == s390x ]]; then
+		return
+	fi
+
 	if [[ -n $_val ]]; then
 		_para_val="$_para=$_val"
 	fi
@@ -1515,18 +1540,18 @@ reset_crashkernel()
 		esac
 	done
 
-	# 1. CoreOS uses "rpm-ostree kargs" instead of grubby to manage kernel command
-	#    line. --kernel=ALL doesn't make sense for CoreOS.
-	# 2. CoreOS doesn't support POWER so the dump mode is always kdump.
+	# 1. OSTree systems use "rpm-ostree kargs" instead of grubby to manage kernel command
+	#    line. --kernel=ALL doesn't make sense for OStree.
+	# 2. We don't have any OSTree POWER systems so the dump mode is always kdump.
 	# 3. "rpm-ostree kargs" would prompt the user to reboot the system after
 	#    modifying the kernel command line so there is no need for kexec-tools
 	#    to repeat it.
-	if is_atomic; then
+	if is_ostree; then
 		_old_crashkernel=$(rpm-ostree kargs | sed -n -E 's/.*(^|\s)crashkernel=(\S*).*/\2/p')
 		_new_dump_mode=kdump
 		_new_crashkernel=$(kdump_get_arch_recommend_crashkernel "$_new_dump_mode")
 		if [[ $_old_crashkernel != "$_new_crashkernel" ]]; then
-			_update_grub "" "$_new_crashkernel" "$_new_dump_mode" ""
+			_update_kernel_cmdline "" "$_new_crashkernel" "$_new_dump_mode" ""
 			if [[ $_reboot == yes ]]; then
 				systemctl reboot
 			fi
@@ -1594,7 +1619,7 @@ reset_crashkernel()
 		_old_crashkernel=$(get_grub_kernel_boot_parameter "$_kernel" crashkernel)
 		_old_fadump_val=$(get_grub_kernel_boot_parameter "$_kernel" fadump)
 		if [[ $_old_crashkernel != "$_new_crashkernel" || $_old_fadump_val != "$_new_fadump_val" ]]; then
-			_update_grub "$_kernel" "$_new_crashkernel" "$_new_dump_mode" "$_new_fadump_val"
+			_update_kernel_cmdline "$_kernel" "$_new_crashkernel" "$_new_dump_mode" "$_new_fadump_val"
 			if [[ $_reboot != yes ]]; then
 				if [[ $_old_crashkernel != "$_new_crashkernel" ]]; then
 					_what_is_updated="Updated crashkernel=$_new_crashkernel"
@@ -1613,6 +1638,15 @@ reset_crashkernel()
 	fi
 }
 
+_is_bootloader_installed()
+{
+	if [[ $(uname -m) == s390x ]]; then
+		test -f /etc/zipl.conf
+	else
+		test -f /boot/grub2/grub.cfg
+	fi
+}
+
 # update the crashkernel value in GRUB_ETC_DEFAULT if necessary
 #
 # called by reset_crashkernel_after_update and inherit its array variable
@@ -1622,6 +1656,10 @@ update_crashkernel_in_grub_etc_default_after_update()
 	local _crashkernel _fadump_val
 	local _dump_mode _old_default_crashkernel _new_default_crashkernel
 
+	if [[ $(uname -m) == s390x ]]; then
+		return
+	fi
+
 	_crashkernel=$(_read_kernel_arg_in_grub_etc_default crashkernel)
 
 	if [[ -z $_crashkernel ]]; then
@@ -1647,6 +1685,10 @@ reset_crashkernel_after_update()
 	local _kernel _crashkernel _dump_mode _fadump_val _old_default_crashkernel _new_default_crashkernel
 	declare -A _crashkernel_vals
 
+	if ! _is_bootloader_installed; then
+		return
+	fi
+
 	_crashkernel_vals[old_kdump]=$(cat /tmp/old_default_crashkernel 2> /dev/null)
 	_crashkernel_vals[old_fadump]=$(cat /tmp/old_default_crashkernel_fadump 2> /dev/null)
 	_crashkernel_vals[new_kdump]=$(get_default_crashkernel kdump)
@@ -1663,7 +1705,7 @@ reset_crashkernel_after_update()
 			if [[ $_crashkernel == "$_old_default_crashkernel" ]] &&
 				[[ $_new_default_crashkernel != "$_old_default_crashkernel" ]]; then
 				_fadump_val=$(get_grub_kernel_boot_parameter "$_kernel" fadump)
-				if _update_grub "$_kernel" "$_new_default_crashkernel" "$_dump_mode" "$_fadump_val"; then
+				if _update_kernel_cmdline "$_kernel" "$_new_default_crashkernel" "$_dump_mode" "$_fadump_val"; then
 					echo "For kernel=$_kernel, crashkernel=$_new_default_crashkernel now."
 				fi
 			fi
@@ -1697,6 +1739,12 @@ reset_crashkernel_for_installed_kernel()
 	local _installed_kernel _running_kernel _crashkernel _crashkernel_running
 	local _dump_mode_running _fadump_val_running
 
+	# During package install, only try to reset crashkernel for osbuild
+	# thus to avoid calling grubby when installing os via anaconda
+	if ! _is_bootloader_installed && ! _is_osbuild; then
+		return
+	fi
+
 	if ! _installed_kernel=$(_find_kernel_path_by_release "$1"); then
 		exit 1
 	fi
@@ -1719,9 +1767,11 @@ reset_crashkernel_for_installed_kernel()
 	_fadump_val_running=$(get_grub_kernel_boot_parameter "$_kernel" fadump)
 
 	if [[ $_crashkernel != "$_crashkernel_running" ]]; then
-		if _update_grub "$_installed_kernel" "$_crashkernel_running" "$_dump_mode_running" "$_fadump_val_running"; then
+		if _update_kernel_cmdline "$_installed_kernel" "$_crashkernel_running" "$_dump_mode_running" "$_fadump_val_running"; then
 			echo "kexec-tools has reset $_installed_kernel to use the new default crashkernel value $_crashkernel_running"
 		fi
+	elif [[ $_crashkernel == auto ]]; then
+		reset_crashkernel "--kernel=$_installed_kernel"
 	fi
 }
 
@@ -1790,12 +1840,12 @@ main()
 		shift
 		reset_crashkernel "$@"
 		;;
-	reset-crashkernel-after-update)
+	_reset-crashkernel-after-update)
 		if [[ $(kdump_get_conf_val auto_reset_crashkernel) != no ]]; then
 			reset_crashkernel_after_update
 		fi
 		;;
-	reset-crashkernel-for-installed_kernel)
+	_reset-crashkernel-for-installed_kernel)
 		if [[ $(kdump_get_conf_val auto_reset_crashkernel) != no ]]; then
 			reset_crashkernel_for_installed_kernel "$2"
 		fi
diff --git a/SOURCES/kexec-tools-2.0.23-makedumpfile-Avoid_false_positive_mem_section_validation_with_vmlinux.patch b/SOURCES/kexec-tools-2.0.23-makedumpfile-Avoid_false_positive_mem_section_validation_with_vmlinux.patch
deleted file mode 100644
index 8a7dd8a..0000000
--- a/SOURCES/kexec-tools-2.0.23-makedumpfile-Avoid_false_positive_mem_section_validation_with_vmlinux.patch
+++ /dev/null
@@ -1,76 +0,0 @@
- commit 6d0d95ecc04a70f8448d562ff0fbbae237f5c929
- Author: Kazuhito Hagio <k-hagio-ab@nec.com>
- Date:   Thu Apr 21 08:58:29 2022 +0900
- 
-     [PATCH] Avoid false-positive mem_section validation with vmlinux
-     
-     Currently get_mem_section() validates if SYMBOL(mem_section) is the address
-     of the mem_section array first.  But there was a report that the first
-     validation wrongly returned TRUE with -x vmlinux and SPARSEMEM_EXTREME
-     (4.15+) on s390x.  This leads to crash failing statup with the following
-     seek error:
-     
-       crash: seek error: kernel virtual address: 67fffc2800  type: "memory section root table"
-     
-     Skip the first validation when satisfying the conditions.
-     
-     Reported-by: Dave Wysochanski <dwysocha@redhat.com>
-     Signed-off-by: Kazuhito Hagio <k-hagio-ab@nec.com>
-     Reviewed-and-Tested-by: Philipp Rudo <prudo@redhat.com>
-     Reviewed-by: Pingfan Liu <piliu@redhat.com>
- 
- diff --git a/makedumpfile-1.7.1/makedumpfile.c b/makedumpfile-1.7.1/makedumpfile.c
- index a2f45c84cee3ba57ce3d3cf3f1905e6a03f4fd09..65d1c7c2f02c9ae8ead9de0f0217235fe72b3ca7 100644
- --- a/makedumpfile-1.7.1/makedumpfile.c
- +++ b/makedumpfile-1.7.1/makedumpfile.c
- @@ -3698,6 +3698,22 @@ validate_mem_section(unsigned long *mem_sec,
-  	return ret;
-  }
-  
- +/*
- + * SYMBOL(mem_section) varies with the combination of memory model and
- + * its source:
- + *
- + * SPARSEMEM
- + *   vmcoreinfo: address of mem_section root array
- + *   -x vmlinux: address of mem_section root array
- + *
- + * SPARSEMEM_EXTREME v1
- + *   vmcoreinfo: address of mem_section root array
- + *   -x vmlinux: address of mem_section root array
- + *
- + * SPARSEMEM_EXTREME v2 (with 83e3c48729d9 and a0b1280368d1) 4.15+
- + *   vmcoreinfo: address of mem_section root array
- + *   -x vmlinux: address of pointer to mem_section root array
- + */
-  static int
-  get_mem_section(unsigned int mem_section_size, unsigned long *mem_maps,
-  		unsigned int num_section)
- @@ -3710,12 +3726,27 @@ get_mem_section(unsigned int mem_section_size, unsigned long *mem_maps,
-  		    strerror(errno));
-  		return FALSE;
-  	}
- +
- +	/*
- +	 * There was a report that the first validation wrongly returned TRUE
- +	 * with -x vmlinux and SPARSEMEM_EXTREME v2 on s390x, so skip it.
- +	 * Howerver, leave the fallback validation as it is for the -i option.
- +	 */
- +	if (is_sparsemem_extreme() && info->name_vmlinux) {
- +		unsigned long flag = 0;
- +		if (get_symbol_type_name("mem_section", DWARF_INFO_GET_SYMBOL_TYPE,
- +					NULL, &flag)
- +		    && !(flag & TYPE_ARRAY))
- +			goto skip_1st_validation;
- +	}
- +
-  	ret = validate_mem_section(mem_sec, SYMBOL(mem_section),
-  				   mem_section_size, mem_maps, num_section);
-  
-  	if (!ret && is_sparsemem_extreme()) {
-  		unsigned long mem_section_ptr;
-  
- +skip_1st_validation:
-  		if (!readmem(VADDR, SYMBOL(mem_section), &mem_section_ptr,
-  			     sizeof(mem_section_ptr)))
-  			goto out;
diff --git a/SOURCES/kexec-tools-2.0.25-ppc64-ppc64-remove-rma_top-limit.patch b/SOURCES/kexec-tools-2.0.25-ppc64-ppc64-remove-rma_top-limit.patch
new file mode 100644
index 0000000..683447d
--- /dev/null
+++ b/SOURCES/kexec-tools-2.0.25-ppc64-ppc64-remove-rma_top-limit.patch
@@ -0,0 +1,37 @@
+From 6b6187f546f0ddad8ea84d22c3f7ad72133dcfe3 Mon Sep 17 00:00:00 2001
+From: Sourabh Jain <sourabhjain@linux.ibm.com>
+Date: Thu, 15 Sep 2022 14:12:40 +0530
+Subject: [PATCH] ppc64: remove rma_top limit
+
+Restricting kexec tool to allocate hole for kexec segments below 768MB
+may not be relavent now since first memory block size can be 1024MB and
+more.
+
+Removing rma_top restriction will give more space to find holes for
+kexec segments and existing in-place checks make sure that kexec segment
+allocation doesn't cross the first memory block because every kexec segment
+has to be within first memory block for kdump kernel to boot properly.
+
+Signed-off-by: Sourabh Jain <sourabhjain@linux.ibm.com>
+Acked-by: Hari Bathini <hbathini@linux.ibm.com>
+Signed-off-by: Simon Horman <horms@kernel.org>
+---
+ kexec/arch/ppc64/kexec-ppc64.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+diff --git a/kexec/arch/ppc64/kexec-ppc64.c b/kexec/arch/ppc64/kexec-ppc64.c
+index 5b17740..611809f 100644
+--- a/kexec/arch/ppc64/kexec-ppc64.c
++++ b/kexec/arch/ppc64/kexec-ppc64.c
+@@ -717,8 +717,6 @@ static int get_devtree_details(unsigned long kexec_flags)
+ 			if (base < rma_base) {
+ 				rma_base = base;
+ 				rma_top = base + be64_to_cpu(((uint64_t *)buf)[1]);
+-				if (rma_top > 0x30000000UL)
+-					rma_top = 0x30000000UL;
+ 			}
+ 
+ 			fclose(file);
+-- 
+2.38.1
+
diff --git a/SOURCES/mkdumprd b/SOURCES/mkdumprd
index 500146b..bc80667 100644
--- a/SOURCES/mkdumprd
+++ b/SOURCES/mkdumprd
@@ -27,7 +27,7 @@ SAVE_PATH=$(get_save_path)
 OVERRIDE_RESETTABLE=0
 
 extra_modules=""
-dracut_args=(--add kdumpbase --quiet --hostonly --hostonly-cmdline --hostonly-i18n --hostonly-mode strict -o "plymouth resume ifcfg earlykdump")
+dracut_args=(--add kdumpbase --quiet --hostonly --hostonly-cmdline --hostonly-i18n --hostonly-mode strict --hostonly-nics '' -o "plymouth resume ifcfg earlykdump")
 
 MKDUMPRD_TMPDIR="$(mktemp -d -t mkdumprd.XXXXXX)"
 [ -d "$MKDUMPRD_TMPDIR" ] || perror_exit "dracut: mktemp -p -d -t dracut.XXXXXX failed."
@@ -242,7 +242,7 @@ check_user_configured_target()
 
 	# For user configured target, use $SAVE_PATH as the dump path within the target
 	if [[ ! -d "$_mnt/$SAVE_PATH" ]]; then
-		perror_exit "Dump path \"$_mnt/$SAVE_PATH\" does not exist in dump target \"$_target\""
+		perror_exit "Dump path \"$SAVE_PATH\" does not exist in dump target \"$_target\""
 	fi
 
 	check_size fs "$_target"
@@ -391,7 +391,7 @@ while read -r config_opt config_val; do
 	extra_modules)
 		extra_modules="$extra_modules $config_val"
 		;;
-	ext[234] | xfs | btrfs | minix | nfs)
+	ext[234] | xfs | btrfs | minix | nfs | virtiofs)
 		check_user_configured_target "$config_val" "$config_opt"
 		add_mount "$config_val" "$config_opt"
 		;;
@@ -432,10 +432,9 @@ done <<< "$(kdump_read_conf)"
 handle_default_dump_target
 
 if ! have_compression_in_dracut_args; then
-	# Here zstd is set as the default compression method. If squash module
-	# is available for dracut, libzstd will be used by mksquashfs. If
-	# squash module is unavailable, command zstd will be used instead.
-	if is_squash_available || is_zstd_command_available; then
+	if is_squash_available && dracut_have_option "--squash-compressor"; then
+		add_dracut_arg "--squash-compressor" "zstd"
+	elif is_zstd_command_available; then
 		add_dracut_arg "--compress" "zstd"
 	fi
 fi
diff --git a/SOURCES/mkfadumprd b/SOURCES/mkfadumprd
index 86dfcee..2fc396c 100644
--- a/SOURCES/mkfadumprd
+++ b/SOURCES/mkfadumprd
@@ -38,14 +38,18 @@ FADUMP_INITRD="$MKFADUMPRD_TMPDIR/fadump.img"
 # this file tells the initrd is fadump enabled
 touch "$MKFADUMPRD_TMPDIR/fadump.initramfs"
 ddebug "rebuild fadump initrd: $FADUMP_INITRD $DEFAULT_INITRD $KDUMP_KERNELVER"
-if ! $MKDUMPRD "$FADUMP_INITRD" -i "$MKFADUMPRD_TMPDIR/fadump.initramfs" /etc/fadump.initramfs; then
+# Don't use squash for capture image or default image as it negatively impacts
+# compression ratio and increases the size of the initramfs image.
+# Don't compress the capture image as uncompressed image is needed immediately.
+# Also, early microcode would not be needed here.
+if ! $MKDUMPRD "$FADUMP_INITRD" -i "$MKFADUMPRD_TMPDIR/fadump.initramfs" /etc/fadump.initramfs --omit squash --no-compress --no-early-microcode; then
 	perror_exit "mkfadumprd: failed to build image with dump capture support"
 fi
 
-### Unpack the initramfs having dump capture capability
+### Unpack the initramfs having dump capture capability retaining previous file modification time.
+# This helps in saving space by hardlinking identical files.
 mkdir -p "$MKFADUMPRD_TMPDIR/fadumproot"
-if ! (pushd "$MKFADUMPRD_TMPDIR/fadumproot" > /dev/null && lsinitrd --unpack "$FADUMP_INITRD" &&
-	popd > /dev/null); then
+if ! cpio -id --preserve-modification-time --quiet -D "$MKFADUMPRD_TMPDIR/fadumproot" < "$FADUMP_INITRD"; then
 	derror "mkfadumprd: failed to unpack '$MKFADUMPRD_TMPDIR'"
 	exit 1
 fi
@@ -58,13 +62,9 @@ _dracut_isolate_args=(
 	/usr/lib/dracut/fadump-kernel-modules.txt
 )
 
-if is_squash_available; then
-	_dracut_isolate_args+=(--add squash)
-fi
-
-# Same as setting zstd in mkdumprd
+# Use zstd compression method, if available
 if ! have_compression_in_dracut_args; then
-	if is_squash_available || is_zstd_command_available; then
+	if is_zstd_command_available; then
 		_dracut_isolate_args+=(--compress zstd)
 	fi
 fi
diff --git a/SOURCES/supported-kdump-targets.txt b/SOURCES/supported-kdump-targets.txt
index 640fabc..6c1a09e 100644
--- a/SOURCES/supported-kdump-targets.txt
+++ b/SOURCES/supported-kdump-targets.txt
@@ -45,6 +45,7 @@ storage:
         hardware FCoE (qla2xxx, lpfc)
         software FCoE (bnx2fc) (Extra configuration required,
             please read "Note on FCoE" section below)
+        NVMe-FC (qla2xxx, lpfc)
 
 network:
         Hardware using kernel modules: (igb, ixgbe, ice, i40e, e1000e, igc,
@@ -65,6 +66,7 @@ filesystem:
         ext[234]
         xfs
         nfs
+        virtiofs
 
 firmware:
         BIOS
diff --git a/SPECS/kexec-tools.spec b/SPECS/kexec-tools.spec
index b10c836..8c20448 100644
--- a/SPECS/kexec-tools.spec
+++ b/SPECS/kexec-tools.spec
@@ -1,11 +1,11 @@
 %global eppic_ver e8844d3793471163ae4a56d8f95897be9e5bd554
 %global eppic_shortver %(c=%{eppic_ver}; echo ${c:0:7})
-%global mkdf_ver 1.7.1
+%global mkdf_ver 1.7.2
 %global mkdf_shortver %(c=%{mkdf_ver}; echo ${c:0:7})
 
 Name: kexec-tools
-Version: 2.0.24
-Release: 5%{?dist}
+Version: 2.0.25
+Release: 13%{?dist}
 License: GPLv2
 Summary: The kexec/kdump userspace component
 
@@ -16,7 +16,7 @@ Source3: kdump.sysconfig.x86_64
 Source4: kdump.sysconfig.i386
 Source5: kdump.sysconfig.ppc64
 Source7: mkdumprd
-Source8: kdump.conf
+Source8: gen-kdump-conf.sh
 Source9: https://github.com/makedumpfile/makedumpfile/archive/%{mkdf_ver}/makedumpfile-%{mkdf_shortver}.tar.gz
 Source10: kexec-kdump-howto.txt
 Source11: fadump-howto.txt
@@ -44,7 +44,8 @@ Source33: 92-crashkernel.install
 Source34: crashkernel-howto.txt
 Source35: kdump-migrate-action.sh
 Source36: kdump-restart.sh
-Source37: supported-kdump-targets.txt
+Source37: 60-fadump.install
+Source38: supported-kdump-targets.txt
 
 #######################################
 # These are sources for mkdumpramfs
@@ -71,7 +72,6 @@ Requires: dracut >= 050
 Requires: dracut-network >= 050
 Requires: dracut-squash >= 050
 Requires: ethtool
-Recommends: zstd
 Recommends: grubby
 Recommends: hostname
 BuildRequires: make
@@ -100,6 +100,7 @@ Requires:       systemd-udev%{?_isa}
 #
 # Patches 301 through 400 are meant for ppc64 kexec-tools enablement
 #
+Patch301: kexec-tools-2.0.25-ppc64-ppc64-remove-rma_top-limit.patch
 
 #
 # Patches 401 through 500 are meant for s390 kexec-tools enablement
@@ -112,7 +113,6 @@ Requires:       systemd-udev%{?_isa}
 #
 # Patches 601 onward are generic patches
 #
-Patch601: ./kexec-tools-2.0.23-makedumpfile-Avoid_false_positive_mem_section_validation_with_vmlinux.patch
 
 %description
 kexec-tools provides /sbin/kexec binary that facilitates a new
@@ -128,7 +128,7 @@ mkdir -p -m755 kcp
 tar -z -x -v -f %{SOURCE9}
 tar -z -x -v -f %{SOURCE19}
 
-%patch601 -p1
+%patch301 -p1
 
 %ifarch ppc
 %define archdef ARCH=ppc
@@ -154,7 +154,10 @@ cp %{SOURCE21} .
 cp %{SOURCE26} .
 cp %{SOURCE27} .
 cp %{SOURCE34} .
-cp %{SOURCE37} .
+cp %{SOURCE38} .
+
+# Generate kdump.conf file
+%{SOURCE8} %{_target_cpu} > kdump.conf
 
 make
 %ifarch %{ix86} x86_64 ppc64 s390x ppc64le aarch64
@@ -193,8 +196,7 @@ SYSCONFIG=$RPM_SOURCE_DIR/kdump.sysconfig.%{_target_cpu}
 install -m 644 $SYSCONFIG $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/kdump
 
 install -m 755 %{SOURCE7} $RPM_BUILD_ROOT/usr/sbin/mkdumprd
-install -m 755 %{SOURCE32} $RPM_BUILD_ROOT/usr/sbin/mkfadumprd
-install -m 644 %{SOURCE8} $RPM_BUILD_ROOT%{_sysconfdir}/kdump.conf
+install -m 644 kdump.conf $RPM_BUILD_ROOT%{_sysconfdir}/kdump.conf
 install -m 644 kexec/kexec.8 $RPM_BUILD_ROOT%{_mandir}/man8/kexec.8
 install -m 644 %{SOURCE12} $RPM_BUILD_ROOT%{_mandir}/man8/mkdumprd.8
 install -m 644 %{SOURCE25} $RPM_BUILD_ROOT%{_mandir}/man8/kdumpctl.8
@@ -202,6 +204,7 @@ install -m 755 %{SOURCE20} $RPM_BUILD_ROOT%{_prefix}/lib/kdump/kdump-lib.sh
 install -m 755 %{SOURCE23} $RPM_BUILD_ROOT%{_prefix}/lib/kdump/kdump-lib-initramfs.sh
 install -m 755 %{SOURCE31} $RPM_BUILD_ROOT%{_prefix}/lib/kdump/kdump-logger.sh
 %ifarch ppc64 ppc64le
+install -m 755 %{SOURCE32} $RPM_BUILD_ROOT/usr/sbin/mkfadumprd
 install -m 755 %{SOURCE35} $RPM_BUILD_ROOT%{_prefix}/lib/kdump/kdump-migrate-action.sh
 install -m 755 %{SOURCE36} $RPM_BUILD_ROOT%{_prefix}/lib/kdump/kdump-restart.sh
 %endif
@@ -215,6 +218,7 @@ install -m 644 %{SOURCE13} $RPM_BUILD_ROOT%{_udevrulesdir}/98-kexec.rules
 %endif
 %ifarch ppc64 ppc64le
 install -m 644 %{SOURCE14} $RPM_BUILD_ROOT%{_udevrulesdir}/98-kexec.rules
+install -m 755 -D %{SOURCE37} $RPM_BUILD_ROOT%{_prefix}/lib/kernel/install.d/60-fadump.install
 %endif
 install -m 644 %{SOURCE15} $RPM_BUILD_ROOT%{_mandir}/man5/kdump.conf.5
 install -m 644 %{SOURCE16} $RPM_BUILD_ROOT%{_unitdir}/kdump.service
@@ -268,13 +272,19 @@ mkdir -p $RPM_BUILD_ROOT/%{dracutlibdir}/modules.d/
 mv $RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/* $RPM_BUILD_ROOT/%{dracutlibdir}/modules.d/
 
 %pre
-# save the old default crashkernel values to /tmp/ when upgrading the package
-if ! grep -qs "ostree" /proc/cmdline && [ $1 == 2 ] && grep -q get-default-crashkernel /usr/bin/kdumpctl; then
+# Save the old default crashkernel values to /tmp/ when upgrading the package
+# so kdumpctl later can tell if it should update the kernel crashkernel
+# parameter in the posttrans scriptlet.  Note this feauture of auto-updating
+# the kernel crashkernel parameter currently doesn't support ostree, so skip it
+# for ostree.
+if [ ! -f /run/ostree-booted ] && [ $1 == 2 ] && grep -q get-default-crashkernel /usr/bin/kdumpctl; then
   kdumpctl get-default-crashkernel kdump > /tmp/old_default_crashkernel 2>/dev/null
 %ifarch ppc64 ppc64le
   kdumpctl get-default-crashkernel fadump > /tmp/old_default_crashkernel_fadump 2>/dev/null
 %endif
 fi
+# don't block package update
+:
 
 %post
 # Initial installation
@@ -342,10 +352,15 @@ do
 done
 
 %posttrans
-# try to reset kernel crashkernel value to new default value when upgrading
-# the package
-if ! grep -qs "ostree" /proc/cmdline && [ $1 == 1 ]; then
-  kdumpctl reset-crashkernel-after-update
+# Try to reset kernel crashkernel value to new default value based on the old
+# default value or set up crasherkernel value for osbuild
+#
+# Note
+#  1. Skip ostree systems as they are not supported.
+#  2. "[ $1 == 1 ]" in posttrans scriptlet means both install and upgrade. The
+#     former case is used to set up crashkernel for osbuild
+if [ ! -f /run/ostree-booted ] && [ $1 == 1 ]; then
+  kdumpctl _reset-crashkernel-after-update
   rm /tmp/old_default_crashkernel 2>/dev/null
 %ifarch ppc64 ppc64le
   rm /tmp/old_default_crashkernel_fadump 2>/dev/null
@@ -361,8 +376,11 @@ fi
 %ifarch %{ix86} x86_64 ppc64 s390x ppc64le aarch64
 /usr/sbin/makedumpfile
 %endif
-/usr/sbin/mkdumprd
+%ifarch ppc64 ppc64le
 /usr/sbin/mkfadumprd
+%{_prefix}/lib/kernel/install.d/60-fadump.install
+%endif
+/usr/sbin/mkdumprd
 /usr/sbin/vmcore-dmesg
 %{_bindir}/*
 %{_datadir}/kdump
@@ -410,18 +428,101 @@ fi
 %endif
 
 %changelog
+* Fri Mar 10 2023 Tao Liu <ltao@redhat.com> - 2.0.25-13
+- kdump-lib: Add the CoreOS kernel dir to the boot_dirlist
+- kdump-lib: attempt to fix BOOT_IMAGE detection
+- kdump-lib: change how ostree based systems are detected
+- kdump-lib: clear up references to Atomic/CoreOS
+
+* Fri Feb 24 2023 Tao Liu <ltao@redhat.com> - 2.0.25-12
+- Reset crashkernel to default value if newly installed kernel has crashkernel=auto
+- Use the correct command to get architecture
+
+* Wed Jan 11 2023 Pingfan Liu <piliu@redhat.com> - 2.0.25-11
+- ppc64: tackle SRCU hang issue
+
+* Tue Dec 27 2022 Pingfan Liu <piliu@redhat.com> - 2.0.25-10
+- Update supported-kdump-targets.txt
+- dracut-module-setup.sh: skip installing driver for the loopback interface
+- Don't try to update crashkernel when bootloader is not installed
+- dracut-module-setup.sh: also install the driver of physical NIC for Hyper-V VM with accelerated networking
+- fadump: use 'zstd' as the default compression method
+- fadump: fix default initrd backup and restore logic
+- fadump: add a kernel install hook to clean up fadump initramfs
+- fadump: avoid status check while starting in fadump mode
+- spec: only install mkfadumprd for ppc
+- fadump: preserve file modification time to help with hardlinking
+- fadump: do not use squash to reduce image size
+
+* Mon Dec 19 2022 Tao Liu <ltao@redhat.com> - 2.0.25-9
+- Add virtiofs to kdump supported-kdump-targets.txt
+- dracut-module-setup.sh: stop overwriting dracut's trap handler
+
+* Wed Dec 7 2022 Tao Liu <ltao@redhat.com> - 2.0.25-8
+- kexec-tools: ppc64: remove rma_top limit
+- kdumpctl: Optimize _find_kernel_path_by_release regex string
+- kdump.conf: use a simple generator script to maintain
+
+* Fri Nov 25 2022 Tao Liu <ltao@redhat.com> - 2.0.25-7
+- Don't run kdump_check_setup_iscsi in a subshell in order to collect needed network interfaces
+
+* Thu Nov 24 2022 Tao Liu <ltao@redhat.com> - 2.0.25-6
+- Simplify setup_znet by copying connection profile to initrd
+- Wait for the network to be truly ready before dumping vmcore
+- Address the cases where a NIC has a different name in kdump kernel
+- Reduce kdump memory consumption by only installing needed NIC drivers
+- Reduce kdump memory consumption by not letting NetworkManager manage unneeded network interfaces
+- Set up kdump network by directly copying NM connection profile to initrd
+- Stop dracut 35network-manager from running nm-initrd-generator
+- Apply the timeout configuration of nm-initrd-generator
+- Determine whether IPv4 or IPv6 is needed
+- Add functions to copy NetworkManage connection profiles to the initramfs
+- Fix error for vlan over team network interface
+
+* Fri Nov 11 2022 Tao Liu <ltao@redhat.com> - 2.0.25-5
+- Don't check fs modified when dump target is lvm2 thinp
+- Add dependency of dracut lvmthinpool-monitor module
+- lvm.conf should be check modified if lvm2 thinp enabled
+- Add lvm2 thin provision dump target checker
+- Fix the sync issue for dump_fs
+
+* Tue Nov 1 2022 Tao Liu <ltao@redhat.com> - 2.0.25-4
+- Rebase makedumpfile to 1.7.2
+- Include the memory overhead cost of cryptsetup when estimating the memory requirement for LUKS-encrypted target
+- Choosing the most memory-consuming key slot when estimating the memory requirement for LUKS-encrypted target
+- Skip reading /etc/defaut/grub for s390x
+- Only try to reset crashkernel for osbuild during package install
+- Prefix reset-crashkernel-{for-installed_kernel,after-update} with underscore
+- use /run/ostree-booted to tell if scriptlet is running on OSTree system
+
+* Wed Oct 26 2022 Tao Liu <ltao@redhat.com> - 2.0.25-3
+- virtiofs support for kexec-tools
+- Seperate dracut and dracut-squash compressor for zstd
+
+* Mon Oct 17 2022 Tao Liu <ltao@redhat.com> - 2.0.25-2
+- mkdumprd: Improve error messages on non-existing NFS target directories
+- fadump: avoid non-debug kernel use for fadump case
+
+* Wed Sep 21 2022 Tao Liu <ltao@redhat.com> - 2.0.25-1
+- Rebase kexec-tools to v2.0.25
+- remind the users to run zipl after calling grubby on s390x
+- remove useless --zipl when calling grubby to update kernel command line
+- skip updating /etc/default/grub for s390x
+- Allow to update kexec-tools using virt-customize for cloud base image
+- kdumpctl: make the kdump.log root-readable-only
+
 * Tue Jul 12 2022 Tao Liu <ltao@redhat.com> - 2.0.24-5
 - kdump-lib: use non-debug kernels first
 - kdump-lib: fix typo in variable name
 
-* Tue Wed 15 2022 Tao Liu <ltao@redhat.com> - 2.0.24-4
+* Wed Jun 15 2022 Tao Liu <ltao@redhat.com> - 2.0.24-4
 - crashkernel: optimize arm64 reserved size if PAGE_SIZE=4k
 - kdump-lib.sh: Check the output of blkid with sed instead of eval
 
 * Tue Jun 7 2022 Tao Liu <ltao@redhat.com> - 2.0.24-3
 - kdump.sysconfig*: add ignition.firstboot to KDUMP_COMMANDLINE_REMOVE
 
-* Thu May 23 2022 Tao Liu <ltao@redhat.com> - 2.0.24-2
+* Mon May 23 2022 Tao Liu <ltao@redhat.com> - 2.0.24-2
 - remove the upper bound of default crashkernel value example
 - update fadump-howto
 - update kexec-kdump-howto