* [PATCH 2/2] Add memory usage trace to diffrent hook points @ 2012-11-26 2:38 Dave Young [not found] ` <20121126023852.GA6886-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org> 0 siblings, 1 reply; 7+ messages in thread From: Dave Young @ 2012-11-26 2:38 UTC (permalink / raw) To: harald-H+wXaHxf7aLQT0dZR+AlfA, initramfs-u79uwXL29TY76Z2rM5mHXA, jstancek-H+wXaHxf7aLQT0dZR+AlfA, vgoyal-H+wXaHxf7aLQT0dZR+AlfA Port mkdumprd memory trace functions wrote by jstancek-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org For kdump, memory usage tracing is important because there's limited memory in kdump 2nd kernel. Add a rd.memdebug cmdline for this. set rd.memdebug=<X> will set the debug level to X which is the debug verbose level. I added several trace point to the begin of several init hooks At cmdline hooks I'm adding trace of "1+:mem 2+:iomem 3+:slab" For other hooks I'm adding trace of "1:shortmem 2+:mem 3+:slab" This means: rd.memdebug=1) cmdline hook: print /proc/meminfo other hooks: print part of /proc/meminfo rd.memdebug=2) cmdline hook: show /proc/iomem and /proc/meminfo other hooks: print /proc/meminfo rd.memdebug=3): cmdline hook: print /proc/iomem, /proc/meminfo and /proc/slabinfo other hooks: print /proc/meminfo and /proc/slabinfo *): do not print any mem debug info Signed-off-by: Dave Young <dyoung-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> --- dracut.cmdline.7.asc | 4 + modules.d/98systemd/dracut-cmdline.sh | 1 modules.d/98systemd/dracut-initqueue.sh | 1 modules.d/98systemd/dracut-pre-pivot.sh | 1 modules.d/98systemd/dracut-pre-trigger.sh | 1 modules.d/98systemd/dracut-pre-udev.sh | 1 modules.d/99base/dracut-lib.sh | 90 ++++++++++++++++++++++++++++++ 7 files changed, 99 insertions(+) --- dracut.orig/modules.d/98systemd/dracut-cmdline.sh +++ dracut/modules.d/98systemd/dracut-cmdline.sh @@ -18,6 +18,7 @@ type getarg >/dev/null 2>&1 || . /lib/dr source_conf /etc/conf.d +make_trace_mem "hook cmdline" 1+:mem 2+: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 --- dracut.orig/modules.d/98systemd/dracut-initqueue.sh +++ dracut/modules.d/98systemd/dracut-initqueue.sh @@ -10,6 +10,7 @@ type getarg >/dev/null 2>&1 || . /lib/dr 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=') --- dracut.orig/modules.d/98systemd/dracut-pre-pivot.sh +++ dracut/modules.d/98systemd/dracut-pre-pivot.sh @@ -10,6 +10,7 @@ type getarg >/dev/null 2>&1 || . /lib/dr 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" --- dracut.orig/modules.d/98systemd/dracut-pre-trigger.sh +++ dracut/modules.d/98systemd/dracut-pre-trigger.sh @@ -10,6 +10,7 @@ type getarg >/dev/null 2>&1 || . /lib/dr 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" --- dracut.orig/modules.d/98systemd/dracut-pre-udev.sh +++ dracut/modules.d/98systemd/dracut-pre-udev.sh @@ -9,6 +9,7 @@ type getarg >/dev/null 2>&1 || . /lib/dr 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" --- dracut.orig/dracut.cmdline.7.asc +++ dracut/dracut.cmdline.7.asc @@ -134,6 +134,10 @@ Debug set -x for the dracut shell and logs to dmesg, console and _/run/initramfs/init.log_ +**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 --- dracut.orig/modules.d/99base/dracut-lib.sh +++ dracut/modules.d/99base/dracut-lib.sh @@ -996,3 +996,93 @@ 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 3 rd.memdebug) + fi +} + +setmemdebug + +# parameters: msg [trace_level:trace]... +function make_trace_mem() +{ + msg=$1 + shift + if [ "$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]... +function make_trace() +{ + func=$1 + shift + + log_level=`echo "$1" | grep -o '^[0-9]\+'` + shift + + prefix=$1 + shift + + msg=$1 + shift + + if [ -z "$log_level" ]; then + return + fi + + msg=`echo "$msg" | sed 's/^\s\+//'` + + msg_printed=0 + while [ $# -gt 0 ]; do + trace_level=`echo "$1" | grep -o '^[0-9]\+'` + trace_in_higher_levels=`echo "$1" | grep -o '+'` + trace=`echo $1 | sed "s/^.*://"` + + 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 +} ^ permalink raw reply [flat|nested] 7+ messages in thread
[parent not found: <20121126023852.GA6886-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>]
* Re: [PATCH 2/2] Add memory usage trace to diffrent hook points [not found] ` <20121126023852.GA6886-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org> @ 2012-11-27 22:33 ` Vivek Goyal [not found] ` <20121127223330.GG6964-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> 0 siblings, 1 reply; 7+ messages in thread From: Vivek Goyal @ 2012-11-27 22:33 UTC (permalink / raw) To: Dave Young Cc: harald-H+wXaHxf7aLQT0dZR+AlfA, initramfs-u79uwXL29TY76Z2rM5mHXA, jstancek-H+wXaHxf7aLQT0dZR+AlfA On Mon, Nov 26, 2012 at 10:38:52AM +0800, Dave Young wrote: > > > Port mkdumprd memory trace functions wrote by jstancek-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org > For kdump, memory usage tracing is important because there's limited > memory in kdump 2nd kernel. > > Add a rd.memdebug cmdline for this. set rd.memdebug=<X> will set the > debug level to X which is the debug verbose level. > > I added several trace point to the begin of several init hooks > At cmdline hooks I'm adding trace of "1+:mem 2+:iomem 3+:slab" > For other hooks I'm adding trace of "1:shortmem 2+:mem 3+:slab" Not everybody knows what is kdump functionality for debugging. Can you please explain a bit more about the notion of 1+, 2+ etc. > > This means: > rd.memdebug=1) > cmdline hook: print /proc/meminfo I think it is not a bad idea to print /proc/iomem for command line hook in case of rd.memdebug=1. It is just one time print, so does not hurt. > other hooks: print part of /proc/meminfo We are calling it shortmem above. So atleast put it in bracket so that it is not confusing. Thanks Vivek > rd.memdebug=2) > cmdline hook: show /proc/iomem and /proc/meminfo > other hooks: print /proc/meminfo > rd.memdebug=3): > cmdline hook: print /proc/iomem, /proc/meminfo and /proc/slabinfo > other hooks: print /proc/meminfo and /proc/slabinfo > *): > do not print any mem debug info > > Signed-off-by: Dave Young <dyoung-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> > --- > dracut.cmdline.7.asc | 4 + > modules.d/98systemd/dracut-cmdline.sh | 1 > modules.d/98systemd/dracut-initqueue.sh | 1 > modules.d/98systemd/dracut-pre-pivot.sh | 1 > modules.d/98systemd/dracut-pre-trigger.sh | 1 > modules.d/98systemd/dracut-pre-udev.sh | 1 > modules.d/99base/dracut-lib.sh | 90 ++++++++++++++++++++++++++++++ > 7 files changed, 99 insertions(+) > > --- dracut.orig/modules.d/98systemd/dracut-cmdline.sh > +++ dracut/modules.d/98systemd/dracut-cmdline.sh > @@ -18,6 +18,7 @@ type getarg >/dev/null 2>&1 || . /lib/dr > > source_conf /etc/conf.d > > +make_trace_mem "hook cmdline" 1+:mem 2+: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 > --- dracut.orig/modules.d/98systemd/dracut-initqueue.sh > +++ dracut/modules.d/98systemd/dracut-initqueue.sh > @@ -10,6 +10,7 @@ type getarg >/dev/null 2>&1 || . /lib/dr > > 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=') > --- dracut.orig/modules.d/98systemd/dracut-pre-pivot.sh > +++ dracut/modules.d/98systemd/dracut-pre-pivot.sh > @@ -10,6 +10,7 @@ type getarg >/dev/null 2>&1 || . /lib/dr > > 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" > --- dracut.orig/modules.d/98systemd/dracut-pre-trigger.sh > +++ dracut/modules.d/98systemd/dracut-pre-trigger.sh > @@ -10,6 +10,7 @@ type getarg >/dev/null 2>&1 || . /lib/dr > > 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" > --- dracut.orig/modules.d/98systemd/dracut-pre-udev.sh > +++ dracut/modules.d/98systemd/dracut-pre-udev.sh > @@ -9,6 +9,7 @@ type getarg >/dev/null 2>&1 || . /lib/dr > > 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" > --- dracut.orig/dracut.cmdline.7.asc > +++ dracut/dracut.cmdline.7.asc > @@ -134,6 +134,10 @@ Debug > set -x for the dracut shell and logs to dmesg, console and > _/run/initramfs/init.log_ > > +**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 > > --- dracut.orig/modules.d/99base/dracut-lib.sh > +++ dracut/modules.d/99base/dracut-lib.sh > @@ -996,3 +996,93 @@ 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 3 rd.memdebug) > + fi > +} > + > +setmemdebug > + > +# parameters: msg [trace_level:trace]... > +function make_trace_mem() > +{ > + msg=$1 > + shift > + if [ "$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]... > +function make_trace() > +{ > + func=$1 > + shift > + > + log_level=`echo "$1" | grep -o '^[0-9]\+'` > + shift > + > + prefix=$1 > + shift > + > + msg=$1 > + shift > + > + if [ -z "$log_level" ]; then > + return > + fi > + > + msg=`echo "$msg" | sed 's/^\s\+//'` > + > + msg_printed=0 > + while [ $# -gt 0 ]; do > + trace_level=`echo "$1" | grep -o '^[0-9]\+'` > + trace_in_higher_levels=`echo "$1" | grep -o '+'` > + trace=`echo $1 | sed "s/^.*://"` > + > + 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 > +} > -- > To unsubscribe from this list: send the line "unsubscribe initramfs" in > the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org > More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 7+ messages in thread
[parent not found: <20121127223330.GG6964-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>]
* Re: [PATCH 2/2] Add memory usage trace to diffrent hook points [not found] ` <20121127223330.GG6964-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> @ 2012-11-28 5:53 ` Dave Young 2012-11-28 8:45 ` [PATCH 2/2 v2] " Dave Young 1 sibling, 0 replies; 7+ messages in thread From: Dave Young @ 2012-11-28 5:53 UTC (permalink / raw) To: Vivek Goyal Cc: harald-H+wXaHxf7aLQT0dZR+AlfA, initramfs-u79uwXL29TY76Z2rM5mHXA, jstancek-H+wXaHxf7aLQT0dZR+AlfA On 11/28/2012 06:33 AM, Vivek Goyal wrote: > On Mon, Nov 26, 2012 at 10:38:52AM +0800, Dave Young wrote: >> >> >> Port mkdumprd memory trace functions wrote by jstancek-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org >> For kdump, memory usage tracing is important because there's limited >> memory in kdump 2nd kernel. >> >> Add a rd.memdebug cmdline for this. set rd.memdebug=<X> will set the >> debug level to X which is the debug verbose level. >> >> I added several trace point to the begin of several init hooks >> At cmdline hooks I'm adding trace of "1+:mem 2+:iomem 3+:slab" >> For other hooks I'm adding trace of "1:shortmem 2+:mem 3+:slab" > > Not everybody knows what is kdump functionality for debugging. Can you > please explain a bit more about the notion of 1+, 2+ etc. Will update > >> >> This means: >> rd.memdebug=1) >> cmdline hook: print /proc/meminfo > > I think it is not a bad idea to print /proc/iomem for command line > hook in case of rd.memdebug=1. It is just one time print, so does > not hurt. Ok. Will do > >> other hooks: print part of /proc/meminfo > > We are calling it shortmem above. So atleast put it in bracket so > that it is not confusing. Will do. > > Thanks > Vivek > >> rd.memdebug=2) >> cmdline hook: show /proc/iomem and /proc/meminfo >> other hooks: print /proc/meminfo >> rd.memdebug=3): >> cmdline hook: print /proc/iomem, /proc/meminfo and /proc/slabinfo >> other hooks: print /proc/meminfo and /proc/slabinfo >> *): >> do not print any mem debug info >> >> Signed-off-by: Dave Young <dyoung-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> >> --- >> dracut.cmdline.7.asc | 4 + >> modules.d/98systemd/dracut-cmdline.sh | 1 >> modules.d/98systemd/dracut-initqueue.sh | 1 >> modules.d/98systemd/dracut-pre-pivot.sh | 1 >> modules.d/98systemd/dracut-pre-trigger.sh | 1 >> modules.d/98systemd/dracut-pre-udev.sh | 1 >> modules.d/99base/dracut-lib.sh | 90 ++++++++++++++++++++++++++++++ >> 7 files changed, 99 insertions(+) >> >> --- dracut.orig/modules.d/98systemd/dracut-cmdline.sh >> +++ dracut/modules.d/98systemd/dracut-cmdline.sh >> @@ -18,6 +18,7 @@ type getarg >/dev/null 2>&1 || . /lib/dr >> >> source_conf /etc/conf.d >> >> +make_trace_mem "hook cmdline" 1+:mem 2+: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 >> --- dracut.orig/modules.d/98systemd/dracut-initqueue.sh >> +++ dracut/modules.d/98systemd/dracut-initqueue.sh >> @@ -10,6 +10,7 @@ type getarg >/dev/null 2>&1 || . /lib/dr >> >> 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=') >> --- dracut.orig/modules.d/98systemd/dracut-pre-pivot.sh >> +++ dracut/modules.d/98systemd/dracut-pre-pivot.sh >> @@ -10,6 +10,7 @@ type getarg >/dev/null 2>&1 || . /lib/dr >> >> 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" >> --- dracut.orig/modules.d/98systemd/dracut-pre-trigger.sh >> +++ dracut/modules.d/98systemd/dracut-pre-trigger.sh >> @@ -10,6 +10,7 @@ type getarg >/dev/null 2>&1 || . /lib/dr >> >> 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" >> --- dracut.orig/modules.d/98systemd/dracut-pre-udev.sh >> +++ dracut/modules.d/98systemd/dracut-pre-udev.sh >> @@ -9,6 +9,7 @@ type getarg >/dev/null 2>&1 || . /lib/dr >> >> 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" >> --- dracut.orig/dracut.cmdline.7.asc >> +++ dracut/dracut.cmdline.7.asc >> @@ -134,6 +134,10 @@ Debug >> set -x for the dracut shell and logs to dmesg, console and >> _/run/initramfs/init.log_ >> >> +**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 >> >> --- dracut.orig/modules.d/99base/dracut-lib.sh >> +++ dracut/modules.d/99base/dracut-lib.sh >> @@ -996,3 +996,93 @@ 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 3 rd.memdebug) >> + fi >> +} >> + >> +setmemdebug >> + >> +# parameters: msg [trace_level:trace]... >> +function make_trace_mem() >> +{ >> + msg=$1 >> + shift >> + if [ "$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]... >> +function make_trace() >> +{ >> + func=$1 >> + shift >> + >> + log_level=`echo "$1" | grep -o '^[0-9]\+'` >> + shift >> + >> + prefix=$1 >> + shift >> + >> + msg=$1 >> + shift >> + >> + if [ -z "$log_level" ]; then >> + return >> + fi >> + >> + msg=`echo "$msg" | sed 's/^\s\+//'` >> + >> + msg_printed=0 >> + while [ $# -gt 0 ]; do >> + trace_level=`echo "$1" | grep -o '^[0-9]\+'` >> + trace_in_higher_levels=`echo "$1" | grep -o '+'` >> + trace=`echo $1 | sed "s/^.*://"` >> + >> + 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 >> +} >> -- >> To unsubscribe from this list: send the line "unsubscribe initramfs" in >> the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html -- Thanks Dave ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 2/2 v2] Add memory usage trace to diffrent hook points [not found] ` <20121127223330.GG6964-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> 2012-11-28 5:53 ` Dave Young @ 2012-11-28 8:45 ` Dave Young [not found] ` <50B5CF24.6090006-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> 1 sibling, 1 reply; 7+ messages in thread From: Dave Young @ 2012-11-28 8:45 UTC (permalink / raw) To: Vivek Goyal Cc: harald-H+wXaHxf7aLQT0dZR+AlfA, initramfs-u79uwXL29TY76Z2rM5mHXA, jstancek-H+wXaHxf7aLQT0dZR+AlfA Port mkdumprd memory trace functions wrote by jstancek-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org For kdump, memory usage tracing is important because there's limited memory in kdump 2nd kernel. Add a rd.memdebug cmdline for this. set rd.memdebug=<X> will set the debug level to X which is the debug verbose level. the format of cmdline is like below: <level>[+]:<type> <level> is the debug level [+] means debug level >= <level> <type> is the debug info type, as for this patch I added mem, iomem, slab mem is for /proc/meminfo, iomem is for /proc/iomem, slab is for /proc/slabinfo Also shortmem is the stripped /proc/meminfo which only includes 3 lines of Memfree, Cached and Slab, for example: MemFree: 6327176 kB Cached: 741916 kB Slab: 77284 kB I added several trace point to the begin of several init hooks At cmdline hooks I'm adding trace of "1+:mem 1+:iomem 3+:slab" For other hooks I'm adding trace of "1:shortmem 2+:mem 3+:slab" This means: rd.memdebug=1) cmdline hook: print mem and iomem other hooks: print shortmem rd.memdebug=2) cmdline hook: print mem and iomem other hooks: print mem rd.memdebug=3): cmdline hook: print mem iomem, and slabinfo other hooks: print mem and slabinfo *): do not print any mem debug info [v1->v2]: update to use getargnum with <minval> as argument print iomem info at cmdline hook as well Signed-off-by: Dave Young <dyoung-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> --- dracut.cmdline.7.asc | 4 + modules.d/98systemd/dracut-cmdline.sh | 1 modules.d/98systemd/dracut-initqueue.sh | 1 modules.d/98systemd/dracut-pre-pivot.sh | 1 modules.d/98systemd/dracut-pre-trigger.sh | 1 modules.d/98systemd/dracut-pre-udev.sh | 1 modules.d/99base/dracut-lib.sh | 90 ++++++++++++++++++++++++++++++ 7 files changed, 99 insertions(+) --- dracut.orig/modules.d/98systemd/dracut-cmdline.sh +++ dracut/modules.d/98systemd/dracut-cmdline.sh @@ -18,6 +18,7 @@ type getarg >/dev/null 2>&1 || . /lib/dr 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 --- dracut.orig/modules.d/98systemd/dracut-initqueue.sh +++ dracut/modules.d/98systemd/dracut-initqueue.sh @@ -10,6 +10,7 @@ type getarg >/dev/null 2>&1 || . /lib/dr 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=') --- dracut.orig/modules.d/98systemd/dracut-pre-pivot.sh +++ dracut/modules.d/98systemd/dracut-pre-pivot.sh @@ -10,6 +10,7 @@ type getarg >/dev/null 2>&1 || . /lib/dr 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" --- dracut.orig/modules.d/98systemd/dracut-pre-trigger.sh +++ dracut/modules.d/98systemd/dracut-pre-trigger.sh @@ -10,6 +10,7 @@ type getarg >/dev/null 2>&1 || . /lib/dr 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" --- dracut.orig/modules.d/98systemd/dracut-pre-udev.sh +++ dracut/modules.d/98systemd/dracut-pre-udev.sh @@ -9,6 +9,7 @@ type getarg >/dev/null 2>&1 || . /lib/dr 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" --- dracut.orig/dracut.cmdline.7.asc +++ dracut/dracut.cmdline.7.asc @@ -134,6 +134,10 @@ Debug set -x for the dracut shell and logs to dmesg, console and _/run/initramfs/init.log_ +**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 --- dracut.orig/modules.d/99base/dracut-lib.sh +++ dracut/modules.d/99base/dracut-lib.sh @@ -998,3 +998,93 @@ 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]... +function make_trace_mem() +{ + msg=$1 + shift + if [ "$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]... +function make_trace() +{ + func=$1 + shift + + log_level=`echo "$1" | grep -o '^[0-9]\+'` + shift + + prefix=$1 + shift + + msg=$1 + shift + + if [ -z "$log_level" ]; then + return + fi + + msg=`echo "$msg" | sed 's/^\s\+//'` + + msg_printed=0 + while [ $# -gt 0 ]; do + trace_level=`echo "$1" | grep -o '^[0-9]\+'` + trace_in_higher_levels=`echo "$1" | grep -o '+'` + trace=`echo $1 | sed "s/^.*://"` + + 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 +} ^ permalink raw reply [flat|nested] 7+ messages in thread
[parent not found: <50B5CF24.6090006-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>]
* Re: [PATCH 2/2 v2] Add memory usage trace to diffrent hook points [not found] ` <50B5CF24.6090006-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> @ 2013-01-11 9:05 ` Dave Young [not found] ` <50EFD5D8.1070508-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> 0 siblings, 1 reply; 7+ messages in thread From: Dave Young @ 2013-01-11 9:05 UTC (permalink / raw) To: Vivek Goyal, harald-H+wXaHxf7aLQT0dZR+AlfA Cc: initramfs-u79uwXL29TY76Z2rM5mHXA, jstancek-H+wXaHxf7aLQT0dZR+AlfA Hello harald What's your opinion about this patch? Could you take a look at it? On 11/28/2012 04:45 PM, Dave Young wrote: > > > Port mkdumprd memory trace functions wrote by jstancek-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org > For kdump, memory usage tracing is important because there's limited > memory in kdump 2nd kernel. > > Add a rd.memdebug cmdline for this. set rd.memdebug=<X> will set the > debug level to X which is the debug verbose level. > > the format of cmdline is like below: > <level>[+]:<type> > <level> is the debug level > [+] means debug level >= <level> > <type> is the debug info type, as for this patch I added mem, iomem, slab > mem is for /proc/meminfo, iomem is for /proc/iomem, slab is for /proc/slabinfo > Also shortmem is the stripped /proc/meminfo which only includes 3 lines of > Memfree, Cached and Slab, for example: > MemFree: 6327176 kB > Cached: 741916 kB > Slab: 77284 kB > > I added several trace point to the begin of several init hooks > At cmdline hooks I'm adding trace of "1+:mem 1+:iomem 3+:slab" > For other hooks I'm adding trace of "1:shortmem 2+:mem 3+:slab" > > This means: > rd.memdebug=1) > cmdline hook: print mem and iomem > other hooks: print shortmem > rd.memdebug=2) > cmdline hook: print mem and iomem > other hooks: print mem > rd.memdebug=3): > cmdline hook: print mem iomem, and slabinfo > other hooks: print mem and slabinfo > *): > do not print any mem debug info > > [v1->v2]: update to use getargnum with <minval> as argument > print iomem info at cmdline hook as well > > Signed-off-by: Dave Young <dyoung-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> > --- > dracut.cmdline.7.asc | 4 + > modules.d/98systemd/dracut-cmdline.sh | 1 > modules.d/98systemd/dracut-initqueue.sh | 1 > modules.d/98systemd/dracut-pre-pivot.sh | 1 > modules.d/98systemd/dracut-pre-trigger.sh | 1 > modules.d/98systemd/dracut-pre-udev.sh | 1 > modules.d/99base/dracut-lib.sh | 90 ++++++++++++++++++++++++++++++ > 7 files changed, 99 insertions(+) > > --- dracut.orig/modules.d/98systemd/dracut-cmdline.sh > +++ dracut/modules.d/98systemd/dracut-cmdline.sh > @@ -18,6 +18,7 @@ type getarg >/dev/null 2>&1 || . /lib/dr > > 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 > --- dracut.orig/modules.d/98systemd/dracut-initqueue.sh > +++ dracut/modules.d/98systemd/dracut-initqueue.sh > @@ -10,6 +10,7 @@ type getarg >/dev/null 2>&1 || . /lib/dr > > 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=') > --- dracut.orig/modules.d/98systemd/dracut-pre-pivot.sh > +++ dracut/modules.d/98systemd/dracut-pre-pivot.sh > @@ -10,6 +10,7 @@ type getarg >/dev/null 2>&1 || . /lib/dr > > 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" > --- dracut.orig/modules.d/98systemd/dracut-pre-trigger.sh > +++ dracut/modules.d/98systemd/dracut-pre-trigger.sh > @@ -10,6 +10,7 @@ type getarg >/dev/null 2>&1 || . /lib/dr > > 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" > --- dracut.orig/modules.d/98systemd/dracut-pre-udev.sh > +++ dracut/modules.d/98systemd/dracut-pre-udev.sh > @@ -9,6 +9,7 @@ type getarg >/dev/null 2>&1 || . /lib/dr > > 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" > --- dracut.orig/dracut.cmdline.7.asc > +++ dracut/dracut.cmdline.7.asc > @@ -134,6 +134,10 @@ Debug > set -x for the dracut shell and logs to dmesg, console and > _/run/initramfs/init.log_ > > +**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 > > --- dracut.orig/modules.d/99base/dracut-lib.sh > +++ dracut/modules.d/99base/dracut-lib.sh > @@ -998,3 +998,93 @@ 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]... > +function make_trace_mem() > +{ > + msg=$1 > + shift > + if [ "$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]... > +function make_trace() > +{ > + func=$1 > + shift > + > + log_level=`echo "$1" | grep -o '^[0-9]\+'` > + shift > + > + prefix=$1 > + shift > + > + msg=$1 > + shift > + > + if [ -z "$log_level" ]; then > + return > + fi > + > + msg=`echo "$msg" | sed 's/^\s\+//'` > + > + msg_printed=0 > + while [ $# -gt 0 ]; do > + trace_level=`echo "$1" | grep -o '^[0-9]\+'` > + trace_in_higher_levels=`echo "$1" | grep -o '+'` > + trace=`echo $1 | sed "s/^.*://"` > + > + 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 > +} > -- > To unsubscribe from this list: send the line "unsubscribe initramfs" in > the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- Thanks Dave ^ permalink raw reply [flat|nested] 7+ messages in thread
[parent not found: <50EFD5D8.1070508-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>]
* Re: [PATCH 2/2 v2] Add memory usage trace to diffrent hook points [not found] ` <50EFD5D8.1070508-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> @ 2013-01-11 10:00 ` Harald Hoyer [not found] ` <50EFE2AC.7020704-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> 0 siblings, 1 reply; 7+ messages in thread From: Harald Hoyer @ 2013-01-11 10:00 UTC (permalink / raw) To: Dave Young Cc: Vivek Goyal, initramfs-u79uwXL29TY76Z2rM5mHXA, jstancek-H+wXaHxf7aLQT0dZR+AlfA Am 11.01.2013 10:05, schrieb Dave Young: > > Hello harald > > What's your opinion about this patch? Could you take a look at it? >> --- dracut.orig/modules.d/99base/dracut-lib.sh >> +++ dracut/modules.d/99base/dracut-lib.sh >> @@ -998,3 +998,93 @@ 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]... >> +function make_trace_mem() >> +{ >> + msg=$1 >> + shift >> + if [ "$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]... >> +function make_trace() >> +{ >> + func=$1 >> + shift >> + >> + log_level=`echo "$1" | grep -o '^[0-9]\+'` * use $() instead of `` * grep is overkill use simple shell functions There are in modules.d/99base/dracut-lib.sh strstr() str_starts() str_ends() * or use "case" case "$1" in [0-9]*) log_level=$1;; esac >> + shift >> + >> + prefix=$1 >> + shift >> + >> + msg=$1 >> + shift >> + >> + if [ -z "$log_level" ]; then >> + return >> + fi >> + >> + msg=`echo "$msg" | sed 's/^\s\+//'` sed is overkill for this. Use ${var%%...} ${var%...} ${var#...} ${var##...} $ msg="foo+bar baz" $ echo ${msg#*+} bar baz >> + >> + msg_printed=0 >> + while [ $# -gt 0 ]; do >> + trace_level=`echo "$1" | grep -o '^[0-9]\+'` >> + trace_in_higher_levels=`echo "$1" | grep -o '+'` >> + trace=`echo $1 | sed "s/^.*://"` same same ^ permalink raw reply [flat|nested] 7+ messages in thread
[parent not found: <50EFE2AC.7020704-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>]
* Re: [PATCH 2/2 v2] Add memory usage trace to diffrent hook points [not found] ` <50EFE2AC.7020704-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> @ 2013-01-14 8:59 ` Dave Young 0 siblings, 0 replies; 7+ messages in thread From: Dave Young @ 2013-01-14 8:59 UTC (permalink / raw) To: Harald Hoyer Cc: Vivek Goyal, initramfs-u79uwXL29TY76Z2rM5mHXA, jstancek-H+wXaHxf7aLQT0dZR+AlfA On 01/11/2013 06:00 PM, Harald Hoyer wrote: > Am 11.01.2013 10:05, schrieb Dave Young: >> >> Hello harald >> >> What's your opinion about this patch? Could you take a look at it? >>> --- dracut.orig/modules.d/99base/dracut-lib.sh >>> +++ dracut/modules.d/99base/dracut-lib.sh >>> @@ -998,3 +998,93 @@ 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]... >>> +function make_trace_mem() >>> +{ >>> + msg=$1 >>> + shift >>> + if [ "$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]... >>> +function make_trace() >>> +{ >>> + func=$1 >>> + shift >>> + >>> + log_level=`echo "$1" | grep -o '^[0-9]\+'` > > * use $() instead of `` Will do > > > * grep is overkill use simple shell functions > > There are in modules.d/99base/dracut-lib.sh > strstr() > str_starts() > str_ends() > > * or use "case" > > case "$1" in > [0-9]*) log_level=$1;; > esac Will do > >>> + shift >>> + >>> + prefix=$1 >>> + shift >>> + >>> + msg=$1 >>> + shift >>> + >>> + if [ -z "$log_level" ]; then >>> + return >>> + fi >>> + >>> + msg=`echo "$msg" | sed 's/^\s\+//'` > > sed is overkill for this. Use > ${var%%...} > ${var%...} > ${var#...} > ${var##...} > > $ msg="foo+bar baz" > $ echo ${msg#*+} > bar baz > Will do > >>> + >>> + msg_printed=0 >>> + while [ $# -gt 0 ]; do >>> + trace_level=`echo "$1" | grep -o '^[0-9]\+'` >>> + trace_in_higher_levels=`echo "$1" | grep -o '+'` >>> + trace=`echo $1 | sed "s/^.*://"` > > same same > Will do -- Thanks Dave ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2013-01-14 8:59 UTC | newest] Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2012-11-26 2:38 [PATCH 2/2] Add memory usage trace to diffrent hook points Dave Young [not found] ` <20121126023852.GA6886-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org> 2012-11-27 22:33 ` Vivek Goyal [not found] ` <20121127223330.GG6964-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> 2012-11-28 5:53 ` Dave Young 2012-11-28 8:45 ` [PATCH 2/2 v2] " Dave Young [not found] ` <50B5CF24.6090006-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> 2013-01-11 9:05 ` Dave Young [not found] ` <50EFD5D8.1070508-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> 2013-01-11 10:00 ` Harald Hoyer [not found] ` <50EFE2AC.7020704-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> 2013-01-14 8:59 ` Dave Young
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.