Re: [PATCH v2 2/3] 99base: apply kernel module memory debug support

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [Linux Kernel]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux SCSI]

  Powered by Linux