From owner-svn-src-stable@FreeBSD.ORG Sun May 15 01:08:51 2011 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 91A65106566C; Sun, 15 May 2011 01:08:51 +0000 (UTC) (envelope-from attilio@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 7DE0A8FC08; Sun, 15 May 2011 01:08:51 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p4F18pEG021640; Sun, 15 May 2011 01:08:51 GMT (envelope-from attilio@svn.freebsd.org) Received: (from attilio@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p4F18pnU021626; Sun, 15 May 2011 01:08:51 GMT (envelope-from attilio@svn.freebsd.org) Message-Id: <201105150108.p4F18pnU021626@svn.freebsd.org> From: Attilio Rao Date: Sun, 15 May 2011 01:08:51 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r221939 - in stable/8/sys: amd64/amd64 arm/arm ddb dev/watchdog i386/i386 ia64/ia64 kern mips/mips powerpc/powerpc sys x86/x86 X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 15 May 2011 01:08:51 -0000 Author: attilio Date: Sun May 15 01:08:51 2011 New Revision: 221939 URL: http://svn.freebsd.org/changeset/base/221939 Log: MFC r221121,221173: - Add the possibility to reuse the already last used timeout when patting the watchdog, via the watchdog(9) interface. - Add the possibility to pat the watchdogs installed via the watchdog(9) interface from the kernel. - 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. - Add the watchdogs patting during the (shutdown time) disk syncing and disk dumping. Sponsored by: Sandvine Incorporated Modified: stable/8/sys/amd64/amd64/minidump_machdep.c stable/8/sys/arm/arm/dump_machdep.c stable/8/sys/arm/arm/minidump_machdep.c stable/8/sys/ddb/db_command.c stable/8/sys/dev/watchdog/watchdog.c stable/8/sys/i386/i386/minidump_machdep.c stable/8/sys/ia64/ia64/dump_machdep.c stable/8/sys/kern/kern_shutdown.c stable/8/sys/kern/vfs_subr.c stable/8/sys/mips/mips/dump_machdep.c stable/8/sys/powerpc/powerpc/dump_machdep.c stable/8/sys/sys/watchdog.h stable/8/sys/x86/x86/dump_machdep.c Directory Properties: stable/8/sys/ (props changed) stable/8/sys/amd64/include/xen/ (props changed) stable/8/sys/cddl/contrib/opensolaris/ (props changed) stable/8/sys/contrib/dev/acpica/ (props changed) stable/8/sys/contrib/pf/ (props changed) Modified: stable/8/sys/amd64/amd64/minidump_machdep.c ============================================================================== --- stable/8/sys/amd64/amd64/minidump_machdep.c Sun May 15 01:01:53 2011 (r221938) +++ stable/8/sys/amd64/amd64/minidump_machdep.c Sun May 15 01:08:51 2011 (r221939) @@ -27,6 +27,8 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_watchdog.h" + #include #include #include @@ -34,6 +36,9 @@ __FBSDID("$FreeBSD$"); #include #include #include +#ifdef SW_WATCHDOG +#include +#endif #include #include #include @@ -135,6 +140,9 @@ blk_write(struct dumperinfo *di, char *p printf(" %ld", PG2MB(progress >> PAGE_SHIFT)); counter &= (1<<24) - 1; } +#ifdef SW_WATCHDOG + wdog_kern_pat(WD_LASTVAL); +#endif if (ptr) { error = dump_write(di, ptr, 0, dumplo, len); if (error) Modified: stable/8/sys/arm/arm/dump_machdep.c ============================================================================== --- stable/8/sys/arm/arm/dump_machdep.c Sun May 15 01:01:53 2011 (r221938) +++ stable/8/sys/arm/arm/dump_machdep.c Sun May 15 01:08:51 2011 (r221939) @@ -27,6 +27,8 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_watchdog.h" + #include #include #include @@ -35,6 +37,9 @@ __FBSDID("$FreeBSD$"); #include #include #include +#ifdef SW_WATCHDOG +#include +#endif #include #include #include @@ -189,6 +194,9 @@ cb_dumpdata(struct md_pa *mdp, int seqnr cpu_tlb_flushID_SE(0); cpu_cpwait(); } +#ifdef SW_WATCHDOG + wdog_kern_pat(WD_LASTVAL); +#endif error = dump_write(di, (void *)(pa - (pa & L1_ADDR_BITS)),0, dumplo, sz); if (error) Modified: stable/8/sys/arm/arm/minidump_machdep.c ============================================================================== --- stable/8/sys/arm/arm/minidump_machdep.c Sun May 15 01:01:53 2011 (r221938) +++ stable/8/sys/arm/arm/minidump_machdep.c Sun May 15 01:08:51 2011 (r221939) @@ -29,6 +29,8 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_watchdog.h" + #include #include #include @@ -36,6 +38,9 @@ __FBSDID("$FreeBSD$"); #include #include #include +#ifdef SW_WATCHDOG +#include +#endif #include #include #include @@ -138,6 +143,9 @@ blk_write(struct dumperinfo *di, char *p counter &= (1<<22) - 1; } +#ifdef SW_WATCHDOG + wdog_kern_pat(WD_LASTVAL); +#endif if (ptr) { error = dump_write(di, ptr, 0, dumplo, len); if (error) Modified: stable/8/sys/ddb/db_command.c ============================================================================== --- stable/8/sys/ddb/db_command.c Sun May 15 01:01:53 2011 (r221938) +++ stable/8/sys/ddb/db_command.c Sun May 15 01:08:51 2011 (r221939) @@ -724,14 +724,6 @@ db_watchdog(dummy1, dummy2, dummy3, dumm } else if ((tout & WD_INTERVAL) == WD_TO_NEVER) { db_error("Out of range watchdog interval\n"); return; - } else { - - /* - * XXX: Right now we only support WD_ACTIVE, in the future we - * may be possibly needing a more convoluted function for - * dealing with different cases. - */ - tout |= WD_ACTIVE; } EVENTHANDLER_INVOKE(watchdog_list, tout, &i); } Modified: stable/8/sys/dev/watchdog/watchdog.c ============================================================================== --- stable/8/sys/dev/watchdog/watchdog.c Sun May 15 01:01:53 2011 (r221938) +++ stable/8/sys/dev/watchdog/watchdog.c Sun May 15 01:08:51 2011 (r221939) @@ -40,35 +40,73 @@ __FBSDID("$FreeBSD$"); #include static struct cdev *wd_dev; +static volatile u_int wd_last_u; + +static int +kern_do_pat(u_int utim) +{ + int error; + + if ((utim & WD_LASTVAL) != 0 && (utim & WD_INTERVAL) > 0) + return (EINVAL); + + if ((utim & WD_LASTVAL) != 0) { + MPASS((wd_last_u & ~WD_INTERVAL) == 0); + utim &= ~WD_LASTVAL; + utim |= wd_last_u; + } else + wd_last_u = (utim & WD_INTERVAL); + if ((utim & WD_INTERVAL) == WD_TO_NEVER) { + utim = 0; + + /* Assume all is well; watchdog signals failure. */ + error = 0; + } else { + /* Assume no watchdog available; watchdog flags success */ + error = EOPNOTSUPP; + } + EVENTHANDLER_INVOKE(watchdog_list, utim, &error); + return (error); +} static int wd_ioctl(struct cdev *dev __unused, u_long cmd, caddr_t data, int flags __unused, struct thread *td) { - int error; u_int u; if (cmd != WDIOCPATPAT) return (ENOIOCTL); u = *(u_int *)data; - if (u & ~(WD_ACTIVE | WD_PASSIVE | WD_INTERVAL)) + if (u & ~(WD_ACTIVE | WD_PASSIVE | WD_LASTVAL | WD_INTERVAL)) return (EINVAL); if ((u & (WD_ACTIVE | WD_PASSIVE)) == (WD_ACTIVE | WD_PASSIVE)) return (EINVAL); - if ((u & (WD_ACTIVE | WD_PASSIVE)) == 0 && (u & WD_INTERVAL) > 0) + if ((u & (WD_ACTIVE | WD_PASSIVE)) == 0 && ((u & WD_INTERVAL) > 0 || + (u & WD_LASTVAL) != 0)) return (EINVAL); if (u & WD_PASSIVE) return (ENOSYS); /* XXX Not implemented yet */ - if ((u & WD_INTERVAL) == WD_TO_NEVER) { - u = 0; - /* Assume all is well; watchdog signals failure. */ - error = 0; - } else { - /* Assume no watchdog available; watchdog flags success */ - error = EOPNOTSUPP; - } - EVENTHANDLER_INVOKE(watchdog_list, u, &error); - return (error); + u &= ~(WD_ACTIVE | WD_PASSIVE); + + return (kern_do_pat(u)); +} + +u_int +wdog_kern_last_timeout(void) +{ + + return (wd_last_u); +} + +int +wdog_kern_pat(u_int utim) +{ + + if (utim & ~(WD_LASTVAL | WD_INTERVAL)) + return (EINVAL); + + return (kern_do_pat(utim)); } static struct cdevsw wd_cdevsw = { Modified: stable/8/sys/i386/i386/minidump_machdep.c ============================================================================== --- stable/8/sys/i386/i386/minidump_machdep.c Sun May 15 01:01:53 2011 (r221938) +++ stable/8/sys/i386/i386/minidump_machdep.c Sun May 15 01:08:51 2011 (r221939) @@ -27,6 +27,8 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_watchdog.h" + #include #include #include @@ -34,6 +36,9 @@ __FBSDID("$FreeBSD$"); #include #include #include +#ifdef SW_WATCHDOG +#include +#endif #include #include #include @@ -138,6 +143,9 @@ blk_write(struct dumperinfo *di, char *p printf(" %lld", PG2MB(progress >> PAGE_SHIFT)); counter &= (1<<24) - 1; } +#ifdef SW_WATCHDOG + wdog_kern_pat(WD_LASTVAL); +#endif if (ptr) { error = dump_write(di, ptr, 0, dumplo, len); if (error) Modified: stable/8/sys/ia64/ia64/dump_machdep.c ============================================================================== --- stable/8/sys/ia64/ia64/dump_machdep.c Sun May 15 01:01:53 2011 (r221938) +++ stable/8/sys/ia64/ia64/dump_machdep.c Sun May 15 01:08:51 2011 (r221939) @@ -27,12 +27,17 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_watchdog.h" + #include #include #include #include #include #include +#ifdef SW_WATCHDOG +#include +#endif #include #include #include @@ -125,6 +130,9 @@ cb_dumpdata(struct efi_md *mdp, int seqn printf("%c\b", "|/-\\"[twiddle++ & 3]); counter &= (1<<24) - 1; } +#ifdef SW_WATCHDOG + wdog_kern_pat(WD_LASTVAL); +#endif error = dump_write(di, (void*)pa, 0, dumplo, sz); if (error) break; Modified: stable/8/sys/kern/kern_shutdown.c ============================================================================== --- stable/8/sys/kern/kern_shutdown.c Sun May 15 01:01:53 2011 (r221938) +++ stable/8/sys/kern/kern_shutdown.c Sun May 15 01:08:51 2011 (r221939) @@ -42,6 +42,7 @@ __FBSDID("$FreeBSD$"); #include "opt_panic.h" #include "opt_show_busybufs.h" #include "opt_sched.h" +#include "opt_watchdog.h" #include #include @@ -65,6 +66,9 @@ __FBSDID("$FreeBSD$"); #include #include #include +#ifdef SW_WATCHDOG +#include +#endif #include @@ -311,6 +315,9 @@ boot(int howto) waittime = 0; +#ifdef SW_WATCHDOG + wdog_kern_pat(WD_LASTVAL); +#endif sync(curthread, NULL); /* @@ -336,6 +343,9 @@ boot(int howto) if (nbusy < pbusy) iter = 0; pbusy = nbusy; +#ifdef SW_WATCHDOG + wdog_kern_pat(WD_LASTVAL); +#endif sync(curthread, NULL); #ifdef PREEMPTION Modified: stable/8/sys/kern/vfs_subr.c ============================================================================== --- stable/8/sys/kern/vfs_subr.c Sun May 15 01:01:53 2011 (r221938) +++ stable/8/sys/kern/vfs_subr.c Sun May 15 01:08:51 2011 (r221939) @@ -42,6 +42,7 @@ __FBSDID("$FreeBSD$"); #include "opt_ddb.h" +#include "opt_watchdog.h" #include #include @@ -72,6 +73,9 @@ __FBSDID("$FreeBSD$"); #include #include #include +#ifdef SW_WATCHDOG +#include +#endif #include @@ -1842,6 +1846,10 @@ sched_sync(void) LIST_INSERT_HEAD(next, bo, bo_synclist); continue; } +#ifdef SW_WATCHDOG + if (first_printf == 0) + wdog_kern_pat(WD_LASTVAL); +#endif } if (!LIST_EMPTY(gslp)) { mtx_unlock(&sync_mtx); Modified: stable/8/sys/mips/mips/dump_machdep.c ============================================================================== --- stable/8/sys/mips/mips/dump_machdep.c Sun May 15 01:01:53 2011 (r221938) +++ stable/8/sys/mips/mips/dump_machdep.c Sun May 15 01:08:51 2011 (r221939) @@ -27,6 +27,8 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_watchdog.h" + #include #include #include @@ -35,6 +37,9 @@ __FBSDID("$FreeBSD$"); #include #include #include +#ifdef SW_WATCHDOG +#include +#endif #include #include #include @@ -182,6 +187,9 @@ cb_dumpdata(struct md_pa *mdp, int seqnr counter &= (1<<24) - 1; } +#ifdef SW_WATCHDOG + wdog_kern_path(WD_LASTVAL); +#endif error = dump_write(di, (void *)(pa),0, dumplo, sz); if (error) break; Modified: stable/8/sys/powerpc/powerpc/dump_machdep.c ============================================================================== --- stable/8/sys/powerpc/powerpc/dump_machdep.c Sun May 15 01:01:53 2011 (r221938) +++ stable/8/sys/powerpc/powerpc/dump_machdep.c Sun May 15 01:08:51 2011 (r221939) @@ -27,6 +27,8 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_watchdog.h" + #include #include #include @@ -34,6 +36,9 @@ __FBSDID("$FreeBSD$"); #include #include #include +#ifdef SW_WATCHDOG +#include +#endif #include #include #include @@ -129,6 +134,9 @@ cb_dumpdata(struct pmap_md *md, int seqn printf("%c\b", "|/-\\"[twiddle++ & 3]); counter &= (1<<24) - 1; } +#ifdef SW_WATCHDOG + wdog_kern_pat(WD_LASTVAL); +#endif error = di->dumper(di->priv, (void*)va, 0, dumplo, sz); pmap_dumpsys_unmap(md, ofs, va); if (error) Modified: stable/8/sys/sys/watchdog.h ============================================================================== --- stable/8/sys/sys/watchdog.h Sun May 15 01:01:53 2011 (r221938) +++ stable/8/sys/sys/watchdog.h Sun May 15 01:08:51 2011 (r221939) @@ -50,6 +50,12 @@ * 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. @@ -78,6 +84,9 @@ 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 */ Modified: stable/8/sys/x86/x86/dump_machdep.c ============================================================================== --- stable/8/sys/x86/x86/dump_machdep.c Sun May 15 01:01:53 2011 (r221938) +++ stable/8/sys/x86/x86/dump_machdep.c Sun May 15 01:08:51 2011 (r221939) @@ -27,6 +27,8 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_watchdog.h" + #include #include #include @@ -34,6 +36,9 @@ __FBSDID("$FreeBSD$"); #include #include #include +#ifdef SW_WATCHDOG +#include +#endif #include #include #include @@ -193,6 +198,9 @@ cb_dumpdata(struct md_pa *mdp, int seqnr a = pa + i * PAGE_SIZE; va = pmap_kenter_temporary(trunc_page(a), i); } +#ifdef SW_WATCHDOG + wdog_kern_pat(WD_LASTVAL); +#endif error = dump_write(di, va, 0, dumplo, sz); if (error) break;