| // SPDX-License-Identifier: GPL-2.0 |
| /* |
| * Copyright 2026 Google LLC |
| */ |
| |
| #include <linux/kernel.h> |
| #include <linux/module.h> |
| #include <linux/nmi.h> |
| #include <linux/watchdog.h> |
| |
| #include "watchdog_pretimeout.h" |
| |
| /** |
| * pretimeout_dump - Dump on watchdog pretimeout event |
| * @wdd: watchdog_device |
| * |
| * Dump all cpu backtrace on pretimeout event. |
| */ |
| static void pretimeout_dump(struct watchdog_device *wdd) |
| { |
| pr_alert("watchdog%d: pretimeout event\n", wdd->id); |
| if (!trigger_all_cpu_backtrace()) |
| pr_alert("trigger_all_cpu_backtrace() isn't available\n"); |
| } |
| |
| static struct watchdog_governor watchdog_gov_dump = { |
| .name = "dump", |
| .pretimeout = pretimeout_dump, |
| }; |
| |
| static int __init watchdog_gov_dump_register(void) |
| { |
| return watchdog_register_governor(&watchdog_gov_dump); |
| } |
| |
| static void __exit watchdog_gov_dump_unregister(void) |
| { |
| watchdog_unregister_governor(&watchdog_gov_dump); |
| } |
| module_init(watchdog_gov_dump_register); |
| module_exit(watchdog_gov_dump_unregister); |
| |
| MODULE_AUTHOR("Tzung-Bi Shih <tzungbi@kernel.org>"); |
| MODULE_DESCRIPTION("Dump watchdog pretimeout governor"); |
| MODULE_LICENSE("GPL"); |