27b63ddca0
the watchdog, via the watchdog(9) interface. For that, the WD_LASTVAL bitwise operation is used. It is mutually exclusive with any explicit timout passing to the watchdogs. The last timeout can be returned via the wdog_kern_last_timeout() KPI. - Add the possibility to pat the watchdogs installed via the watchdog(9) interface from the kernel. In order to do that the new KPI wdog_kern_pat() is offered and it does accept normalized nanoseconds or WD_LASTVAL. - Avoid to pass WD_ACTIVE down in the watchdog handlers. All the control bit processing should over to the upper layer functions and not passed down to the handlers at all. These changes are intended to be used in order to fix up the watchdog tripping in situation when the userland is busted, but protection is still wanted (examples: shutdown syncing / disk dumping). Sponsored by: Sandvine Incorporated Reviewed by: emaste, des, cognet MFC after: 2 weeks
93 lines
2.9 KiB
C
93 lines
2.9 KiB
C
/*-
|
|
* Copyright (c) 2003 Poul-Henning Kamp
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
* SUCH DAMAGE.
|
|
*
|
|
* $FreeBSD$
|
|
*/
|
|
#ifndef _SYS_WATCHDOG_H
|
|
#define _SYS_WATCHDOG_H
|
|
|
|
#include <sys/ioccom.h>
|
|
|
|
#define _PATH_WATCHDOG "fido"
|
|
|
|
#define WDIOCPATPAT _IOW('W', 42, u_int)
|
|
|
|
#define WD_ACTIVE 0x8000000
|
|
/*
|
|
* Watchdog reset, timeout set to value in WD_INTERVAL field.
|
|
* The kernel will arm the watchdog and unless the userland
|
|
* program calls WDIOCPATPAT again before the timer expires
|
|
* the system will reinitialize.
|
|
*/
|
|
|
|
#define WD_PASSIVE 0x0400000
|
|
/*
|
|
* Set the watchdog in passive mode.
|
|
* The kernel will chose an appropriate timeout duration and
|
|
* periodically reset the timer provided everything looks all
|
|
* right to the kernel.
|
|
*/
|
|
|
|
#define WD_LASTVAL 0x0200000
|
|
/*
|
|
* Use the already last used timeout value.
|
|
* The kernel will use as timeout the last valid timeout provided.
|
|
*/
|
|
|
|
#define WD_INTERVAL 0x00000ff
|
|
/*
|
|
* Mask for duration bits.
|
|
* The watchdog will have a nominal patience of 2^N * nanoseconds.
|
|
* Example: N == 30 gives a patience of 2^30 nanoseconds ~= 1 second.
|
|
* NB: Expect variance in the +/- 10-20% range.
|
|
*/
|
|
|
|
/* Handy macros for humans not used to power of two nanoseconds */
|
|
#define WD_TO_NEVER 0
|
|
#define WD_TO_1MS 20
|
|
#define WD_TO_125MS 27
|
|
#define WD_TO_250MS 28
|
|
#define WD_TO_500MS 29
|
|
#define WD_TO_1SEC 30
|
|
#define WD_TO_2SEC 31
|
|
#define WD_TO_4SEC 32
|
|
#define WD_TO_8SEC 33
|
|
#define WD_TO_16SEC 34
|
|
#define WD_TO_32SEC 35
|
|
|
|
#ifdef _KERNEL
|
|
|
|
#include <sys/eventhandler.h>
|
|
|
|
typedef void (*watchdog_fn)(void *, u_int, int *);
|
|
|
|
EVENTHANDLER_DECLARE(watchdog_list, watchdog_fn);
|
|
|
|
u_int wdog_kern_last_timeout(void);
|
|
int wdog_kern_pat(u_int utim);
|
|
#endif
|
|
|
|
#endif /* _SYS_WATCHDOG_H */
|