Release 4.7 drivers/watchdog/softdog.c
/*
* SoftDog: A Software Watchdog Device
*
* (c) Copyright 1996 Alan Cox <alan@lxorguk.ukuu.org.uk>,
* All Rights Reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
*
* Neither Alan Cox nor CymruNet Ltd. admit liability nor provide
* warranty for any of this software. This material is provided
* "AS-IS" and at no charge.
*
* (c) Copyright 1995 Alan Cox <alan@lxorguk.ukuu.org.uk>
*
* Software only watchdog driver. Unlike its big brother the WDT501P
* driver this won't always recover a failed machine.
*
* 03/96: Angelo Haritsis <ah@doc.ic.ac.uk> :
* Modularised.
* Added soft_margin; use upon insmod to change the timer delay.
* NB: uses same minor as wdt (WATCHDOG_MINOR); we could use separate
* minors.
*
* 19980911 Alan Cox
* Made SMP safe for 2.3.x
*
* 20011127 Joel Becker (jlbec@evilplan.org>
* Added soft_noboot; Allows testing the softdog trigger without
* requiring a recompile.
* Added WDIOC_GETTIMEOUT and WDIOC_SETTIMOUT.
*
* 20020530 Joel Becker <joel.becker@oracle.com>
* Added Matt Domsch's nowayout module option.
*/
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/types.h>
#include <linux/timer.h>
#include <linux/watchdog.h>
#include <linux/reboot.h>
#include <linux/init.h>
#include <linux/jiffies.h>
#include <linux/kernel.h>
#define TIMER_MARGIN 60
/* Default is 60 seconds */
static unsigned int soft_margin = TIMER_MARGIN;
/* in seconds */
module_param(soft_margin, uint, 0);
MODULE_PARM_DESC(soft_margin,
"Watchdog soft_margin in seconds. (0 < soft_margin < 65536, default="
__MODULE_STRING(TIMER_MARGIN) ")");
static bool nowayout = WATCHDOG_NOWAYOUT;
module_param(nowayout, bool, 0);
MODULE_PARM_DESC(nowayout,
"Watchdog cannot be stopped once started (default="
__MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
static int soft_noboot;
module_param(soft_noboot, int, 0);
MODULE_PARM_DESC(soft_noboot,
"Softdog action, set to 1 to ignore reboots, 0 to reboot (default=0)");
static int soft_panic;
module_param(soft_panic, int, 0);
MODULE_PARM_DESC(soft_panic,
"Softdog action, set to 1 to panic, 0 to reboot (default=0)");
/*
* Our timer
*/
static void watchdog_fire(unsigned long);
static struct timer_list watchdog_ticktock =
TIMER_INITIALIZER(watchdog_fire, 0, 0);
/*
* If the timer expires..
*/
static void watchdog_fire(unsigned long data)
{
module_put(THIS_MODULE);
if (soft_noboot)
pr_crit("Triggered - Reboot ignored\n");
else if (soft_panic) {
pr_crit("Initiating panic\n");
panic("Software Watchdog Timer expired");
} else {
pr_crit("Initiating system reboot\n");
emergency_restart();
pr_crit("Reboot didn't ?????\n");
}
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
pre-git | pre-git | 15 | 26.32% | 3 | 30.00% |
anithra p janakiraman | anithra p janakiraman | 13 | 22.81% | 1 | 10.00% |
joe perches | joe perches | 12 | 21.05% | 1 | 10.00% |
dave jones | dave jones | 6 | 10.53% | 1 | 10.00% |
li rongqing | li rongqing | 5 | 8.77% | 1 | 10.00% |
wim van sebroeck | wim van sebroeck | 4 | 7.02% | 1 | 10.00% |
andrew morton | andrew morton | 1 | 1.75% | 1 | 10.00% |
eric w. biederman | eric w. biederman | 1 | 1.75% | 1 | 10.00% |
| Total | 57 | 100.00% | 10 | 100.00% |
/*
* Softdog operations
*/
static int softdog_ping(struct watchdog_device *w)
{
if (!mod_timer(&watchdog_ticktock, jiffies+(w->timeout*HZ)))
__module_get(THIS_MODULE);
return 0;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
wim van sebroeck | wim van sebroeck | 19 | 50.00% | 1 | 20.00% |
li rongqing | li rongqing | 8 | 21.05% | 1 | 20.00% |
alan cox | alan cox | 8 | 21.05% | 1 | 20.00% |
pre-git | pre-git | 2 | 5.26% | 1 | 20.00% |
dave jones | dave jones | 1 | 2.63% | 1 | 20.00% |
| Total | 38 | 100.00% | 5 | 100.00% |
static int softdog_stop(struct watchdog_device *w)
{
if (del_timer(&watchdog_ticktock))
module_put(THIS_MODULE);
return 0;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
wim van sebroeck | wim van sebroeck | 16 | 59.26% | 1 | 33.33% |
li rongqing | li rongqing | 7 | 25.93% | 1 | 33.33% |
alan cox | alan cox | 4 | 14.81% | 1 | 33.33% |
| Total | 27 | 100.00% | 3 | 100.00% |
static int softdog_set_timeout(struct watchdog_device *w, unsigned int t)
{
w->timeout = t;
return 0;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
pre-git | pre-git | 15 | 62.50% | 3 | 60.00% |
alan cox | alan cox | 8 | 33.33% | 1 | 20.00% |
dave jones | dave jones | 1 | 4.17% | 1 | 20.00% |
| Total | 24 | 100.00% | 5 | 100.00% |
/*
* Kernel Interfaces
*/
static struct watchdog_info softdog_info = {
.identity = "Software Watchdog",
.options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE,
};
static struct watchdog_ops softdog_ops = {
.owner = THIS_MODULE,
.start = softdog_ping,
.stop = softdog_stop,
.set_timeout = softdog_set_timeout,
};
static struct watchdog_device softdog_dev = {
.info = &softdog_info,
.ops = &softdog_ops,
.min_timeout = 1,
.max_timeout = 0xFFFF
};
static int __init watchdog_init(void)
{
int ret;
/* Check that the soft_margin value is within it's range;
if not reset to the default */
if (soft_margin < 1 || soft_margin > 65535) {
pr_info("soft_margin must be 0 < soft_margin < 65536, using %d\n",
TIMER_MARGIN);
return -EINVAL;
}
softdog_dev.timeout = soft_margin;
watchdog_set_nowayout(&softdog_dev, nowayout);
watchdog_stop_on_reboot(&softdog_dev);
ret = watchdog_register_device(&softdog_dev);
if (ret)
return ret;
pr_info("Software Watchdog Timer: 0.08 initialized. soft_noboot=%d soft_margin=%d sec soft_panic=%d (nowayout=%d)\n",
soft_noboot, soft_margin, soft_panic, nowayout);
return 0;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
pre-git | pre-git | 33 | 37.93% | 4 | 36.36% |
alan cox | alan cox | 29 | 33.33% | 2 | 18.18% |
wim van sebroeck | wim van sebroeck | 14 | 16.09% | 1 | 9.09% |
joe perches | joe perches | 5 | 5.75% | 1 | 9.09% |
dave jones | dave jones | 2 | 2.30% | 1 | 9.09% |
anithra p janakiraman | anithra p janakiraman | 2 | 2.30% | 1 | 9.09% |
damien riegel | damien riegel | 2 | 2.30% | 1 | 9.09% |
| Total | 87 | 100.00% | 11 | 100.00% |
static void __exit watchdog_exit(void)
{
watchdog_unregister_device(&softdog_dev);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
pre-git | pre-git | 13 | 86.67% | 3 | 75.00% |
alan cox | alan cox | 2 | 13.33% | 1 | 25.00% |
| Total | 15 | 100.00% | 4 | 100.00% |
module_init(watchdog_init);
module_exit(watchdog_exit);
MODULE_AUTHOR("Alan Cox");
MODULE_DESCRIPTION("Software Watchdog Device Driver");
MODULE_LICENSE("GPL");
Overall Contributors
| Person | Tokens | Prop | Commits | CommitProp |
pre-git | pre-git | 148 | 28.91% | 12 | 37.50% |
wim van sebroeck | wim van sebroeck | 114 | 22.27% | 4 | 12.50% |
alan cox | alan cox | 104 | 20.31% | 2 | 6.25% |
anithra p janakiraman | anithra p janakiraman | 36 | 7.03% | 1 | 3.12% |
dave jones | dave jones | 28 | 5.47% | 3 | 9.38% |
joe perches | joe perches | 24 | 4.69% | 1 | 3.12% |
li rongqing | li rongqing | 20 | 3.91% | 1 | 3.12% |
andrew morton | andrew morton | 19 | 3.71% | 3 | 9.38% |
art haas | art haas | 12 | 2.34% | 1 | 3.12% |
tim schmielau | tim schmielau | 3 | 0.59% | 1 | 3.12% |
damien riegel | damien riegel | 2 | 0.39% | 1 | 3.12% |
eric w. biederman | eric w. biederman | 1 | 0.20% | 1 | 3.12% |
andrey panin | andrey panin | 1 | 0.20% | 1 | 3.12% |
| Total | 512 | 100.00% | 32 | 100.00% |
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.