get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/1.2/patches/810169/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 810169,
    "url": "http://patchwork.ozlabs.org/api/1.2/patches/810169/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/f9d56290959d378dfa65b3906bf0d822ab938ac9.1504617551.git.mprivozn@redhat.com/",
    "project": {
        "id": 14,
        "url": "http://patchwork.ozlabs.org/api/1.2/projects/14/?format=api",
        "name": "QEMU Development",
        "link_name": "qemu-devel",
        "list_id": "qemu-devel.nongnu.org",
        "list_email": "qemu-devel@nongnu.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": "",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<f9d56290959d378dfa65b3906bf0d822ab938ac9.1504617551.git.mprivozn@redhat.com>",
    "list_archive_url": null,
    "date": "2017-09-05T13:22:04",
    "name": "[v2] watchdog: Allow setting action on the fly",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "70d91c29588e3c3602d127b60d81ff438cccd791",
    "submitter": {
        "id": 11888,
        "url": "http://patchwork.ozlabs.org/api/1.2/people/11888/?format=api",
        "name": "Michal Prívozník",
        "email": "mprivozn@redhat.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/f9d56290959d378dfa65b3906bf0d822ab938ac9.1504617551.git.mprivozn@redhat.com/mbox/",
    "series": [
        {
            "id": 1583,
            "url": "http://patchwork.ozlabs.org/api/1.2/series/1583/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=1583",
            "date": "2017-09-05T13:22:04",
            "name": "[v2] watchdog: Allow setting action on the fly",
            "version": 2,
            "mbox": "http://patchwork.ozlabs.org/series/1583/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/810169/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/810169/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>",
        "X-Original-To": "incoming@patchwork.ozlabs.org",
        "Delivered-To": "patchwork-incoming@bilbo.ozlabs.org",
        "Authentication-Results": [
            "ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=nongnu.org\n\t(client-ip=2001:4830:134:3::11; helo=lists.gnu.org;\n\tenvelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n\treceiver=<UNKNOWN>)",
            "ext-mx06.extmail.prod.ext.phx2.redhat.com;\n\tdmarc=none (p=none dis=none) header.from=redhat.com",
            "ext-mx06.extmail.prod.ext.phx2.redhat.com;\n\tspf=fail smtp.mailfrom=mprivozn@redhat.com"
        ],
        "Received": [
            "from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11])\n\t(using TLSv1 with cipher AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3xmnWF2gtWz9t2S\n\tfor <incoming@patchwork.ozlabs.org>;\n\tTue,  5 Sep 2017 23:24:39 +1000 (AEST)",
            "from localhost ([::1]:58931 helo=lists.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.71) (envelope-from\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>)\n\tid 1dpDqH-0007T8-3q\n\tfor incoming@patchwork.ozlabs.org; Tue, 05 Sep 2017 09:24:37 -0400",
            "from eggs.gnu.org ([2001:4830:134:3::10]:48449)\n\tby lists.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <mprivozn@redhat.com>) id 1dpDo9-0006Jj-Do\n\tfor qemu-devel@nongnu.org; Tue, 05 Sep 2017 09:22:30 -0400",
            "from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)\n\t(envelope-from <mprivozn@redhat.com>) id 1dpDnz-0007WA-J7\n\tfor qemu-devel@nongnu.org; Tue, 05 Sep 2017 09:22:25 -0400",
            "from mx1.redhat.com ([209.132.183.28]:34782)\n\tby eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32)\n\t(Exim 4.71) (envelope-from <mprivozn@redhat.com>) id 1dpDnz-0007VK-AT\n\tfor qemu-devel@nongnu.org; Tue, 05 Sep 2017 09:22:15 -0400",
            "from smtp.corp.redhat.com\n\t(int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16])\n\t(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby mx1.redhat.com (Postfix) with ESMTPS id 53A993F74C\n\tfor <qemu-devel@nongnu.org>; Tue,  5 Sep 2017 13:22:14 +0000 (UTC)",
            "from moe.brq.redhat.com (unknown [10.43.2.192])\n\tby smtp.corp.redhat.com (Postfix) with ESMTP id 7CB706A0AC;\n\tTue,  5 Sep 2017 13:22:13 +0000 (UTC)"
        ],
        "DMARC-Filter": "OpenDMARC Filter v1.3.2 mx1.redhat.com 53A993F74C",
        "From": "Michal Privoznik <mprivozn@redhat.com>",
        "To": "qemu-devel@nongnu.org",
        "Date": "Tue,  5 Sep 2017 15:22:04 +0200",
        "Message-Id": "<f9d56290959d378dfa65b3906bf0d822ab938ac9.1504617551.git.mprivozn@redhat.com>",
        "X-Scanned-By": "MIMEDefang 2.79 on 10.5.11.16",
        "X-Greylist": "Sender IP whitelisted, not delayed by milter-greylist-4.5.16\n\t(mx1.redhat.com [10.5.110.30]);\n\tTue, 05 Sep 2017 13:22:14 +0000 (UTC)",
        "X-detected-operating-system": "by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]\n\t[fuzzy]",
        "X-Received-From": "209.132.183.28",
        "Subject": "[Qemu-devel] [PATCH v2] watchdog: Allow setting action on the fly",
        "X-BeenThere": "qemu-devel@nongnu.org",
        "X-Mailman-Version": "2.1.21",
        "Precedence": "list",
        "List-Id": "<qemu-devel.nongnu.org>",
        "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>",
        "List-Archive": "<http://lists.nongnu.org/archive/html/qemu-devel/>",
        "List-Post": "<mailto:qemu-devel@nongnu.org>",
        "List-Help": "<mailto:qemu-devel-request@nongnu.org?subject=help>",
        "List-Subscribe": "<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=subscribe>",
        "Cc": "armbru@redhat.com",
        "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org",
        "Sender": "\"Qemu-devel\"\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>"
    },
    "content": "Currently, the only time that users can set watchdog action is at\nthe start as all we expose is this -watchdog-action command line\nargument. This is suboptimal when users want to plug the device\nlater via monitor. Alternatively, they might want to change the\naction for already existing device on the fly.\n\nAt the same time, drop local redefinition of the actions eum in\nwatchdog.h in favour of the ones defined in schema.\n\nInspired by: https://bugzilla.redhat.com/show_bug.cgi?id=1447169\n\nSigned-off-by: Michal Privoznik <mprivozn@redhat.com>\n---",
    "diff": "diff to v1:\n- instead of allowing 'action' to be arbitrary string, use enum for it and thus\n  drop local redefinition of the enum.\n\n hw/watchdog/watchdog.c    | 52 ++++++++++++++++++++++++-----------------------\n hw/watchdog/wdt_diag288.c |  6 +++---\n include/sysemu/watchdog.h | 12 ++---------\n qapi-schema.json          |  9 ++++++++\n 4 files changed, 41 insertions(+), 38 deletions(-)\n\ndiff --git a/hw/watchdog/watchdog.c b/hw/watchdog/watchdog.c\nindex 0c5c9cde1c..a3e9d7b59b 100644\n--- a/hw/watchdog/watchdog.c\n+++ b/hw/watchdog/watchdog.c\n@@ -29,8 +29,11 @@\n #include \"qapi-event.h\"\n #include \"hw/nmi.h\"\n #include \"qemu/help_option.h\"\n+#include \"qmp-commands.h\"\n+#include \"qapi/qmp/qerror.h\"\n+#include \"qapi/util.h\"\n \n-static int watchdog_action = WDT_RESET;\n+static WatchdogExpirationAction watchdog_action = WATCHDOG_EXPIRATION_ACTION_RESET;\n static QLIST_HEAD(watchdog_list, WatchdogTimerModel) watchdog_list;\n \n void watchdog_add_model(WatchdogTimerModel *model)\n@@ -77,27 +80,17 @@ int select_watchdog(const char *p)\n \n int select_watchdog_action(const char *p)\n {\n-    if (strcasecmp(p, \"reset\") == 0)\n-        watchdog_action = WDT_RESET;\n-    else if (strcasecmp(p, \"shutdown\") == 0)\n-        watchdog_action = WDT_SHUTDOWN;\n-    else if (strcasecmp(p, \"poweroff\") == 0)\n-        watchdog_action = WDT_POWEROFF;\n-    else if (strcasecmp(p, \"pause\") == 0)\n-        watchdog_action = WDT_PAUSE;\n-    else if (strcasecmp(p, \"debug\") == 0)\n-        watchdog_action = WDT_DEBUG;\n-    else if (strcasecmp(p, \"none\") == 0)\n-        watchdog_action = WDT_NONE;\n-    else if (strcasecmp(p, \"inject-nmi\") == 0)\n-        watchdog_action = WDT_NMI;\n-    else\n-        return -1;\n+    int action;\n \n+    action = qapi_enum_parse(WatchdogExpirationAction_lookup, p,\n+                             WATCHDOG_EXPIRATION_ACTION__MAX, -1, NULL);\n+    if (action < 0)\n+        return -1;\n+    qmp_watchdog_set_action(action, NULL);\n     return 0;\n }\n \n-int get_watchdog_action(void)\n+WatchdogExpirationAction get_watchdog_action(void)\n {\n     return watchdog_action;\n }\n@@ -108,21 +101,21 @@ int get_watchdog_action(void)\n void watchdog_perform_action(void)\n {\n     switch (watchdog_action) {\n-    case WDT_RESET:             /* same as 'system_reset' in monitor */\n+    case WATCHDOG_EXPIRATION_ACTION_RESET:      /* same as 'system_reset' in monitor */\n         qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_RESET, &error_abort);\n         qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET);\n         break;\n \n-    case WDT_SHUTDOWN:          /* same as 'system_powerdown' in monitor */\n+    case WATCHDOG_EXPIRATION_ACTION_SHUTDOWN:   /* same as 'system_powerdown' in monitor */\n         qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_SHUTDOWN, &error_abort);\n         qemu_system_powerdown_request();\n         break;\n \n-    case WDT_POWEROFF:          /* same as 'quit' command in monitor */\n+    case WATCHDOG_EXPIRATION_ACTION_POWEROFF:   /* same as 'quit' command in monitor */\n         qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_POWEROFF, &error_abort);\n         exit(0);\n \n-    case WDT_PAUSE:             /* same as 'stop' command in monitor */\n+    case WATCHDOG_EXPIRATION_ACTION_PAUSE:      /* same as 'stop' command in monitor */\n         /* In a timer callback, when vm_stop calls qemu_clock_enable\n          * you would get a deadlock.  Bypass the problem.\n          */\n@@ -131,19 +124,28 @@ void watchdog_perform_action(void)\n         qemu_system_vmstop_request(RUN_STATE_WATCHDOG);\n         break;\n \n-    case WDT_DEBUG:\n+    case WATCHDOG_EXPIRATION_ACTION_DEBUG:\n         qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_DEBUG, &error_abort);\n         fprintf(stderr, \"watchdog: timer fired\\n\");\n         break;\n \n-    case WDT_NONE:\n+    case WATCHDOG_EXPIRATION_ACTION_NONE:\n         qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_NONE, &error_abort);\n         break;\n \n-    case WDT_NMI:\n+    case WATCHDOG_EXPIRATION_ACTION_INJECT_NMI:\n         qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_INJECT_NMI,\n                                  &error_abort);\n         nmi_monitor_handle(0, NULL);\n         break;\n+\n+    case WATCHDOG_EXPIRATION_ACTION__MAX:\n+        /* keep gcc happy */\n+        break;\n     }\n }\n+\n+void qmp_watchdog_set_action(WatchdogExpirationAction action, Error **errp)\n+{\n+    watchdog_action = action;\n+}\ndiff --git a/hw/watchdog/wdt_diag288.c b/hw/watchdog/wdt_diag288.c\nindex 47f289216a..451644eb89 100644\n--- a/hw/watchdog/wdt_diag288.c\n+++ b/hw/watchdog/wdt_diag288.c\n@@ -57,9 +57,9 @@ static void diag288_timer_expired(void *dev)\n      * the BQL; reset before triggering the action to avoid races with\n      * diag288 instructions. */\n     switch (get_watchdog_action()) {\n-    case WDT_DEBUG:\n-    case WDT_NONE:\n-    case WDT_PAUSE:\n+    case WATCHDOG_EXPIRATION_ACTION_DEBUG:\n+    case WATCHDOG_EXPIRATION_ACTION_NONE:\n+    case WATCHDOG_EXPIRATION_ACTION_PAUSE:\n         break;\n     default:\n         wdt_diag288_reset(dev);\ndiff --git a/include/sysemu/watchdog.h b/include/sysemu/watchdog.h\nindex 72a4da07a6..1b830df152 100644\n--- a/include/sysemu/watchdog.h\n+++ b/include/sysemu/watchdog.h\n@@ -23,15 +23,7 @@\n #define QEMU_WATCHDOG_H\n \n #include \"qemu/queue.h\"\n-\n-/* Possible values for action parameter. */\n-#define WDT_RESET        1      /* Hard reset. */\n-#define WDT_SHUTDOWN     2      /* Shutdown. */\n-#define WDT_POWEROFF     3      /* Quit. */\n-#define WDT_PAUSE        4      /* Pause. */\n-#define WDT_DEBUG        5      /* Prints a message and continues running. */\n-#define WDT_NONE         6      /* Do nothing. */\n-#define WDT_NMI          7      /* Inject nmi into the guest. */\n+#include \"qapi-types.h\"\n \n struct WatchdogTimerModel {\n     QLIST_ENTRY(WatchdogTimerModel) entry;\n@@ -46,7 +38,7 @@ typedef struct WatchdogTimerModel WatchdogTimerModel;\n /* in hw/watchdog.c */\n int select_watchdog(const char *p);\n int select_watchdog_action(const char *action);\n-int get_watchdog_action(void);\n+WatchdogExpirationAction get_watchdog_action(void);\n void watchdog_add_model(WatchdogTimerModel *model);\n void watchdog_perform_action(void);\n \ndiff --git a/qapi-schema.json b/qapi-schema.json\nindex 802ea53d00..40605be36f 100644\n--- a/qapi-schema.json\n+++ b/qapi-schema.json\n@@ -6539,3 +6539,12 @@\n # Since 2.9\n ##\n { 'command': 'query-vm-generation-id', 'returns': 'GuidInfo' }\n+\n+##\n+# @watchdog-set-action:\n+#\n+# Set watchdog action\n+#\n+# Since 2.11\n+##\n+{ 'command': 'watchdog-set-action', 'data' : {'action': 'WatchdogExpirationAction'} }\n",
    "prefixes": [
        "v2"
    ]
}