Commit 99eaf09c authored by Wenchao Xia's avatar Wenchao Xia Committed by Luiz Capitulino
Browse files

qapi event: convert WATCHDOG

parent e010ad8f
Loading
Loading
Loading
Loading
+0 −19
Original line number Diff line number Diff line
@@ -425,22 +425,3 @@ Example:
        "client": { "family": "ipv4", "service": "46089",
                    "host": "127.0.0.1", "sasl_username": "luiz" } },
        "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.
+7 −16
Original line number Diff line number Diff line
@@ -24,9 +24,9 @@
#include "qemu/config-file.h"
#include "qemu/queue.h"
#include "qapi/qmp/types.h"
#include "monitor/monitor.h"
#include "sysemu/sysemu.h"
#include "sysemu/watchdog.h"
#include "qapi-event.h"

/* Possible values for action parameter. */
#define WDT_RESET        1	/* Hard reset. */
@@ -101,15 +101,6 @@ int select_watchdog_action(const char *p)
    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,
 * ie. reboot, shutdown, exit, etc.
 */
@@ -117,31 +108,31 @@ void watchdog_perform_action(void)
{
    switch(watchdog_action) {
    case WDT_RESET:             /* same as 'system_reset' in monitor */
        watchdog_mon_event("reset");
        qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_RESET, &error_abort);
        qemu_system_reset_request();
        break;

    case WDT_SHUTDOWN:          /* same as 'system_powerdown' in monitor */
        watchdog_mon_event("shutdown");
        qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_SHUTDOWN, &error_abort);
        qemu_system_powerdown_request();
        break;

    case WDT_POWEROFF:          /* same as 'quit' command in monitor */
        watchdog_mon_event("poweroff");
        qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_POWEROFF, &error_abort);
        exit(0);

    case WDT_PAUSE:             /* same as 'stop' command in monitor */
        watchdog_mon_event("pause");
        qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_PAUSE, &error_abort);
        vm_stop(RUN_STATE_WATCHDOG);
        break;

    case WDT_DEBUG:
        watchdog_mon_event("debug");
        qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_DEBUG, &error_abort);
        fprintf(stderr, "watchdog: timer fired\n");
        break;

    case WDT_NONE:
        watchdog_mon_event("none");
        qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_NONE, &error_abort);
        break;
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -616,6 +616,7 @@ static void monitor_qapi_event_init(void)
{
    /* Limit guest-triggerable events to 1 per second */
    monitor_qapi_event_throttle(QAPI_EVENT_RTC_CHANGE, 1000);
    monitor_qapi_event_throttle(QAPI_EVENT_WATCHDOG, 1000);

    qmp_event_set_func_emit(monitor_qapi_event_queue);
}
@@ -744,7 +745,6 @@ static void monitor_protocol_event_init(void)
{
    /* Limit RTC & BALLOON events to 1 per second */
    monitor_protocol_event_throttle(QEVENT_BALLOON_CHANGE, 1000);
    monitor_protocol_event_throttle(QEVENT_WATCHDOG, 1000);
    /* limit the rate of quorum events to avoid hammering the management */
    monitor_protocol_event_throttle(QEVENT_QUORUM_REPORT_BAD, 1000);
    monitor_protocol_event_throttle(QEVENT_QUORUM_FAILURE, 1000);
+15 −0
Original line number Diff line number Diff line
@@ -91,3 +91,18 @@
##
{ 'event': 'RTC_CHANGE',
  'data': { 'offset': 'int' } }

##
# @WATCHDOG
#
# Emitted when the watchdog device's timer is expired
#
# @action: action that has been taken
#
# Note: If action is "reset", "shutdown", or "pause" the WATCHDOG event is
# followed respectively by the RESET, SHUTDOWN, or STOP events
#
# Since: 0.13.0
##
{ 'event': 'WATCHDOG',
  'data': { 'action': 'WatchdogExpirationAction' } }
+24 −0
Original line number Diff line number Diff line
@@ -3347,4 +3347,28 @@
##
{ 'command': 'query-acpi-ospm-status', 'returns': ['ACPIOSTInfo'] }

##
# @WatchdogExpirationAction
#
# An enumeration of the actions taken when the watchdog device's timer is
# expired
#
# @reset: system resets
#
# @shutdown: system shutdown, note that it is similar to @powerdown, which
#            tries to set to system status and notify guest
#
# @poweroff: system poweroff, the emulator program exits
#
# @pause: system pauses, similar to @stop
#
# @debug: system enters debug state
#
# @none: nothing is done
#
# Since: 2.1
##
{ 'enum': 'WatchdogExpirationAction',
  'data': [ 'reset', 'shutdown', 'poweroff', 'pause', 'debug', 'none' ] }

{ 'include': 'qapi-event.json' }