get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 40724,
    "url": "https://patches.dpdk.org/api/patches/40724/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20180607094322.14312-11-mk@semihalf.com/",
    "project": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20180607094322.14312-11-mk@semihalf.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20180607094322.14312-11-mk@semihalf.com",
    "date": "2018-06-07T09:43:06",
    "name": "[dpdk-dev,v3,11/27] net/ena: add watchdog and keep alive AENQ handler",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "b3054052d74a5ac5dda12a3efda6259260427a67",
    "submitter": {
        "id": 786,
        "url": "https://patches.dpdk.org/api/people/786/?format=api",
        "name": "Michal Krawczyk",
        "email": "mk@semihalf.com"
    },
    "delegate": {
        "id": 319,
        "url": "https://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20180607094322.14312-11-mk@semihalf.com/mbox/",
    "series": [
        {
            "id": 26,
            "url": "https://patches.dpdk.org/api/series/26/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=26",
            "date": "2018-06-07T09:43:00",
            "name": "net/ena: new features and fixes",
            "version": 3,
            "mbox": "https://patches.dpdk.org/series/26/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/40724/comments/",
    "check": "fail",
    "checks": "https://patches.dpdk.org/api/patches/40724/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 1B84D1B213;\n\tThu,  7 Jun 2018 11:43:50 +0200 (CEST)",
            "from mail-lf0-f67.google.com (mail-lf0-f67.google.com\n\t[209.85.215.67]) by dpdk.org (Postfix) with ESMTP id 1AD061B029\n\tfor <dev@dpdk.org>; Thu,  7 Jun 2018 11:43:44 +0200 (CEST)",
            "by mail-lf0-f67.google.com with SMTP id i15-v6so3337466lfc.2\n\tfor <dev@dpdk.org>; Thu, 07 Jun 2018 02:43:44 -0700 (PDT)",
            "from mkPC.semihalf.local (31-172-191-173.noc.fibertech.net.pl.\n\t[31.172.191.173]) by smtp.gmail.com with ESMTPSA id\n\tp28-v6sm3612368lfh.24.2018.06.07.02.43.41\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tThu, 07 Jun 2018 02:43:42 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=semihalf-com.20150623.gappssmtp.com; s=20150623;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references;\n\tbh=QxzJ3cUno/j6cdy8udgoRZkQ2l5qrVPgQ7FTYQw54WY=;\n\tb=vTzyAXKXpEKQz9OUi5EsxxpMsc8GDbaispjz4XwqNolPVqZa1hHzz+o0XFl2AKGGI0\n\tx5AlTKX8ri5rsSGdsk0ypwLjyft/FESRnzYTR9bu6VVWt8Ckl7+MnXtVipn73TGg9Me+\n\tRaSZQUAPsdzhg+uHY1LlVlNh8OMk1Evv0dIbsCe5J+M0CPLxFUaAUfvdp87o8xIW9Tct\n\t5c11iew08ALNRkPr82IGsRmA+K1OgHOBbSk2M5Io1/y/VVk7sWVRC8UfZCip1AfzE5HO\n\t4tYOKzEf5R2vAWJ3qerVOqe7BH+W7kZKilY4EtQmarn6gY5gKoC2EMvlXDPpsH1PqxLB\n\tmiOQ==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=QxzJ3cUno/j6cdy8udgoRZkQ2l5qrVPgQ7FTYQw54WY=;\n\tb=aWa73vQaZ2Mc+mjD3pSaEb9Xnu6yaux/DxTxbYPRFGF0KjxRVUSTCxPG1dYPOhVLgz\n\ttvMP/JhF60N2+iq+z3e6O/DojBhS3UZAczlauUxTqkVcA5H80rmz7oj1/hI9/6BI5kSN\n\tPl6eFMBMGIrlXUBEYt/Ke4UpCcIq/1AH+b3FNs5o3DV0Jn63fajALU8MB5SOuYnqQYxs\n\tCaAnCQZCEG0aQkecVFVu+I6GxPqCA2rhMgFc7QNh95oegiyzv3NAlz3CrtF+gv+Ise70\n\tqj5e641+s8QWGpZ0oqKkKmP76DPBiVqZqpn870RlJihRf7STs5+ceQuD5QkU06Seng3c\n\tsMYA==",
        "X-Gm-Message-State": "APt69E3fhNqUstkVaKZtKXmU6pumnfwwb3Vp0/rFELUeA6HJyFKK9Mb3\n\tV+rqBT7jPUDHAuCh9EwRTI6kjw==",
        "X-Google-Smtp-Source": "ADUXVKJnOMPeJDH3Q5tZ7/2/ksu85dY3qzU9qk6GygzLgUERkUD9tTRM7QxvGvKPMAewaNMvBIcVLw==",
        "X-Received": "by 2002:a2e:2bcb:: with SMTP id\n\tr72-v6mr998312ljr.133.1528364623734; \n\tThu, 07 Jun 2018 02:43:43 -0700 (PDT)",
        "From": "Michal Krawczyk <mk@semihalf.com>",
        "To": "Marcin Wojtas <mw@semihalf.com>, Michal Krawczyk <mk@semihalf.com>,\n\tGuy Tzalik <gtzalik@amazon.com>, Evgeny Schemeilin <evgenys@amazon.com>",
        "Cc": "dev@dpdk.org,\n\tmatua@amazon.com",
        "Date": "Thu,  7 Jun 2018 11:43:06 +0200",
        "Message-Id": "<20180607094322.14312-11-mk@semihalf.com>",
        "X-Mailer": "git-send-email 2.14.1",
        "In-Reply-To": "<20180607094322.14312-1-mk@semihalf.com>",
        "References": "<20180607094322.14312-1-mk@semihalf.com>",
        "Subject": "[dpdk-dev] [PATCH v3 11/27] net/ena: add watchdog and keep alive\n\tAENQ handler",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Keep alive is executing AENQ interrupt periodically. It allows to check\nhealth of the device and trigger reset event if the device will stop\nresponding.\n\nTo check for the state of the device, the DPDK application must call\nrte_timer_manage().\n\nSigned-off-by: Michal Krawczyk <mk@semihalf.com>\n---\n drivers/net/ena/ena_ethdev.c | 58 ++++++++++++++++++++++++++++++++++++++++++--\n drivers/net/ena/ena_ethdev.h |  9 +++++++\n 2 files changed, 65 insertions(+), 2 deletions(-)",
    "diff": "diff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c\nindex 4fae4fd66..796b6fc0a 100644\n--- a/drivers/net/ena/ena_ethdev.c\n+++ b/drivers/net/ena/ena_ethdev.c\n@@ -249,6 +249,7 @@ static int ena_rss_reta_query(struct rte_eth_dev *dev,\n \t\t\t      uint16_t reta_size);\n static int ena_get_sset_count(struct rte_eth_dev *dev, int sset);\n static void ena_interrupt_handler_rte(void *cb_arg);\n+static void ena_timer_wd_callback(struct rte_timer *timer, void *arg);\n \n static const struct eth_dev_ops ena_dev_ops = {\n \t.dev_configure        = ena_dev_configure,\n@@ -979,6 +980,7 @@ static int ena_start(struct rte_eth_dev *dev)\n {\n \tstruct ena_adapter *adapter =\n \t\t(struct ena_adapter *)(dev->data->dev_private);\n+\tuint64_t ticks;\n \tint rc = 0;\n \n \trc = ena_check_valid_conf(adapter);\n@@ -1002,6 +1004,13 @@ static int ena_start(struct rte_eth_dev *dev)\n \n \tena_stats_restart(dev);\n \n+\tadapter->timestamp_wd = rte_get_timer_cycles();\n+\tadapter->keep_alive_timeout = ENA_DEVICE_KALIVE_TIMEOUT;\n+\n+\tticks = rte_get_timer_hz();\n+\trte_timer_reset(&adapter->timer_wd, ticks, PERIODICAL, rte_lcore_id(),\n+\t\t\tena_timer_wd_callback, adapter);\n+\n \tadapter->state = ENA_ADAPTER_STATE_RUNNING;\n \n \treturn 0;\n@@ -1012,6 +1021,8 @@ static void ena_stop(struct rte_eth_dev *dev)\n \tstruct ena_adapter *adapter =\n \t\t(struct ena_adapter *)(dev->data->dev_private);\n \n+\trte_timer_stop_sync(&adapter->timer_wd);\n+\n \tadapter->state = ENA_ADAPTER_STATE_STOPPED;\n }\n \n@@ -1358,7 +1369,8 @@ static int ena_device_init(struct ena_com_dev *ena_dev,\n \t}\n \n \taenq_groups = BIT(ENA_ADMIN_LINK_CHANGE) |\n-\t\t      BIT(ENA_ADMIN_NOTIFICATION);\n+\t\t      BIT(ENA_ADMIN_NOTIFICATION) |\n+\t\t      BIT(ENA_ADMIN_KEEP_ALIVE);\n \n \taenq_groups &= get_feat_ctx->aenq.supported_groups;\n \trc = ena_com_set_aenq_config(ena_dev, aenq_groups);\n@@ -1388,6 +1400,26 @@ static void ena_interrupt_handler_rte(void *cb_arg)\n \t\tena_com_aenq_intr_handler(ena_dev, adapter);\n }\n \n+static void ena_timer_wd_callback(__rte_unused struct rte_timer *timer,\n+\t\t\t\t  void *arg)\n+{\n+\tstruct ena_adapter *adapter = (struct ena_adapter *)arg;\n+\tstruct rte_eth_dev *dev = adapter->rte_dev;\n+\n+\tif (adapter->keep_alive_timeout == ENA_HW_HINTS_NO_TIMEOUT)\n+\t\treturn;\n+\n+\t/* Within reasonable timing range no memory barriers are needed */\n+\tif ((rte_get_timer_cycles() - adapter->timestamp_wd) >=\n+\t    adapter->keep_alive_timeout) {\n+\t\tRTE_LOG(ERR, PMD, \"The ENA device is not responding - \"\n+\t\t\t\"performing device reset...\");\n+\t\tadapter->reset_reason = ENA_REGS_RESET_KEEP_ALIVE_TO;\n+\t\t_rte_eth_dev_callback_process(dev, RTE_ETH_EVENT_INTR_RESET,\n+\t\t\tNULL);\n+\t}\n+}\n+\n static int eth_ena_dev_init(struct rte_eth_dev *eth_dev)\n {\n \tstruct rte_pci_device *pci_dev;\n@@ -1490,6 +1522,10 @@ static int eth_ena_dev_init(struct rte_eth_dev *eth_dev)\n \tena_com_set_admin_polling_mode(ena_dev, false);\n \tena_com_admin_aenq_enable(ena_dev);\n \n+\tif (adapters_found == 0)\n+\t\trte_timer_subsystem_init();\n+\trte_timer_init(&adapter->timer_wd);\n+\n \tadapters_found++;\n \tadapter->state = ENA_ADAPTER_STATE_INIT;\n \n@@ -1803,6 +1839,16 @@ static void ena_update_hints(struct ena_adapter *adapter,\n \t\t/* convert to usec */\n \t\tadapter->ena_dev.mmio_read.reg_read_to =\n \t\t\thints->mmio_read_timeout * 1000;\n+\n+\tif (hints->driver_watchdog_timeout) {\n+\t\tif (hints->driver_watchdog_timeout == ENA_HW_HINTS_NO_TIMEOUT)\n+\t\t\tadapter->keep_alive_timeout = ENA_HW_HINTS_NO_TIMEOUT;\n+\t\telse\n+\t\t\t// Convert msecs to ticks\n+\t\t\tadapter->keep_alive_timeout =\n+\t\t\t\t(hints->driver_watchdog_timeout *\n+\t\t\t\trte_get_timer_hz()) / 1000;\n+\t}\n }\n \n static uint16_t eth_ena_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,\n@@ -2022,6 +2068,14 @@ static void ena_notification(void *data,\n \t}\n }\n \n+static void ena_keep_alive(void *adapter_data,\n+\t\t\t   __rte_unused struct ena_admin_aenq_entry *aenq_e)\n+{\n+\tstruct ena_adapter *adapter = (struct ena_adapter *)adapter_data;\n+\n+\tadapter->timestamp_wd = rte_get_timer_cycles();\n+}\n+\n /**\n  * This handler will called for unknown event group or unimplemented handlers\n  **/\n@@ -2035,7 +2089,7 @@ static struct ena_aenq_handlers aenq_handlers = {\n \t.handlers = {\n \t\t[ENA_ADMIN_LINK_CHANGE] = ena_update_on_link_change,\n \t\t[ENA_ADMIN_NOTIFICATION] = ena_notification,\n-\t\t[ENA_ADMIN_KEEP_ALIVE] = unimplemented_aenq_handler\n+\t\t[ENA_ADMIN_KEEP_ALIVE] = ena_keep_alive\n \t},\n \t.unimplemented_handler = unimplemented_aenq_handler\n };\ndiff --git a/drivers/net/ena/ena_ethdev.h b/drivers/net/ena/ena_ethdev.h\nindex 79e9e655d..b44cca23e 100644\n--- a/drivers/net/ena/ena_ethdev.h\n+++ b/drivers/net/ena/ena_ethdev.h\n@@ -34,8 +34,10 @@\n #ifndef _ENA_ETHDEV_H_\n #define _ENA_ETHDEV_H_\n \n+#include <rte_cycles.h>\n #include <rte_pci.h>\n #include <rte_bus_pci.h>\n+#include <rte_timer.h>\n \n #include \"ena_com.h\"\n \n@@ -50,6 +52,9 @@\n \n #define ENA_MMIO_DISABLE_REG_READ\tBIT(0)\n \n+#define ENA_WD_TIMEOUT_SEC\t3\n+#define ENA_DEVICE_KALIVE_TIMEOUT (ENA_WD_TIMEOUT_SEC * rte_get_timer_hz())\n+\n struct ena_adapter;\n \n enum ena_ring_type {\n@@ -185,6 +190,10 @@ struct ena_adapter {\n \tbool link_status;\n \n \tenum ena_regs_reset_reason_types reset_reason;\n+\n+\tstruct rte_timer timer_wd;\n+\tuint64_t timestamp_wd;\n+\tuint64_t keep_alive_timeout;\n };\n \n #endif /* _ENA_ETHDEV_H_ */\n",
    "prefixes": [
        "dpdk-dev",
        "v3",
        "11/27"
    ]
}