|
@@ -768,6 +768,65 @@ out:
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * /proc/sys/kernel/watchdog
|
|
|
+ */
|
|
|
+int proc_watchdog(struct ctl_table *table, int write,
|
|
|
+ void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
+{
|
|
|
+ return proc_watchdog_common(NMI_WATCHDOG_ENABLED|SOFT_WATCHDOG_ENABLED,
|
|
|
+ table, write, buffer, lenp, ppos);
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * /proc/sys/kernel/nmi_watchdog
|
|
|
+ */
|
|
|
+int proc_nmi_watchdog(struct ctl_table *table, int write,
|
|
|
+ void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
+{
|
|
|
+ return proc_watchdog_common(NMI_WATCHDOG_ENABLED,
|
|
|
+ table, write, buffer, lenp, ppos);
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * /proc/sys/kernel/soft_watchdog
|
|
|
+ */
|
|
|
+int proc_soft_watchdog(struct ctl_table *table, int write,
|
|
|
+ void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
+{
|
|
|
+ return proc_watchdog_common(SOFT_WATCHDOG_ENABLED,
|
|
|
+ table, write, buffer, lenp, ppos);
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * /proc/sys/kernel/watchdog_thresh
|
|
|
+ */
|
|
|
+int proc_watchdog_thresh(struct ctl_table *table, int write,
|
|
|
+ void __user *buffer, size_t *lenp, loff_t *ppos)
|
|
|
+{
|
|
|
+ int err, old;
|
|
|
+
|
|
|
+ mutex_lock(&watchdog_proc_mutex);
|
|
|
+
|
|
|
+ old = ACCESS_ONCE(watchdog_thresh);
|
|
|
+ err = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
|
|
|
+
|
|
|
+ if (err || !write)
|
|
|
+ goto out;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Update the sample period.
|
|
|
+ * Restore 'watchdog_thresh' on failure.
|
|
|
+ */
|
|
|
+ set_sample_period();
|
|
|
+ err = proc_watchdog_update();
|
|
|
+ if (err)
|
|
|
+ watchdog_thresh = old;
|
|
|
+out:
|
|
|
+ mutex_unlock(&watchdog_proc_mutex);
|
|
|
+ return err;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* proc handler for /proc/sys/kernel/nmi_watchdog,watchdog_thresh
|
|
|
*/
|