QAPI patches for 2017-10-02

-----BEGIN PGP SIGNATURE-----
 
 iQIcBAABAgAGBQJZ0h5sAAoJEDhwtADrkYZTsSUP+QHtxqAxYEkN+5WwBV8AvXDO
 zzTsvfsxcI06wDTtor3sY5RpkOogL5cPLQQCwG0lbAJBXu1IQeRkHpsO9hW++Bhk
 rzdGiUP2Rb+x29Ex3pPxS+iAPftyTpSyTnFsYmPAyXEfnyyb6csvGOjoHrNaOgqO
 dBNH8DCmlbv2LC+jB7cxJhulFvjsXuNb+xVMjWOOrjeG6yIXOJUpr7IjuMcVt8ph
 VN1LHz8NmUsXwYpSHVINTm2owLeZeIDKguLgOfCl3I124GTnjCnpSbwggg8qhkSd
 yG8xQreWbJI5lee1ltor4LfVrh0G+6ZDkYA9ryqraXWZ1LpMNVEfrFvWsGq6daTG
 GnsmDFf3OHIVnBs0CfxS6OVuLd9qGj4616BerKn1QrCW50fErCWOBtrZXWtI9zhw
 2NBCavwEguUUEBh3dhhUIY76nYV6xAdOU8c3fSqxvBYAGsJ0Cwkz5wCTdnTKMpr+
 i6DRVbuVbbd+U0nk8yGh3oFDu42ArThHNE4n2QNBFEw19ucSp6HKXZagpLWLmq5E
 HGs+0TgjYxKMokvuKIfXZNjfnBKLripwAtA3gGIhlVEZZz7/mYd149OEdsjpPYC2
 1M/cFUnGuMvP7CWevkXjQJxCJidM5ZMh3M716kwfPq3vlqCnvGVo+1obQrtXbVuo
 mZkLEO4Po3IjgNtHOtbw
 =dhsK
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/armbru/tags/pull-qapi-2017-10-02' into staging

QAPI patches for 2017-10-02

# gpg: Signature made Mon 02 Oct 2017 12:09:32 BST
# gpg:                using RSA key 0x3870B400EB918653
# gpg: Good signature from "Markus Armbruster <armbru@redhat.com>"
# gpg:                 aka "Markus Armbruster <armbru@pond.sub.org>"
# Primary key fingerprint: 354B C8B3 D7EB 2A6B 6867  4E5F 3870 B400 EB91 8653

* remotes/armbru/tags/pull-qapi-2017-10-02:
  watchdog: Allow setting action on the fly
  watchdog.h: Drop local redefinition of actions enum
  qapi: Rename WatchdogExpirationAction enum

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2017-10-03 15:11:00 +01:00
commit 0b7fe5aed7
6 changed files with 52 additions and 50 deletions

View file

@ -29,8 +29,9 @@
#include "qapi-event.h"
#include "hw/nmi.h"
#include "qemu/help_option.h"
#include "qmp-commands.h"
static int watchdog_action = WDT_RESET;
static WatchdogAction watchdog_action = WATCHDOG_ACTION_RESET;
static QLIST_HEAD(watchdog_list, WatchdogTimerModel) watchdog_list;
void watchdog_add_model(WatchdogTimerModel *model)
@ -77,27 +78,19 @@ int select_watchdog(const char *p)
int select_watchdog_action(const char *p)
{
if (strcasecmp(p, "reset") == 0)
watchdog_action = WDT_RESET;
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;
int action;
char *qapi_value;
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;
qmp_watchdog_set_action(action, &error_abort);
return 0;
}
int get_watchdog_action(void)
WatchdogAction get_watchdog_action(void)
{
return watchdog_action;
}
@ -108,42 +101,50 @@ int get_watchdog_action(void)
void watchdog_perform_action(void)
{
switch (watchdog_action) {
case WDT_RESET: /* same as 'system_reset' in monitor */
qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_RESET, &error_abort);
case WATCHDOG_ACTION_RESET: /* same as 'system_reset' in monitor */
qapi_event_send_watchdog(WATCHDOG_ACTION_RESET, &error_abort);
qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET);
break;
case WDT_SHUTDOWN: /* same as 'system_powerdown' in monitor */
qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_SHUTDOWN, &error_abort);
case WATCHDOG_ACTION_SHUTDOWN: /* same as 'system_powerdown' in monitor */
qapi_event_send_watchdog(WATCHDOG_ACTION_SHUTDOWN, &error_abort);
qemu_system_powerdown_request();
break;
case WDT_POWEROFF: /* same as 'quit' command in monitor */
qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_POWEROFF, &error_abort);
case WATCHDOG_ACTION_POWEROFF: /* same as 'quit' command in monitor */
qapi_event_send_watchdog(WATCHDOG_ACTION_POWEROFF, &error_abort);
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
* you would get a deadlock. Bypass the problem.
*/
qemu_system_vmstop_request_prepare();
qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_PAUSE, &error_abort);
qapi_event_send_watchdog(WATCHDOG_ACTION_PAUSE, &error_abort);
qemu_system_vmstop_request(RUN_STATE_WATCHDOG);
break;
case WDT_DEBUG:
qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_DEBUG, &error_abort);
case WATCHDOG_ACTION_DEBUG:
qapi_event_send_watchdog(WATCHDOG_ACTION_DEBUG, &error_abort);
fprintf(stderr, "watchdog: timer fired\n");
break;
case WDT_NONE:
qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_NONE, &error_abort);
case WATCHDOG_ACTION_NONE:
qapi_event_send_watchdog(WATCHDOG_ACTION_NONE, &error_abort);
break;
case WDT_NMI:
qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_INJECT_NMI,
case WATCHDOG_ACTION_INJECT_NMI:
qapi_event_send_watchdog(WATCHDOG_ACTION_INJECT_NMI,
&error_abort);
nmi_monitor_handle(0, NULL);
break;
default:
assert(0);
}
}
void qmp_watchdog_set_action(WatchdogAction action, Error **errp)
{
watchdog_action = action;
}

View file

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

View file

@ -23,15 +23,7 @@
#define QEMU_WATCHDOG_H
#include "qemu/queue.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. */
#include "qapi-types.h"
struct WatchdogTimerModel {
QLIST_ENTRY(WatchdogTimerModel) entry;
@ -46,7 +38,7 @@ typedef struct WatchdogTimerModel WatchdogTimerModel;
/* in hw/watchdog.c */
int select_watchdog(const char *p);
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_perform_action(void);

View file

@ -3541,8 +3541,8 @@ void watchdog_action_completion(ReadLineState *rs, int nb_args, const char *str)
return;
}
readline_set_completion_index(rs, strlen(str));
for (i = 0; i < WATCHDOG_EXPIRATION_ACTION__MAX; i++) {
add_completion_option(rs, str, WatchdogExpirationAction_str(i));
for (i = 0; i < WATCHDOG_ACTION__MAX; i++) {
add_completion_option(rs, str, WatchdogAction_str(i));
}
}

View file

@ -3191,3 +3191,12 @@
# Since 2.9
##
{ 'command': 'query-vm-generation-id', 'returns': 'GuidInfo' }
##
# @watchdog-set-action:
#
# Set watchdog action
#
# Since: 2.11
##
{ 'command': 'watchdog-set-action', 'data' : {'action': 'WatchdogAction'} }

View file

@ -253,10 +253,10 @@
#
##
{ 'event': 'WATCHDOG',
'data': { 'action': 'WatchdogExpirationAction' } }
'data': { 'action': 'WatchdogAction' } }
##
# @WatchdogExpirationAction:
# @WatchdogAction:
#
# An enumeration of the actions taken when the watchdog device's timer is
# expired
@ -279,7 +279,7 @@
#
# Since: 2.1
##
{ 'enum': 'WatchdogExpirationAction',
{ 'enum': 'WatchdogAction',
'data': [ 'reset', 'shutdown', 'poweroff', 'pause', 'debug', 'none',
'inject-nmi' ] }