Hi Dave,

On Tue, Jul 24, 2018 at 10:55 AM Dave Young <dyoung@redhat.com> wrote:
Hi Kairui,
On 07/20/18 at 12:02am, Kairui Song wrote:
> Currently, we only rebuilt kdump initramfs on config file change,
> fs change, or watchdog related change. This will not cover the case
> that hardware changed but fs layout and other configurations still
> stays the same, and kdump may fail.
>
> To cover such case, we can detect and compare loaded kernel modules,
> if a hardware change requires the image to be rebuilt, loaded kernel
> modules must have changed.
>
> Starting from commit 7047294 dracut will record loaded kernel modules

Not sure if this commit has been merged in Fedora branch of dracut, if
not this will not work
 Indeed, I forget to check, maybe we can wait for next dracut release then submit this patch.

> when the image is built if hostonly mode is enabled.  With this patch,
> kdumpctl will compare the recorded value with currently loaded kernel
> modules, and rebuild the image on change.
>
> Signed-off-by: Kairui Song <kasong@redhat.com>
> ---
>  kdumpctl | 28 ++++++++++++++++++++++++++++
>  1 file changed, 28 insertions(+)
>
> diff --git a/kdumpctl b/kdumpctl
> index 13b8209..12289fa 100755
> --- a/kdumpctl
> +++ b/kdumpctl
> @@ -458,6 +458,29 @@ check_wdt_modified()
>       return 1
>  }

> +check_kmodules_modified()
> +{
> +     # always sort again to avoid LANG/LC inconsistent problem
> +     local _old_modules="$(lsinitrd $TARGET_INITRD -f /usr/lib/dracut/loaded-kernel-modules.txt | sort)"

Seems you missed the comment about lsinitrd.  Can you add a new patch
for getting all the files in one callback of lsinitrd?

lsinitrd is using too much time and cause kdumpctl start slowly.
OK, in my test it only increased the loading time for about 0.2s, but if the file is missing it may take 1s to finish, will update. 

> +     local _new_modules="$(get_loaded_kernel_modules | sort)"

I saw your function get_loaded_kernel_modules already sorted the module
list, so do we need another |sort?

> +
> +     local _added_modules=$(comm -13 <(echo "$_old_modules") <(echo "$_new_modules"))
> +     local _dropped_modules=$(comm -23 <(echo "$_old_modules") <(echo "$_new_modules"))
> +
> +     if [ "$_old_modules" != "$_new_modules" ]; then
> +             echo "Detected change(s) of loaded kernel modules list:"
> +             [[ -n $_added_modules ]] && for _module in $_added_modules; do
> +                     echo "  +$_module"
> +             done
> +             [[ -n $_dropped_modules ]] && for _module in $_dropped_modules; do
> +                     echo "  -$_module"
> +             done
> +             return 1
> +     fi

Can the above chunk only be run when we are under some debug mode?

OK, I'll make them debug message, will give a hint on module change, only print the detail with debug mode. 
> +
> +     return 0
> +}
> +
>  # returns 0 if system is not modified
>  # returns 1 if system is modified
>  # returns 2 if system modification is invalid
> @@ -485,6 +508,11 @@ check_system_modified()
>               return 1
>       fi

> +     check_kmodules_modified
> +     if [ $? -ne 0 ]; then
> +             return 1
> +     fi
> +
>       return 0
>  }

> --
> 2.17.1
> _______________________________________________
> kexec mailing list -- kexec@lists.fedoraproject.org
> To unsubscribe send an email to kexec-leave@lists.fedoraproject.org
> Fedora Code of Conduct: https://getfedora.org/code-of-conduct.html
> List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
> List Archives: https://lists.fedoraproject.org/archives/list/kexec@lists.fedoraproject.org/message/MPIA5YIJMA6YYBUQCRNZF2AYK676AFK2/

Thanks
Dave


--
Best Regards,
Kairui Song