watchdog.h: Drop local redefinition of actions enum

We already have enum that enumerates all the actions that a
watchdog can take when hitting its timeout: WatchdogAction.
Use that instead of inventing our own.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Message-Id: <ce2790634e6a1b3b6cf90462399d17bad83f0290.1504771369.git.mprivozn@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Daniel P. Berrange <berrange@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
Michal Privoznik 2017-09-07 10:05:25 +02:00 committed by Markus Armbruster
parent 14d53b4f4a
commit 4c7f4426c4
3 changed files with 25 additions and 38 deletions

View File

@ -30,7 +30,7 @@
#include "hw/nmi.h" #include "hw/nmi.h"
#include "qemu/help_option.h" #include "qemu/help_option.h"
static int watchdog_action = WDT_RESET; static WatchdogAction watchdog_action = WATCHDOG_ACTION_RESET;
static QLIST_HEAD(watchdog_list, WatchdogTimerModel) watchdog_list; static QLIST_HEAD(watchdog_list, WatchdogTimerModel) watchdog_list;
void watchdog_add_model(WatchdogTimerModel *model) void watchdog_add_model(WatchdogTimerModel *model)
@ -77,27 +77,19 @@ int select_watchdog(const char *p)
int select_watchdog_action(const char *p) int select_watchdog_action(const char *p)
{ {
if (strcasecmp(p, "reset") == 0) int action;
watchdog_action = WDT_RESET; char *qapi_value;
else if (strcasecmp(p, "shutdown") == 0)
watchdog_action = WDT_SHUTDOWN;
else if (strcasecmp(p, "poweroff") == 0)
watchdog_action = WDT_POWEROFF;
else if (strcasecmp(p, "pause") == 0)
watchdog_action = WDT_PAUSE;
else if (strcasecmp(p, "debug") == 0)
watchdog_action = WDT_DEBUG;
else if (strcasecmp(p, "none") == 0)
watchdog_action = WDT_NONE;
else if (strcasecmp(p, "inject-nmi") == 0)
watchdog_action = WDT_NMI;
else
return -1;
qapi_value = g_ascii_strdown(p, -1);
action = qapi_enum_parse(&WatchdogAction_lookup, qapi_value, -1, NULL);
g_free(qapi_value);
if (action < 0)
return -1;
watchdog_action = action;
return 0; return 0;
} }
int get_watchdog_action(void) WatchdogAction get_watchdog_action(void)
{ {
return watchdog_action; return watchdog_action;
} }
@ -108,21 +100,21 @@ int get_watchdog_action(void)
void watchdog_perform_action(void) void watchdog_perform_action(void)
{ {
switch (watchdog_action) { switch (watchdog_action) {
case WDT_RESET: /* same as 'system_reset' in monitor */ case WATCHDOG_ACTION_RESET: /* same as 'system_reset' in monitor */
qapi_event_send_watchdog(WATCHDOG_ACTION_RESET, &error_abort); qapi_event_send_watchdog(WATCHDOG_ACTION_RESET, &error_abort);
qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET); qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET);
break; break;
case WDT_SHUTDOWN: /* same as 'system_powerdown' in monitor */ case WATCHDOG_ACTION_SHUTDOWN: /* same as 'system_powerdown' in monitor */
qapi_event_send_watchdog(WATCHDOG_ACTION_SHUTDOWN, &error_abort); qapi_event_send_watchdog(WATCHDOG_ACTION_SHUTDOWN, &error_abort);
qemu_system_powerdown_request(); qemu_system_powerdown_request();
break; break;
case WDT_POWEROFF: /* same as 'quit' command in monitor */ case WATCHDOG_ACTION_POWEROFF: /* same as 'quit' command in monitor */
qapi_event_send_watchdog(WATCHDOG_ACTION_POWEROFF, &error_abort); qapi_event_send_watchdog(WATCHDOG_ACTION_POWEROFF, &error_abort);
exit(0); exit(0);
case WDT_PAUSE: /* same as 'stop' command in monitor */ case WATCHDOG_ACTION_PAUSE: /* same as 'stop' command in monitor */
/* In a timer callback, when vm_stop calls qemu_clock_enable /* In a timer callback, when vm_stop calls qemu_clock_enable
* you would get a deadlock. Bypass the problem. * you would get a deadlock. Bypass the problem.
*/ */
@ -131,19 +123,22 @@ void watchdog_perform_action(void)
qemu_system_vmstop_request(RUN_STATE_WATCHDOG); qemu_system_vmstop_request(RUN_STATE_WATCHDOG);
break; break;
case WDT_DEBUG: case WATCHDOG_ACTION_DEBUG:
qapi_event_send_watchdog(WATCHDOG_ACTION_DEBUG, &error_abort); qapi_event_send_watchdog(WATCHDOG_ACTION_DEBUG, &error_abort);
fprintf(stderr, "watchdog: timer fired\n"); fprintf(stderr, "watchdog: timer fired\n");
break; break;
case WDT_NONE: case WATCHDOG_ACTION_NONE:
qapi_event_send_watchdog(WATCHDOG_ACTION_NONE, &error_abort); qapi_event_send_watchdog(WATCHDOG_ACTION_NONE, &error_abort);
break; break;
case WDT_NMI: case WATCHDOG_ACTION_INJECT_NMI:
qapi_event_send_watchdog(WATCHDOG_ACTION_INJECT_NMI, qapi_event_send_watchdog(WATCHDOG_ACTION_INJECT_NMI,
&error_abort); &error_abort);
nmi_monitor_handle(0, NULL); nmi_monitor_handle(0, NULL);
break; break;
default:
assert(0);
} }
} }

View File

@ -57,9 +57,9 @@ static void diag288_timer_expired(void *dev)
* the BQL; reset before triggering the action to avoid races with * the BQL; reset before triggering the action to avoid races with
* diag288 instructions. */ * diag288 instructions. */
switch (get_watchdog_action()) { switch (get_watchdog_action()) {
case WDT_DEBUG: case WATCHDOG_ACTION_DEBUG:
case WDT_NONE: case WATCHDOG_ACTION_NONE:
case WDT_PAUSE: case WATCHDOG_ACTION_PAUSE:
break; break;
default: default:
wdt_diag288_reset(dev); wdt_diag288_reset(dev);

View File

@ -23,15 +23,7 @@
#define QEMU_WATCHDOG_H #define QEMU_WATCHDOG_H
#include "qemu/queue.h" #include "qemu/queue.h"
#include "qapi-types.h"
/* Possible values for action parameter. */
#define WDT_RESET 1 /* Hard reset. */
#define WDT_SHUTDOWN 2 /* Shutdown. */
#define WDT_POWEROFF 3 /* Quit. */
#define WDT_PAUSE 4 /* Pause. */
#define WDT_DEBUG 5 /* Prints a message and continues running. */
#define WDT_NONE 6 /* Do nothing. */
#define WDT_NMI 7 /* Inject nmi into the guest. */
struct WatchdogTimerModel { struct WatchdogTimerModel {
QLIST_ENTRY(WatchdogTimerModel) entry; QLIST_ENTRY(WatchdogTimerModel) entry;
@ -46,7 +38,7 @@ typedef struct WatchdogTimerModel WatchdogTimerModel;
/* in hw/watchdog.c */ /* in hw/watchdog.c */
int select_watchdog(const char *p); int select_watchdog(const char *p);
int select_watchdog_action(const char *action); int select_watchdog_action(const char *action);
int get_watchdog_action(void); WatchdogAction get_watchdog_action(void);
void watchdog_add_model(WatchdogTimerModel *model); void watchdog_add_model(WatchdogTimerModel *model);
void watchdog_perform_action(void); void watchdog_perform_action(void);