Hi Harald, Thanks for your feedback. On 07/03/2016:02:49:08 PM, Harald Hoyer wrote: > On 02.03.2016 13:06, Pratyush Anand wrote: > > Recently following patches have been added in upstream Linux kernel, which > > (1) fixes parent of watchdog_device so that > > /sys/class/watchdog/watchdogn/device is populated. (2) adds some sysfs > > device attributes so that different watchdog status can be read. > > > > http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=6551881c86c791237a3bebf11eb3bd70b60ea782 > > http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=906d7a5cfeda508e7361f021605579a00cd82815 > > http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=33b711269ade3f6bc9d9d15e4343e6fa922d999b > > > > With the above support, now we can find out whether a watchdog is active or > > not. We can also find out the driver/module responsible for that watchdog > > device. > > > > Proposed patch uses above support and then adds module of active watchdog > > in initramfs generated by dracut. > > > > It is reasonable to always add kernel watchdog module if dracut watchdog > > module has been added. When an user does not want to add kernel module, > > then he/she should exclude complete dracut watchdog module with --omit. > > > > Testing: > > -- When watchdog is active watchdog modules were added > > # cat /sys/class/watchdog/watchdog0/identity > > iTCO_wdt > > # cat /sys/class/watchdog/watchdog0/state > > active > > # dracut initramfs-test.img -a watchdog > > # lsinitrd initramfs-test.img | grep iTCO > > -rw-r--r-- 1 root root 9100 Feb 24 09:19 usr/lib/modules/.../kernel/drivers/watchdog/iTCO_vendor_support.ko > > -rw-r--r-- 1 root root 19252 Feb 24 09:19 usr/lib/modules/.../kernel/drivers/watchdog/iTCO_wdt.ko > > # lsinitrd -f tmp/active-watchdogs initramfs-test.img > > iTCO_wdt > > > > -- When watchdog is inactive then watchdog modules were not added > > # cat /sys/class/watchdog/watchdog0/state > > inactive > > # dracut initramfs-test.img -a watchdog > > # lsinitrd initramfs-test.img | grep iTCO > > # lsinitrd -f tmp/active-watchdogs initramfs-test.img > > > > Signed-off-by: Pratyush Anand <panand@xxxxxxxxxx> > > Cc: Dave Young <dyoung@xxxxxxxxxx> > > Cc: Don Zickus <dzickus@xxxxxxxxxx> > > Cc: Harald Hoyer <harald@xxxxxxxxxx> > > --- > > modules.d/04watchdog/module-setup.sh | 33 +++++++++++++++++++++++++++++++++ > > 1 file changed, 33 insertions(+) > > > > diff --git a/modules.d/04watchdog/module-setup.sh b/modules.d/04watchdog/module-setup.sh > > index 7ec757aec032..6232afb0d9ca 100755 > > --- a/modules.d/04watchdog/module-setup.sh > > +++ b/modules.d/04watchdog/module-setup.sh > > @@ -32,3 +32,36 @@ install() { > > inst_multiple -o wdctl > > } > > > > +installkernel() { > > + cd /sys/class/watchdog > > + for dir in */; do > > + cd $dir > > + active=`[ -f state ] && cat state` > > + if [ "$active" = "active" ]; then > > + # applications like kdump need to know that, which > > + # watchdog modules have been added into initramfs > > + echo `cat identity` >> "$initdir/tmp/active-watchdogs" > > + # device/modalias will return driver of this device > > + wdtdrv=`cat device/modalias` > > + # There can be more than one module represented by same > > + # modalias. Currently load all of them. > > + # TODO: Need to find a way to avoid any unwanted module > > + # represented by modalias > > + wdtdrv=`modprobe -R $wdtdrv | tr "\n" "," | sed 's/.$//'` > > + instmods $wdtdrv > > + # however in some cases, we also need to check that if > > + # there is a specific driver for the parent bus/device. > > + # In such cases we also need to enable driver for parent > > + # bus/device. > > + wdtppath="device/.."; > > + while [ -f "$wdtppath/modalias" ] > > + do > > + wdtpdrv=`cat $wdtppath/modalias` > > + wdtpdrv=`modprobe -R $wdtpdrv | tr "\n" "," | sed 's/.$//'` > > + instmods $wdtpdrv > > + wdtppath="$wdtppath/.." > > + done > > + fi > > + cd .. > > + done > > +} > > > > > This part should only matter/execute in the "hostonly" case. Please use $() I had changed it in V3. In V3, for hostonly we add modules for active watchdogs and for no-hostonly for all watchdog present. Please let me know if you see any issue with that. > instead of backticks. $() can be nested. > > $(cat file) can be expressed as $(< file) > > you have to catch the case: > a) there is no /sys/class/watchdog > b) there is no subdir in /sys/class/watchdog > > cd $dir and cd .. is not ideal > you might want to use subshells with () or use pushd/popd > > > something like this: > > installkernel() { > [[ $hostonly ]] || return > for dir in /sys/class/watchdog/*; do > [[ -d "$dir" ]] || continue > [[ -f "$dir/state" ]] || continue > active=$(< "$dir/state") > [[ "$active" == "active" ]] || continue > ( > cd $dir > echo $(< identity) >> "$initdir/tmp/active-watchdogs" > […] > # no need for "cd .." > ) > } > > Also I don't know, if the ".." method works for the wdtppath with the symlinks. > You might want: > wdtppath=$(readlink -f device/..) > instead of: > wdtppath="device/.." > Agreeing to all of the above suggestions. > > why do you use tr "\n" "," | sed 's/.$//' to construct the instmods string? In some cases there could be an alias representing more than one module like as follows # modprobe -R pci:v00008086d000024D0sv00000000sd00000000bc06sc01i00 intel_rng lpc_ich In such cases, we need to convert the above output of `modprobe -R` into the format like intel_rng,lpc_ich, so that we can ask instmods to install all of them. ~Pratyush -- 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