You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
169 lines
6.8 KiB
169 lines
6.8 KiB
From e186d99780d1247f24535e5dc4ec9c82444afaa3 Mon Sep 17 00:00:00 2001 |
|
From: Xunlei Pang <xlpang@redhat.com> |
|
Date: Thu, 3 Nov 2016 19:40:16 +0800 |
|
Subject: [PATCH] 99base: apply kernel module memory debug support |
|
|
|
Extend "rd.memdebug" to "4", and "make_trace_mem" to "4+:komem". |
|
Add new "cleanup_trace_mem" to cleanup the trace if active. |
|
|
|
Signed-off-by: Xunlei Pang <xlpang@redhat.com> |
|
--- |
|
modules.d/98systemd/dracut-cmdline.sh | 2 +- |
|
modules.d/98systemd/dracut-pre-mount.sh | 2 +- |
|
modules.d/98systemd/dracut-pre-pivot.sh | 3 ++- |
|
modules.d/98systemd/dracut-pre-trigger.sh | 2 +- |
|
modules.d/99base/dracut-lib.sh | 13 ++++++++++++- |
|
modules.d/99base/init.sh | 9 +++++---- |
|
modules.d/99base/module-setup.sh | 1 + |
|
7 files changed, 23 insertions(+), 9 deletions(-) |
|
|
|
diff --git a/modules.d/98systemd/dracut-cmdline.sh b/modules.d/98systemd/dracut-cmdline.sh |
|
index 630f3f92..b6b899f0 100755 |
|
--- a/modules.d/98systemd/dracut-cmdline.sh |
|
+++ b/modules.d/98systemd/dracut-cmdline.sh |
|
@@ -43,7 +43,7 @@ export root |
|
export rflags |
|
export fstype |
|
|
|
-make_trace_mem "hook cmdline" '1+:mem' '1+:iomem' '3+:slab' |
|
+make_trace_mem "hook cmdline" '1+:mem' '1+:iomem' '3+:slab' '4+:komem' |
|
# run scriptlets to parse the command line |
|
getarg 'rd.break=cmdline' -d 'rdbreak=cmdline' && emergency_shell -n cmdline "Break before cmdline" |
|
source_hook cmdline |
|
diff --git a/modules.d/98systemd/dracut-pre-mount.sh b/modules.d/98systemd/dracut-pre-mount.sh |
|
index 55b051ab..199cf965 100755 |
|
--- a/modules.d/98systemd/dracut-pre-mount.sh |
|
+++ b/modules.d/98systemd/dracut-pre-mount.sh |
|
@@ -9,7 +9,7 @@ type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh |
|
|
|
source_conf /etc/conf.d |
|
|
|
-make_trace_mem "hook pre-mount" '1:shortmem' '2+:mem' '3+:slab' |
|
+make_trace_mem "hook pre-mount" '1:shortmem' '2+:mem' '3+:slab' '4+:komem' |
|
# pre pivot scripts are sourced just before we doing cleanup and switch over |
|
# to the new root. |
|
getarg 'rd.break=pre-mount' 'rdbreak=pre-mount' && emergency_shell -n pre-mount "Break pre-mount" |
|
diff --git a/modules.d/98systemd/dracut-pre-pivot.sh b/modules.d/98systemd/dracut-pre-pivot.sh |
|
index 4c3eefcd..c079972e 100755 |
|
--- a/modules.d/98systemd/dracut-pre-pivot.sh |
|
+++ b/modules.d/98systemd/dracut-pre-pivot.sh |
|
@@ -10,12 +10,13 @@ type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh |
|
|
|
source_conf /etc/conf.d |
|
|
|
-make_trace_mem "hook pre-pivot" '1:shortmem' '2+:mem' '3+:slab' |
|
+make_trace_mem "hook pre-pivot" '1:shortmem' '2+:mem' '3+:slab' '4+:komem' |
|
# pre pivot scripts are sourced just before we doing cleanup and switch over |
|
# to the new root. |
|
getarg 'rd.break=pre-pivot' 'rdbreak=pre-pivot' && emergency_shell -n pre-pivot "Break pre-pivot" |
|
source_hook pre-pivot |
|
|
|
+cleanup_trace_mem |
|
# pre pivot cleanup scripts are sourced just before we switch over to the new root. |
|
getarg 'rd.break=cleanup' 'rdbreak=cleanup' && emergency_shell -n cleanup "Break cleanup" |
|
source_hook cleanup |
|
diff --git a/modules.d/98systemd/dracut-pre-trigger.sh b/modules.d/98systemd/dracut-pre-trigger.sh |
|
index 0dbf32a5..241cd1e5 100755 |
|
--- a/modules.d/98systemd/dracut-pre-trigger.sh |
|
+++ b/modules.d/98systemd/dracut-pre-trigger.sh |
|
@@ -10,7 +10,7 @@ type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh |
|
|
|
source_conf /etc/conf.d |
|
|
|
-make_trace_mem "hook pre-trigger" "1:shortmem" "2+:mem" "3+:slab" |
|
+make_trace_mem "hook pre-trigger" '1:shortmem' '2+:mem' '3+:slab' '4+:komem' |
|
|
|
source_hook pre-trigger |
|
|
|
diff --git a/modules.d/99base/dracut-lib.sh b/modules.d/99base/dracut-lib.sh |
|
index 10d9cbc5..78e01a78 100755 |
|
--- a/modules.d/99base/dracut-lib.sh |
|
+++ b/modules.d/99base/dracut-lib.sh |
|
@@ -1177,12 +1177,20 @@ are_lists_eq() { |
|
|
|
setmemdebug() { |
|
if [ -z "$DEBUG_MEM_LEVEL" ]; then |
|
- export DEBUG_MEM_LEVEL=$(getargnum 0 0 3 rd.memdebug) |
|
+ export DEBUG_MEM_LEVEL=$(getargnum 0 0 4 rd.memdebug) |
|
fi |
|
} |
|
|
|
setmemdebug |
|
|
|
+cleanup_trace_mem() |
|
+{ |
|
+ # tracekomem based on kernel trace needs cleanup after use. |
|
+ if [ "$DEBUG_MEM_LEVEL" -eq 4 ]; then |
|
+ tracekomem --cleanup |
|
+ fi |
|
+} |
|
+ |
|
# parameters: msg [trace_level:trace]... |
|
make_trace_mem() |
|
{ |
|
@@ -1267,5 +1275,8 @@ show_memstats() |
|
iomem) |
|
cat /proc/iomem |
|
;; |
|
+ komem) |
|
+ tracekomem |
|
+ ;; |
|
esac |
|
} |
|
diff --git a/modules.d/99base/init.sh b/modules.d/99base/init.sh |
|
index 7bbe6703..473bf42e 100755 |
|
--- a/modules.d/99base/init.sh |
|
+++ b/modules.d/99base/init.sh |
|
@@ -124,7 +124,7 @@ if getarg "rd.cmdline=ask"; then |
|
fi |
|
|
|
# run scriptlets to parse the command line |
|
-make_trace_mem "hook cmdline" '1+:mem' '1+:iomem' '3+:slab' |
|
+make_trace_mem "hook cmdline" '1+:mem' '1+:iomem' '3+:slab' '4+:komem' |
|
getarg 'rd.break=cmdline' -d 'rdbreak=cmdline' && emergency_shell -n cmdline "Break before cmdline" |
|
source_hook cmdline |
|
|
|
@@ -153,7 +153,7 @@ getargbool 0 rd.udev.info -d -y rdudevinfo && udevadm control "$UDEV_LOG_PRIO_AR |
|
getargbool 0 rd.udev.debug -d -y rdudevdebug && udevadm control "$UDEV_LOG_PRIO_ARG=debug" |
|
udevproperty "hookdir=$hookdir" |
|
|
|
-make_trace_mem "hook pre-trigger" '1:shortmem' '2+:mem' '3+:slab' |
|
+make_trace_mem "hook pre-trigger" '1:shortmem' '2+:mem' '3+:slab' '4+:komem' |
|
getarg 'rd.break=pre-trigger' -d 'rdbreak=pre-trigger' && emergency_shell -n pre-trigger "Break before pre-trigger" |
|
source_hook pre-trigger |
|
|
|
@@ -224,7 +224,7 @@ unset RDRETRY |
|
|
|
# pre-mount happens before we try to mount the root filesystem, |
|
# and happens once. |
|
-make_trace_mem "hook pre-mount" '1:shortmem' '2+:mem' '3+:slab' |
|
+make_trace_mem "hook pre-mount" '1:shortmem' '2+:mem' '3+:slab' '4+:komem' |
|
getarg 'rd.break=pre-mount' -d 'rdbreak=pre-mount' && emergency_shell -n pre-mount "Break pre-mount" |
|
source_hook pre-mount |
|
|
|
@@ -260,11 +260,12 @@ done |
|
|
|
# pre pivot scripts are sourced just before we doing cleanup and switch over |
|
# to the new root. |
|
-make_trace_mem "hook pre-pivot" '1:shortmem' '2+:mem' '3+:slab' |
|
+make_trace_mem "hook pre-pivot" '1:shortmem' '2+:mem' '3+:slab' '4+:komem' |
|
getarg 'rd.break=pre-pivot' -d 'rdbreak=pre-pivot' && emergency_shell -n pre-pivot "Break pre-pivot" |
|
source_hook pre-pivot |
|
|
|
make_trace_mem "hook cleanup" '1:shortmem' '2+:mem' '3+:slab' |
|
+cleanup_trace_mem |
|
# pre pivot cleanup scripts are sourced just before we switch over to the new root. |
|
getarg 'rd.break=cleanup' -d 'rdbreak=cleanup' && emergency_shell -n cleanup "Break cleanup" |
|
source_hook cleanup |
|
diff --git a/modules.d/99base/module-setup.sh b/modules.d/99base/module-setup.sh |
|
index d5e78613..8fd4e80d 100755 |
|
--- a/modules.d/99base/module-setup.sh |
|
+++ b/modules.d/99base/module-setup.sh |
|
@@ -34,6 +34,7 @@ install() { |
|
inst_script "$moddir/initqueue.sh" "/sbin/initqueue" |
|
inst_script "$moddir/loginit.sh" "/sbin/loginit" |
|
inst_script "$moddir/rdsosreport.sh" "/sbin/rdsosreport" |
|
+ inst_script "$moddir/memtrace-ko.sh" "/sbin/tracekomem" |
|
|
|
[ -e "${initdir}/lib" ] || mkdir -m 0755 -p ${initdir}/lib |
|
mkdir -m 0755 -p ${initdir}/lib/dracut
|
|
|