get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 41390,
    "url": "http://patchwork.dpdk.org/api/patches/41390/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/1529668268-7462-3-git-send-email-jia.guo@intel.com/",
    "project": {
        "id": 1,
        "url": "http://patchwork.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": "<1529668268-7462-3-git-send-email-jia.guo@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1529668268-7462-3-git-send-email-jia.guo@intel.com",
    "date": "2018-06-22T11:51:06",
    "name": "[v2,2/4] eal: add failure handle mechanism for hot plug",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "bec879e5af94a4de76be69b3de371573b9e06beb",
    "submitter": {
        "id": 507,
        "url": "http://patchwork.dpdk.org/api/people/507/?format=api",
        "name": "Guo, Jia",
        "email": "jia.guo@intel.com"
    },
    "delegate": {
        "id": 1,
        "url": "http://patchwork.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/1529668268-7462-3-git-send-email-jia.guo@intel.com/mbox/",
    "series": [
        {
            "id": 205,
            "url": "http://patchwork.dpdk.org/api/series/205/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=205",
            "date": "2018-06-22T11:51:04",
            "name": "hot plug failure handle mechanism",
            "version": 2,
            "mbox": "http://patchwork.dpdk.org/series/205/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/41390/comments/",
    "check": "warning",
    "checks": "http://patchwork.dpdk.org/api/patches/41390/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 0600E1BB4D;\n\tFri, 22 Jun 2018 13:48:12 +0200 (CEST)",
            "from mga09.intel.com (mga09.intel.com [134.134.136.24])\n\tby dpdk.org (Postfix) with ESMTP id 6C60E1BB2C\n\tfor <dev@dpdk.org>; Fri, 22 Jun 2018 13:48:08 +0200 (CEST)",
            "from fmsmga007.fm.intel.com ([10.253.24.52])\n\tby orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t22 Jun 2018 04:48:07 -0700",
            "from jeffguo-s2600wt2.sh.intel.com (HELO localhost.localdomain)\n\t([10.67.110.10])\n\tby fmsmga007.fm.intel.com with ESMTP; 22 Jun 2018 04:48:04 -0700"
        ],
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "X-Amp-File-Uploaded": "False",
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.51,256,1526367600\"; d=\"scan'208\";a=\"49078353\"",
        "From": "Jeff Guo <jia.guo@intel.com>",
        "To": "stephen@networkplumber.org, bruce.richardson@intel.com,\n\tferruh.yigit@intel.com, konstantin.ananyev@intel.com,\n\tgaetan.rivet@6wind.com, jingjing.wu@intel.com, thomas@monjalon.net,\n\tmotih@mellanox.com, matan@mellanox.com, harry.van.haaren@intel.com,\n\tqi.z.zhang@intel.com, shaopeng.he@intel.com",
        "Cc": "jblunck@infradead.org, shreyansh.jain@nxp.com, dev@dpdk.org,\n\tjia.guo@intel.com, helin.zhang@intel.com",
        "Date": "Fri, 22 Jun 2018 19:51:06 +0800",
        "Message-Id": "<1529668268-7462-3-git-send-email-jia.guo@intel.com>",
        "X-Mailer": "git-send-email 2.7.4",
        "In-Reply-To": "<1529668268-7462-1-git-send-email-jia.guo@intel.com>",
        "References": "<1498711073-42917-1-git-send-email-jia.guo@intel.com>\n\t<1529668268-7462-1-git-send-email-jia.guo@intel.com>",
        "Subject": "[dpdk-dev] [PATCH v2 2/4] eal: add failure handle mechanism for hot\n\tplug",
        "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://mails.dpdk.org/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "This patch introduces a failure handler mechanism to handle device\nhot unplug event. When device be hot plug out, the device resource\nbecome invalid, if this resource is still be unexpected read/write,\nsystem will crash.\n\nThis patch let framework help application to handle this fault. When\nsigbus error occur, check the failure address and accordingly remap\nthe invalid memory for the corresponding device, that could guaranty\nthe application not to be shut down when hot unplug devices.\n\nSigned-off-by: Jeff Guo <jia.guo@intel.com>\n---\nv2->v1(v21):\nrefine commit log\n---\n lib/librte_eal/linuxapp/eal/eal_dev.c | 154 +++++++++++++++++++++++++++++++++-\n 1 file changed, 153 insertions(+), 1 deletion(-)",
    "diff": "diff --git a/lib/librte_eal/linuxapp/eal/eal_dev.c b/lib/librte_eal/linuxapp/eal/eal_dev.c\nindex 1cf6aeb..3067f39 100644\n--- a/lib/librte_eal/linuxapp/eal/eal_dev.c\n+++ b/lib/librte_eal/linuxapp/eal/eal_dev.c\n@@ -4,6 +4,8 @@\n \n #include <string.h>\n #include <unistd.h>\n+#include <fcntl.h>\n+#include <signal.h>\n #include <sys/socket.h>\n #include <linux/netlink.h>\n \n@@ -14,15 +16,27 @@\n #include <rte_malloc.h>\n #include <rte_interrupts.h>\n #include <rte_alarm.h>\n+#include <rte_bus.h>\n+#include <rte_eal.h>\n+#include <rte_spinlock.h>\n \n #include \"eal_private.h\"\n \n static struct rte_intr_handle intr_handle = {.fd = -1 };\n static bool monitor_started;\n \n+extern struct rte_bus_list rte_bus_list;\n+\n #define EAL_UEV_MSG_LEN 4096\n #define EAL_UEV_MSG_ELEM_LEN 128\n \n+/* spinlock for device failure process */\n+static rte_spinlock_t dev_failure_lock = RTE_SPINLOCK_INITIALIZER;\n+\n+static struct sigaction sigbus_action_old;\n+\n+static int sigbus_need_recover;\n+\n static void dev_uev_handler(__rte_unused void *param);\n \n /* identify the system layer which reports this event. */\n@@ -34,6 +48,93 @@ enum eal_dev_event_subsystem {\n };\n \n static int\n+dev_uev_failure_process(struct rte_device *dev, void *dev_addr)\n+{\n+\tstruct rte_bus *bus;\n+\tint ret = 0;\n+\n+\tif (!dev && !dev_addr) {\n+\t\treturn -EINVAL;\n+\t} else if (dev) {\n+\t\tbus = rte_bus_find_by_device_name(dev->name);\n+\t\tif (bus->handle_hot_unplug) {\n+\t\t\t/**\n+\t\t\t * call bus ops to handle hot unplug.\n+\t\t\t */\n+\t\t\tret = bus->handle_hot_unplug(dev, dev_addr);\n+\t\t\tif (ret) {\n+\t\t\t\tRTE_LOG(ERR, EAL,\n+\t\t\t\t\t\"Cannot handle hot unplug \"\n+\t\t\t\t\t\"for device %s \"\n+\t\t\t\t\t\"on the bus %s.\\n \",\n+\t\t\t\t\tdev->name, bus->name);\n+\t\t\t}\n+\t\t} else {\n+\t\t\tRTE_LOG(ERR, EAL,\n+\t\t\t\t\"Not support handle hot unplug for bus %s!\\n\",\n+\t\t\t\tbus->name);\n+\t\t\tret = -ENOTSUP;\n+\t\t}\n+\t} else {\n+\t\tTAILQ_FOREACH(bus, &rte_bus_list, next) {\n+\t\t\tif (bus->handle_hot_unplug) {\n+\t\t\t\t/**\n+\t\t\t\t * call bus ops to handle hot unplug.\n+\t\t\t\t */\n+\t\t\t\tret = bus->handle_hot_unplug(dev, dev_addr);\n+\t\t\t\tif (ret)\n+\t\t\t\t\tRTE_LOG(ERR, EAL,\n+\t\t\t\t\t\t\"Cannot handle hot unplug \"\n+\t\t\t\t\t\t\"for the device \"\n+\t\t\t\t\t\t\"on the bus %s!\\n\", bus->name);\n+\t\t\t\telse\n+\t\t\t\t\tbreak;\n+\t\t\t} else {\n+\t\t\t\tRTE_LOG(ERR, EAL,\n+\t\t\t\t\t\"Not support handle hot unplug \"\n+\t\t\t\t\t\"for bus %s!\\n\", bus->name);\n+\t\t\t\tret = -ENOTSUP;\n+\t\t\t}\n+\t\t}\n+\t}\n+\treturn ret;\n+}\n+\n+static void\n+sigbus_action_recover(void)\n+{\n+\tif (sigbus_need_recover) {\n+\t\tsigaction(SIGBUS, &sigbus_action_old, NULL);\n+\t\tsigbus_need_recover = 0;\n+\t}\n+}\n+\n+static void sigbus_handler(int signum __rte_unused, siginfo_t *info,\n+\t\t\t\tvoid *ctx __rte_unused)\n+{\n+\tint ret;\n+\n+\tRTE_LOG(DEBUG, EAL, \"Thread[%d] catch SIGBUS, fault address:%p\\n\",\n+\t\t(int)pthread_self(), info->si_addr);\n+\trte_spinlock_lock(&dev_failure_lock);\n+\tret = dev_uev_failure_process(NULL, info->si_addr);\n+\trte_spinlock_unlock(&dev_failure_lock);\n+\tif (!ret)\n+\t\tRTE_LOG(DEBUG, EAL,\n+\t\t\t\"Success to handle SIGBUS error for hot unplug!\\n\");\n+\telse\n+\t\trte_exit(EXIT_FAILURE, \"exit for SIGBUS error!\");\n+}\n+\n+static int cmp_dev_name(const struct rte_device *dev,\n+\tconst void *_name)\n+{\n+\tconst char *name = _name;\n+\n+\treturn strcmp(dev->name, name);\n+}\n+\n+static int\n dev_uev_socket_fd_create(void)\n {\n \tstruct sockaddr_nl addr;\n@@ -147,6 +248,9 @@ dev_uev_handler(__rte_unused void *param)\n \tstruct rte_dev_event uevent;\n \tint ret;\n \tchar buf[EAL_UEV_MSG_LEN];\n+\tstruct rte_bus *bus;\n+\tstruct rte_device *dev;\n+\tconst char *busname;\n \n \tmemset(&uevent, 0, sizeof(struct rte_dev_event));\n \tmemset(buf, 0, EAL_UEV_MSG_LEN);\n@@ -171,13 +275,50 @@ dev_uev_handler(__rte_unused void *param)\n \tRTE_LOG(DEBUG, EAL, \"receive uevent(name:%s, type:%d, subsystem:%d)\\n\",\n \t\tuevent.devname, uevent.type, uevent.subsystem);\n \n-\tif (uevent.devname)\n+\tswitch (uevent.subsystem) {\n+\tcase EAL_DEV_EVENT_SUBSYSTEM_PCI:\n+\tcase EAL_DEV_EVENT_SUBSYSTEM_UIO:\n+\t\tbusname = \"pci\";\n+\t\tbreak;\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\tif (uevent.devname) {\n+\t\tif (uevent.type == RTE_DEV_EVENT_REMOVE) {\n+\t\t\tbus = rte_bus_find_by_name(busname);\n+\t\t\tif (bus == NULL) {\n+\t\t\t\tRTE_LOG(ERR, EAL, \"Cannot find bus (%s)\\n\",\n+\t\t\t\t\tuevent.devname);\n+\t\t\t\treturn;\n+\t\t\t}\n+\t\t\tdev = bus->find_device(NULL, cmp_dev_name,\n+\t\t\t\t\t       uevent.devname);\n+\t\t\tif (dev == NULL) {\n+\t\t\t\tRTE_LOG(ERR, EAL,\n+\t\t\t\t\t\"Cannot find unplugged device (%s)\\n\",\n+\t\t\t\t\tuevent.devname);\n+\t\t\t\treturn;\n+\t\t\t}\n+\t\t\trte_spinlock_lock(&dev_failure_lock);\n+\t\t\tret = dev_uev_failure_process(dev, NULL);\n+\t\t\trte_spinlock_unlock(&dev_failure_lock);\n+\t\t\tif (ret) {\n+\t\t\t\tRTE_LOG(ERR, EAL, \"Driver cannot remap the \"\n+\t\t\t\t\t\"device (%s)\\n\",\n+\t\t\t\t\tdev->name);\n+\t\t\t\treturn;\n+\t\t\t}\n+\t\t}\n \t\tdev_callback_process(uevent.devname, uevent.type);\n+\t}\n }\n \n int __rte_experimental\n rte_dev_event_monitor_start(void)\n {\n+\tsigset_t mask;\n+\tstruct sigaction action;\n \tint ret;\n \n \tif (monitor_started)\n@@ -197,6 +338,14 @@ rte_dev_event_monitor_start(void)\n \t\treturn -1;\n \t}\n \n+\t/* register sigbus handler */\n+\tsigemptyset(&mask);\n+\tsigaddset(&mask, SIGBUS);\n+\taction.sa_flags = SA_SIGINFO;\n+\taction.sa_mask = mask;\n+\taction.sa_sigaction = sigbus_handler;\n+\tsigbus_need_recover = !sigaction(SIGBUS, &action, &sigbus_action_old);\n+\n \tmonitor_started = true;\n \n \treturn 0;\n@@ -217,8 +366,11 @@ rte_dev_event_monitor_stop(void)\n \t\treturn ret;\n \t}\n \n+\tsigbus_action_recover();\n+\n \tclose(intr_handle.fd);\n \tintr_handle.fd = -1;\n \tmonitor_started = false;\n+\n \treturn 0;\n }\n",
    "prefixes": [
        "v2",
        "2/4"
    ]
}