QMP: Introduce WATCHDOG event
It's emitted whenever the watchdog device's timer expires. The action taken is provided in the 'data' member. Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
2d753894c7
commit
9eedeb3b88
|
@ -169,3 +169,22 @@ Example:
|
||||||
"client": { "family": "ipv4", "service": "46089",
|
"client": { "family": "ipv4", "service": "46089",
|
||||||
"host": "127.0.0.1", "sasl_username": "luiz" } },
|
"host": "127.0.0.1", "sasl_username": "luiz" } },
|
||||||
"timestamp": { "seconds": 1263475302, "microseconds": 150772 } }
|
"timestamp": { "seconds": 1263475302, "microseconds": 150772 } }
|
||||||
|
|
||||||
|
WATCHDOG
|
||||||
|
--------
|
||||||
|
|
||||||
|
Emitted when the watchdog device's timer is expired.
|
||||||
|
|
||||||
|
Data:
|
||||||
|
|
||||||
|
- "action": Action that has been taken, it's one of the following (json-string):
|
||||||
|
"reset", "shutdown", "poweroff", "pause", "debug", or "none"
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
{ "event": "WATCHDOG",
|
||||||
|
"data": { "action": "reset" },
|
||||||
|
"timestamp": { "seconds": 1267061043, "microseconds": 959568 } }
|
||||||
|
|
||||||
|
Note: If action is "reset", "shutdown", or "pause" the WATCHDOG event is
|
||||||
|
followed respectively by the RESET, SHUTDOWN, or STOP events.
|
||||||
|
|
|
@ -23,6 +23,8 @@
|
||||||
#include "qemu-option.h"
|
#include "qemu-option.h"
|
||||||
#include "qemu-config.h"
|
#include "qemu-config.h"
|
||||||
#include "qemu-queue.h"
|
#include "qemu-queue.h"
|
||||||
|
#include "qemu-objects.h"
|
||||||
|
#include "monitor.h"
|
||||||
#include "sysemu.h"
|
#include "sysemu.h"
|
||||||
#include "hw/watchdog.h"
|
#include "hw/watchdog.h"
|
||||||
|
|
||||||
|
@ -98,6 +100,15 @@ int select_watchdog_action(const char *p)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void watchdog_mon_event(const char *action)
|
||||||
|
{
|
||||||
|
QObject *data;
|
||||||
|
|
||||||
|
data = qobject_from_jsonf("{ 'action': %s }", action);
|
||||||
|
monitor_protocol_event(QEVENT_WATCHDOG, data);
|
||||||
|
qobject_decref(data);
|
||||||
|
}
|
||||||
|
|
||||||
/* This actually performs the "action" once a watchdog has expired,
|
/* This actually performs the "action" once a watchdog has expired,
|
||||||
* ie. reboot, shutdown, exit, etc.
|
* ie. reboot, shutdown, exit, etc.
|
||||||
*/
|
*/
|
||||||
|
@ -105,26 +116,32 @@ void watchdog_perform_action(void)
|
||||||
{
|
{
|
||||||
switch(watchdog_action) {
|
switch(watchdog_action) {
|
||||||
case WDT_RESET: /* same as 'system_reset' in monitor */
|
case WDT_RESET: /* same as 'system_reset' in monitor */
|
||||||
|
watchdog_mon_event("reset");
|
||||||
qemu_system_reset_request();
|
qemu_system_reset_request();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WDT_SHUTDOWN: /* same as 'system_powerdown' in monitor */
|
case WDT_SHUTDOWN: /* same as 'system_powerdown' in monitor */
|
||||||
|
watchdog_mon_event("shutdown");
|
||||||
qemu_system_powerdown_request();
|
qemu_system_powerdown_request();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WDT_POWEROFF: /* same as 'quit' command in monitor */
|
case WDT_POWEROFF: /* same as 'quit' command in monitor */
|
||||||
|
watchdog_mon_event("poweroff");
|
||||||
exit(0);
|
exit(0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WDT_PAUSE: /* same as 'stop' command in monitor */
|
case WDT_PAUSE: /* same as 'stop' command in monitor */
|
||||||
|
watchdog_mon_event("pause");
|
||||||
vm_stop(0);
|
vm_stop(0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WDT_DEBUG:
|
case WDT_DEBUG:
|
||||||
|
watchdog_mon_event("debug");
|
||||||
fprintf(stderr, "watchdog: timer fired\n");
|
fprintf(stderr, "watchdog: timer fired\n");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WDT_NONE:
|
case WDT_NONE:
|
||||||
|
watchdog_mon_event("none");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -426,6 +426,9 @@ void monitor_protocol_event(MonitorEvent event, QObject *data)
|
||||||
case QEVENT_RTC_CHANGE:
|
case QEVENT_RTC_CHANGE:
|
||||||
event_name = "RTC_CHANGE";
|
event_name = "RTC_CHANGE";
|
||||||
break;
|
break;
|
||||||
|
case QEVENT_WATCHDOG:
|
||||||
|
event_name = "WATCHDOG";
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
abort();
|
abort();
|
||||||
break;
|
break;
|
||||||
|
|
Reference in New Issue