summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormpi <mpi@openbsd.org>2017-01-09 17:21:42 +0000
committermpi <mpi@openbsd.org>2017-01-09 17:21:42 +0000
commit47ded3d0b20f2f65a1b84a914fdec73347eacbf9 (patch)
treec54a7206d98d0cb3d5b018c3ea40e367793bc891
parentGrab the NET_LOCK() in various callbacks. (diff)
downloadwireguard-openbsd-47ded3d0b20f2f65a1b84a914fdec73347eacbf9.tar.xz
wireguard-openbsd-47ded3d0b20f2f65a1b84a914fdec73347eacbf9.zip
Stop and restart the watchdog timer when entering and leaving ddb(4).
From Christian Ludwig.
-rw-r--r--sys/ddb/db_interface.h6
-rw-r--r--sys/ddb/db_trap.c4
-rw-r--r--sys/kern/kern_watchdog.c24
3 files changed, 31 insertions, 3 deletions
diff --git a/sys/ddb/db_interface.h b/sys/ddb/db_interface.h
index 77602d2cc98..36d80b8a867 100644
--- a/sys/ddb/db_interface.h
+++ b/sys/ddb/db_interface.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: db_interface.h,v 1.17 2016/01/15 11:21:58 dlg Exp $ */
+/* $OpenBSD: db_interface.h,v 1.18 2017/01/09 17:21:42 mpi Exp $ */
/* $NetBSD: db_interface.h,v 1.1 1996/02/05 01:57:03 christos Exp $ */
/*
@@ -45,6 +45,10 @@ void db_show_all_procs(db_expr_t, int, db_expr_t, char *);
/* kern/kern_timeout.c */
void db_show_callout(db_expr_t, int, db_expr_t, char *);
+/* kern/kern_watchdog.c */
+void db_wdog_disable(void);
+void db_wdog_enable(void);
+
struct mount;
/* kern/vfs_subr.c */
diff --git a/sys/ddb/db_trap.c b/sys/ddb/db_trap.c
index 85e5c8a754b..e03ba8acbc5 100644
--- a/sys/ddb/db_trap.c
+++ b/sys/ddb/db_trap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: db_trap.c,v 1.26 2016/09/02 12:17:33 tb Exp $ */
+/* $OpenBSD: db_trap.c,v 1.27 2017/01/09 17:21:42 mpi Exp $ */
/* $NetBSD: db_trap.c,v 1.9 1996/02/05 01:57:18 christos Exp $ */
/*
@@ -53,6 +53,7 @@ db_trap(int type, int code)
boolean_t watchpt;
db_is_active = 1;
+ db_wdog_disable();
bkpt = IS_BREAKPOINT_TRAP(type, code);
watchpt = IS_WATCHPOINT_TRAP(type, code);
@@ -94,5 +95,6 @@ db_trap(int type, int code)
}
db_restart_at_pc(&ddb_regs, watchpt);
+ db_wdog_enable();
db_is_active = 0;
}
diff --git a/sys/kern/kern_watchdog.c b/sys/kern/kern_watchdog.c
index 5c27b17bb4e..48dd7d09e2f 100644
--- a/sys/kern/kern_watchdog.c
+++ b/sys/kern/kern_watchdog.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_watchdog.c,v 1.11 2014/12/10 12:27:57 mikeb Exp $ */
+/* $OpenBSD: kern_watchdog.c,v 1.12 2017/01/09 17:21:42 mpi Exp $ */
/*
* Copyright (c) 2003 Markus Friedl. All rights reserved.
@@ -106,3 +106,25 @@ sysctl_wdog(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp,
return (error);
}
+
+#ifdef DDB
+void
+db_wdog_disable(void)
+{
+ if (wdog_ctl_cb == NULL || wdog_period == 0)
+ return;
+
+ timeout_del(&wdog_timeout);
+ (void) (*wdog_ctl_cb)(wdog_ctl_cb_arg, 0);
+}
+
+void
+db_wdog_enable(void)
+{
+ if (wdog_ctl_cb == NULL || wdog_period == 0)
+ return;
+
+ (void) (*wdog_ctl_cb)(wdog_ctl_cb_arg, wdog_period);
+ timeout_add(&wdog_timeout, wdog_period * hz / 2);
+}
+#endif