get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 42825,
    "url": "https://patches.dpdk.org/api/patches/42825/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1531305717-15504-7-git-send-email-jia.guo@intel.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": "<1531305717-15504-7-git-send-email-jia.guo@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1531305717-15504-7-git-send-email-jia.guo@intel.com",
    "date": "2018-07-11T10:41:56",
    "name": "[v9,6/7] eal: add failure handle mechanism for hotplug",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "a6eefd1c424bd81f3761ce8e56caf81feb204f57",
    "submitter": {
        "id": 507,
        "url": "https://patches.dpdk.org/api/people/507/?format=api",
        "name": "Guo, Jia",
        "email": "jia.guo@intel.com"
    },
    "delegate": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1531305717-15504-7-git-send-email-jia.guo@intel.com/mbox/",
    "series": [
        {
            "id": 517,
            "url": "https://patches.dpdk.org/api/series/517/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=517",
            "date": "2018-07-11T10:41:50",
            "name": "hotplug failure handle mechanism",
            "version": 9,
            "mbox": "https://patches.dpdk.org/series/517/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/42825/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/42825/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 315BF1B57B;\n\tWed, 11 Jul 2018 12:44:46 +0200 (CEST)",
            "from mga05.intel.com (mga05.intel.com [192.55.52.43])\n\tby dpdk.org (Postfix) with ESMTP id 652F01B571\n\tfor <dev@dpdk.org>; Wed, 11 Jul 2018 12:44:44 +0200 (CEST)",
            "from fmsmga008.fm.intel.com ([10.253.24.58])\n\tby fmsmga105.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t11 Jul 2018 03:44:43 -0700",
            "from jeffguo-z170x-ud5.sh.intel.com (HELO localhost.localdomain)\n\t([10.67.104.10])\n\tby fmsmga008.fm.intel.com with ESMTP; 11 Jul 2018 03:44:29 -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,338,1526367600\"; d=\"scan'208\";a=\"54202538\"",
        "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,\n\tbernard.iremonger@intel.com, \n\tarybchenko@solarflare.com, wenzhuo.lu@intel.com",
        "Cc": "jblunck@infradead.org, shreyansh.jain@nxp.com, dev@dpdk.org,\n\tjia.guo@intel.com, helin.zhang@intel.com",
        "Date": "Wed, 11 Jul 2018 18:41:56 +0800",
        "Message-Id": "<1531305717-15504-7-git-send-email-jia.guo@intel.com>",
        "X-Mailer": "git-send-email 2.7.4",
        "In-Reply-To": "<1531305717-15504-1-git-send-email-jia.guo@intel.com>",
        "References": "<1498711073-42917-1-git-send-email-jia.guo@intel.com>\n\t<1531305717-15504-1-git-send-email-jia.guo@intel.com>",
        "Subject": "[dpdk-dev] [PATCH v9 6/7] eal: add failure handle mechanism for\n\thotplug",
        "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 handle mechanism to handle device\nhotplug removal event.\n\nFirst it can register sigbus handler when enable device event monitor. Once\nsigbus error be captured, it will check the failure address and accordingly\nremap the invalid memory for the corresponding device. Besed on this\nmechanism, it could guaranty the application not crash when the device be\nhotplug out.\n\nSigned-off-by: Jeff Guo <jia.guo@intel.com>\nAcked-by: Shaopeng He <shaopeng.he@intel.com>\n---\nv9->v8:\nno change\n---\n lib/librte_eal/linuxapp/eal/eal_dev.c | 113 +++++++++++++++++++++++++++++++++-\n 1 file changed, 112 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..1643b33 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,6 +16,10 @@\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+#include <rte_errno.h>\n \n #include \"eal_private.h\"\n \n@@ -23,6 +29,17 @@ static bool monitor_started;\n #define EAL_UEV_MSG_LEN 4096\n #define EAL_UEV_MSG_ELEM_LEN 128\n \n+/*\n+ * spinlock for device failure handle, if try to access bus or device,\n+ * such as handle sigbus on bus or handle memory failure for device just use\n+ * this lock. It could protect the bus and the device to avoid race condition.\n+ */\n+static rte_spinlock_t failure_handle_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@@ -33,6 +50,49 @@ enum eal_dev_event_subsystem {\n \tEAL_DEV_EVENT_SUBSYSTEM_MAX\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, siginfo_t *info,\n+\t\t\t\tvoid *ctx __rte_unused)\n+{\n+\tint ret;\n+\n+\tRTE_LOG(INFO, EAL, \"Thread[%d] catch SIGBUS, fault address:%p\\n\",\n+\t\t(int)pthread_self(), info->si_addr);\n+\n+\trte_spinlock_lock(&failure_handle_lock);\n+\tret = rte_bus_sigbus_handler(info->si_addr);\n+\trte_spinlock_unlock(&failure_handle_lock);\n+\tif (ret == -1) {\n+\t\trte_exit(EXIT_FAILURE,\n+\t\t\t \"Failed to handle SIGBUS for hotplug, \"\n+\t\t\t \"(rte_errno: %s)!\", strerror(rte_errno));\n+\t} else if (ret == 1) {\n+\t\tif (sigbus_action_old.sa_handler)\n+\t\t\t(*(sigbus_action_old.sa_handler))(signum);\n+\t\telse\n+\t\t\trte_exit(EXIT_FAILURE,\n+\t\t\t\t \"Failed to handle generic SIGBUS!\");\n+\t}\n+\n+\tRTE_LOG(INFO, EAL, \"Success to handle SIGBUS for hotplug!\\n\");\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@@ -147,6 +207,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 +234,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\trte_spinlock_lock(&failure_handle_lock);\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\tbusname);\n+\t\t\t\treturn;\n+\t\t\t}\n+\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, \"Cannot find device (%s) on \"\n+\t\t\t\t\t\"bus (%s)\\n\", uevent.devname, busname);\n+\t\t\t\treturn;\n+\t\t\t}\n+\n+\t\t\tret = bus->hotplug_failure_handler(dev);\n+\t\t\trte_spinlock_unlock(&failure_handle_lock);\n+\t\t\tif (ret) {\n+\t\t\t\tRTE_LOG(ERR, EAL, \"Can not handle hotplug for \"\n+\t\t\t\t\t\"device (%s)\\n\", dev->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 +297,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 +325,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": [
        "v9",
        "6/7"
    ]
}