We replace "reserved_memory= 8192" with "reserved_memory = 1024"
in /etc/lvm/lvm.conf used by "lvm2", this can save 14MB peak memory
consumption, so we lower the possibility of kdump OOM. We only
do it in case of linear type lvm volume for safety.
For kdump, we don't have too many lvm targets, lvm2 locates in the
RAM(rootfs), so don't need that much memory, 1MB is sufficient.
This patch adds a "lvm_linear" checklist in KDUMP_TARGET_CHECKLIST,
and use "kdump_target_is lvm_linear" to insert a dracut hook to
modify /etc/lvm/lvm.conf before kdump udev(so lvm2) starts.
Signed-off-by: Xunlei Pang <xlpang(a)redhat.com>
---
dracut-module-setup.sh | 6 ++++++
dracut-process-lvmconf.sh | 6 ++++++
kexec-tools.spec | 3 +++
mkdumprd | 11 ++++++++++-
4 files changed, 25 insertions(+), 1 deletion(-)
create mode 100644 dracut-process-lvmconf.sh
diff --git a/dracut-module-setup.sh b/dracut-module-setup.sh
index 1f96bb8..33a66fd 100755
--- a/dracut-module-setup.sh
+++ b/dracut-module-setup.sh
@@ -743,4 +743,10 @@ install() {
# target. Ideally all this should be pushed into dracut iscsi module
# at some point of time.
kdump_check_iscsi_targets
+
+ # For the lvm linear type dump target, in /etc/lvm/lvm.conf we can safely replace
+ # "reserved_memory = 8192" with "reserved_memory = 1024" to lower
memory pressure
+ if kdump_target_check lvmlinear; then
+ inst_hook pre-udev 99 "$moddir/process-lvmconf.sh"
+ fi
}
diff --git a/dracut-process-lvmconf.sh b/dracut-process-lvmconf.sh
new file mode 100644
index 0000000..3564213
--- /dev/null
+++ b/dracut-process-lvmconf.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+# RH BZ1377530
+if [ -f "/etc/lvm/lvm.conf" ]; then
+ sed -i -e
's/\(^[[:space:]]*\)reserved_memory[[:space:]]*=[[:space:]]*[[:digit:]]*/\1reserved_memory
= 1024/' /etc/lvm/lvm.conf
+fi
diff --git a/kexec-tools.spec b/kexec-tools.spec
index 2a176f3..7c7d115 100644
--- a/kexec-tools.spec
+++ b/kexec-tools.spec
@@ -41,6 +41,7 @@ Source103: dracut-kdump-error-handler.sh
Source104: dracut-kdump-emergency.service
Source105: dracut-kdump-error-handler.service
Source106: dracut-kdump-capture.service
+Source107: dracut-process-lvmconf.sh
Requires(post): systemd-units
Requires(preun): systemd-units
@@ -197,8 +198,10 @@ cp %{SOURCE103}
$RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpb
cp %{SOURCE104}
$RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase/%{remove_dracut_prefix
%{SOURCE104}}
cp %{SOURCE105}
$RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase/%{remove_dracut_prefix
%{SOURCE105}}
cp %{SOURCE106}
$RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase/%{remove_dracut_prefix
%{SOURCE106}}
+cp %{SOURCE107}
$RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase/%{remove_dracut_prefix
%{SOURCE107}}
chmod 755
$RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase/%{remove_dracut_prefix
%{SOURCE100}}
chmod 755
$RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase/%{remove_dracut_prefix
%{SOURCE101}}
+chmod 755
$RPM_BUILD_ROOT/etc/kdump-adv-conf/kdump_dracut_modules/99kdumpbase/%{remove_dracut_prefix
%{SOURCE107}}
%define dracutlibdir %{_prefix}/lib/dracut
diff --git a/mkdumprd b/mkdumprd
index 392eb7f..38b3f12 100644
--- a/mkdumprd
+++ b/mkdumprd
@@ -12,7 +12,7 @@
export IN_KDUMP=1
# See kdump_target_XXX()
-KDUMP_TARGET_CHECKLIST=""
+KDUMP_TARGET_CHECKLIST="lvmlinear"
conf_file="/etc/kdump.conf"
SSH_KEY_LOCATION="/root/.ssh/kdump_id_rsa"
@@ -297,6 +297,15 @@ kdump_target_handle()
tag=KDUMP_TARGET_TAG_$item
# the item handling begins
case "$item" in
+ lvmlinear)
+ if ! [[ $pdev =~ "/dev/mapper/" ]]; then
+ return
+ fi
+ dmsetup table $pdev 2>/dev/null | grep linear &>/dev/null
+ if [ $? -ne 0 ]; then
+ return
+ fi
+ ;;
*)
echo "unhandled item in kdump target checklist"
return
--
1.8.3.1