]> git.ipfire.org Git - thirdparty/dracut.git/commitdiff
Add memory usage trace to diffrent hook points
authorDave Young <dyoung@redhat.com>
Fri, 18 Jan 2013 01:59:52 +0000 (09:59 +0800)
committerHarald Hoyer <harald@redhat.com>
Wed, 23 Jan 2013 14:24:27 +0000 (15:24 +0100)
Hi, Here is an update of this patch, fixed the local variable issue.

dracut.cmdline.7.asc
modules.d/98systemd/dracut-cmdline.sh
modules.d/98systemd/dracut-initqueue.sh
modules.d/98systemd/dracut-pre-pivot.sh
modules.d/98systemd/dracut-pre-trigger.sh
modules.d/98systemd/dracut-pre-udev.sh
modules.d/99base/dracut-lib.sh

index ab0468a4496993942c73d0d0f88454a4bd6a1b1d..ea2d30bbc7e15d8dc2d28d7c9661986ccd429b5a 100644 (file)
@@ -143,6 +143,10 @@ It should be attached to any report about dracut problems.
     If systemd is not active, the logs are written to dmesg and _/run/initramfs/init.log_.
     If "quiet" is set, it also logs to the console.
 
+**rd.memdebug=[0-3]**::
+    print memory usage debug info, set the verbose level from 1 to 3
+    print nothing when set rd.memdebug=0
+
 **rd.break**::
     drop to a shell at the end
 
index a366381a4efdcc6a70caca5e11c97e05f3db4576..bfe2e433cc98ca7c35b942577a4f887173234a49 100755 (executable)
@@ -18,6 +18,7 @@ type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh
 
 source_conf /etc/conf.d
 
+make_trace_mem "hook cmdline" '1+:mem' '1+:iomem' '3+:slab'
 # run scriptlets to parse the command line
 getarg 'rd.break=cmdline' -d 'rdbreak=cmdline' && emergency_shell -n cmdline "Break before cmdline"
 source_hook cmdline
index e9da432b0fed0d67b5615a4a77d402d2258e0f0c..c82b6eb24fd7125996eaef684e64dfd6ab28dadb 100755 (executable)
@@ -10,6 +10,7 @@ type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh
 
 source_conf /etc/conf.d
 
+make_trace_mem "hook initqueue" '1:shortmem' '2+:mem' '3+:slab'
 getarg 'rd.break=initqueue' -d 'rdbreak=initqueue' && emergency_shell -n initqueue "Break before initqueue"
 
 RDRETRY=$(getarg rd.retry -d 'rd_retry=')
index 1ffa6aaab6a4979308841025e9e35ce2bb1e4409..2eed4bb8ea30ce36c28ba52be394bb1bb4eb664c 100755 (executable)
@@ -10,6 +10,7 @@ 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'
 # 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"
index 20a3f64709e2ef4d0f041f2557c57ef1040a5fc3..deaf0f2eda1a27853865de7be71801fd470a8416 100755 (executable)
@@ -10,6 +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"
 getargbool 0 rd.udev.info -n -y rdudevinfo && udevadm control --log-priority=info
 getargbool 0 rd.udev.debug -n -y rdudevdebug && udevadm control --log-priority=debug
 udevproperty "hookdir=$hookdir"
index 9a4dc61e92f1f67115c7a3284b0dfb64ccee015f..d20e6137c136090dac65ed424771b22a7ba24089 100755 (executable)
@@ -9,6 +9,7 @@ type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh
 
 source_conf /etc/conf.d
 
+make_trace_mem "hook pre-udev" '1:shortmem' '2+:mem' '3+:slab'
 # pre pivot scripts are sourced just before we doing cleanup and switch over
 # to the new root.
 getarg 'rd.break=pre-udev' 'rdbreak=pre-udev' && emergency_shell -n pre-udev "Break pre-udev"
index da37ac4ad3693a70d0250da3dbbe749d1e79f1e1..94ff33f85fbc59a409c816b7de841b9a8910e671 100755 (executable)
@@ -1013,3 +1013,98 @@ listlist() {
 are_lists_eq() {
     listlist "$1" "$2" "$3" "$4" && listlist "$1" "$3" "$2" "$4"
 }
+
+setmemdebug() {
+    if [ -z "$DEBUG_MEM_LEVEL" ]; then
+        export DEBUG_MEM_LEVEL=$(getargnum 0 0 3 rd.memdebug)
+    fi
+}
+
+setmemdebug
+
+# parameters: msg [trace_level:trace]...
+make_trace_mem()
+{
+    local msg
+    msg="$1"
+    shift
+    if [ -n "$DEBUG_MEM_LEVEL" ] && [ "$DEBUG_MEM_LEVEL" -gt 0 ]; then
+        make_trace show_memstats $DEBUG_MEM_LEVEL "[debug_mem]" "$msg" "$@"
+    fi
+}
+
+# parameters: func log_level prefix msg [trace_level:trace]...
+make_trace()
+{
+    local func log_level prefix msg msg_printed
+    local trace trace_level trace_in_higher_levels insert_trace
+
+    func=$1
+    shift
+
+    log_level=$1
+    shift
+
+    prefix=$1
+    shift
+
+    msg=$1
+    shift
+
+    if [ -z "$log_level" ]; then
+        return
+    fi
+
+    msg=$(echo $msg)
+
+    msg_printed=0
+    while [ $# -gt 0 ]; do
+        trace=${1%%:*}
+        trace_level=${trace%%+}
+        [ "$trace" != "$trace_level" ] && trace_in_higher_levels="yes"
+        trace=${1##*:}
+
+        if [ -z "$trace_level" ]; then
+            trace_level=0
+        fi
+
+        insert_trace=0
+        if [ -n "$trace_in_higher_levels" ]; then
+            if [ "$log_level" -ge "$trace_level" ]; then
+                insert_trace=1
+            fi
+        else
+            if [ "$log_level" -eq "$trace_level" ]; then
+                insert_trace=1
+            fi
+        fi
+
+        if [ $insert_trace -eq 1 ]; then
+            if [ $msg_printed -eq 0 ]; then
+                echo "$prefix $msg"
+                msg_printed=1
+            fi
+            $func $trace
+        fi
+        shift
+    done
+}
+
+# parameters: type
+show_memstats()
+{
+    case $1 in
+        shortmem)
+            cat /proc/meminfo  | grep -e "^MemFree" -e "^Cached" -e "^Slab"
+            ;;
+        mem)
+            cat /proc/meminfo
+            ;;
+        slab)
+            cat /proc/slabinfo
+            ;;
+        iomem)
+            cat /proc/iomem
+            ;;
+    esac
+}