On 2016/11/10 at 10:45, Dave Young wrote: > On 11/09/16 at 06:34pm, Xunlei Pang wrote: >> On 2016/11/09 at 16:33, Dave Young wrote: >>> Hi, Xunlei >>> On 11/07/16 at 01:34pm, Xunlei Pang wrote: >>>> 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@xxxxxxxxxx> >>>> --- >>>> modules.d/98dracut-systemd/dracut-cmdline.sh | 2 +- >>>> modules.d/98dracut-systemd/dracut-pre-mount.sh | 2 +- >>>> modules.d/98dracut-systemd/dracut-pre-pivot.sh | 3 ++- >>>> modules.d/98dracut-systemd/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/98dracut-systemd/dracut-cmdline.sh b/modules.d/98dracut-systemd/dracut-cmdline.sh >>>> index 6c6ee02..bff9435 100755 >>>> --- a/modules.d/98dracut-systemd/dracut-cmdline.sh >>>> +++ b/modules.d/98dracut-systemd/dracut-cmdline.sh >>>> @@ -42,7 +42,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/98dracut-systemd/dracut-pre-mount.sh b/modules.d/98dracut-systemd/dracut-pre-mount.sh >>>> index ae51128..a3b9d29 100755 >>>> --- a/modules.d/98dracut-systemd/dracut-pre-mount.sh >>>> +++ b/modules.d/98dracut-systemd/dracut-pre-mount.sh >>>> @@ -8,7 +8,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/98dracut-systemd/dracut-pre-pivot.sh b/modules.d/98dracut-systemd/dracut-pre-pivot.sh >>>> index cc70e3c..dc9a250 100755 >>>> --- a/modules.d/98dracut-systemd/dracut-pre-pivot.sh >>>> +++ b/modules.d/98dracut-systemd/dracut-pre-pivot.sh >>>> @@ -8,12 +8,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/98dracut-systemd/dracut-pre-trigger.sh b/modules.d/98dracut-systemd/dracut-pre-trigger.sh >>>> index ac1ec36..7cd821e 100755 >>>> --- a/modules.d/98dracut-systemd/dracut-pre-trigger.sh >>>> +++ b/modules.d/98dracut-systemd/dracut-pre-trigger.sh >>>> @@ -8,7 +8,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 060b3fe..2a29bbc 100755 >>>> --- a/modules.d/99base/dracut-lib.sh >>>> +++ b/modules.d/99base/dracut-lib.sh >>>> @@ -1206,12 +1206,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 >>> It does not work if out of tree modules add it to DEBUG_MEM_LEVEL < >>> 4, sounds bad to hard code it. It seems good to do the cleanup without >>> the check. >> Hi Dave, >> >> I can't understand why out of tree modules would do this, however we can't >> guarantee that even after removing the hard code condition. Let's say, out of >> tree modules use it at the very beginning and disable it quite after pre-pivot >> with no "rd.memdebug", then the trace will be disabled at pre-pivot which will >> cause confusion(or unnoticed data loss) for the out of tree modules. > It should be a corner case, but use a fixed DEBUG_MEM_LEVEL sounds > still not good, we designed the DEBUG_MEM_LEVEL but the design does not > limit each facility to force connect to one of the levels. Hi Dave, Maybe I didn't quite catch what you meant. The current implementation only uses level 4 for komem using '4+:komem', do you mean some out of tree module adds something like: make_trace_mem '2+: komem'? If so, it contradicts the "rd.memdebug" manpage described in PATCH3/3. > > But I have no strong opinion, I can live with it.. > >>> There is another concern, if someone manually enables tracing in kernel >>> cmdline then we should not cleanup, maybe we can print a warning msg >>> and do not do our tracing at all. >>> >>> For cleanup and prepare ideally we can do something like make_trace_mem, >>> like prepare_trace_mem and cleanup_trace_mem, for each facility if there >>> is a prepare/cleanup function then call it. But for the time being it >>> may not worth to add the complexity. What do you think? >> Because the script does cleanup iff is_trace_ready() returns true when >> both tracing is on and the events match, I think it is safe enough that >> we don't need to worry about the wrong cleanup if we really want to do this: >> is_trace_ready() { >> local trace_base want_events current_events >> >> trace_base=$(get_trace_base) >> ! [[ -f "$trace_base/tracing/trace" ]] && return 1 >> >> [[ $(cat $trace_base/tracing/tracing_on) = 0 ]] && return 1 >> >> # Also check if trace events were properly setup. >> want_events=$(get_want_events) >> current_events=$(echo $(cat $trace_base/tracing/set_event)) >> [[ "$current_events" != "$want_events" ]] && return 1 >> >> return 0 >> } > Dracut is used more in normal boot than kdump, if one enabled trace in > grub and the events happen to be same, but we disabled it user will be > not happy. Yes, as long as they don't specify "rd.memdebug=4", the current implementation isn't problematic. If people use "rd.memdebug=4", they should be aware what they are doing to trace, also enabling the same events (module_load, module_put and alloc_pages) only is rare. Regards, Xunlei > >> Regards, >> Xunlei >> >>>> + tracekomem --cleanup >>>> + fi >>>> +} >>>> + >>>> # parameters: msg [trace_level:trace]... >>>> make_trace_mem() >>>> { >>>> @@ -1296,6 +1304,9 @@ show_memstats() >>>> iomem) >>>> cat /proc/iomem >>>> ;; >>>> + komem) >>>> + tracekomem >>>> + ;; >>>> esac >>>> } >>>> >>>> diff --git a/modules.d/99base/init.sh b/modules.d/99base/init.sh >>>> index a563393..e4f7cff 100755 >>>> --- a/modules.d/99base/init.sh >>>> +++ b/modules.d/99base/init.sh >>>> @@ -131,7 +131,7 @@ if ! getargbool 1 'rd.hostonly'; 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 >>>> >>>> @@ -160,7 +160,7 @@ fi >>>> >>>> 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 >>>> >>>> @@ -230,7 +230,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 >>>> >>>> @@ -266,11 +266,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 b03772e..a1569b1 100755 >>>> --- a/modules.d/99base/module-setup.sh >>>> +++ b/modules.d/99base/module-setup.sh >>>> @@ -35,6 +35,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 >>>> -- >>>> 1.8.3.1 >>>> >>>> -- >>>> To unsubscribe from this list: send the line "unsubscribe initramfs" in >>>> the body of a message to majordomo@xxxxxxxxxxxxxxx >>>> More majordomo info at http://vger.kernel.org/majordomo-info.html >>> Thanks >>> Dave >>> -- >>> To unsubscribe from this list: send the line "unsubscribe initramfs" in >>> the body of a message to majordomo@xxxxxxxxxxxxxxx >>> More majordomo info at http://vger.kernel.org/majordomo-info.html > Thanks > Dave > -- > To unsubscribe from this list: send the line "unsubscribe initramfs" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe initramfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html