Show a patch.

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

{
    "id": 41944,
    "url": "http://patches.dpdk.org/api/patches/41944/?format=api",
    "web_url": "http://patches.dpdk.org/patch/41944/",
    "project": {
        "id": 1,
        "url": "http://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"
    },
    "msgid": "<1530267871-7161-7-git-send-email-jia.guo@intel.com>",
    "date": "2018-06-29T10:24:28",
    "name": "[V4,6/9] eal: add failure handle mechanism for hot plug",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "2a1f6e7a1cbaa1d9ee9f8d135bcd1c85ed361874",
    "submitter": {
        "id": 507,
        "url": "http://patches.dpdk.org/api/people/507/?format=api",
        "name": "Guo, Jia",
        "email": "jia.guo@intel.com"
    },
    "delegate": null,
    "mbox": "http://patches.dpdk.org/patch/41944/mbox/",
    "series": [
        {
            "id": 314,
            "url": "http://patches.dpdk.org/api/series/314/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=314",
            "date": "2018-06-29T10:24:22",
            "name": "hot plug failure handle mechanism",
            "version": 4,
            "mbox": "http://patches.dpdk.org/series/314/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/41944/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/41944/checks/",
    "tags": {},
    "headers": {
        "X-Mailer": "git-send-email 2.7.4",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "Precedence": "list",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "Date": "Fri, 29 Jun 2018 18:24:28 +0800",
        "X-Mailman-Version": "2.1.15",
        "Delivered-To": "patchwork@dpdk.org",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "X-Amp-Result": "SKIPPED(no attachment in message)",
        "Cc": "jblunck@infradead.org, shreyansh.jain@nxp.com, dev@dpdk.org,\n\tjia.guo@intel.com, helin.zhang@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, bernard.iremonger@intel.com",
        "Errors-To": "dev-bounces@dpdk.org",
        "References": "<1530267871-7161-1-git-send-email-jia.guo@intel.com>",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>",
        "From": "Jeff Guo <jia.guo@intel.com>",
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-IronPort-AV": "E=Sophos;i=\"5.51,285,1526367600\"; d=\"scan'208\";a=\"241324451\"",
        "List-Post": "<mailto:dev@dpdk.org>",
        "Received": [
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 14E5B1B544;\n\tFri, 29 Jun 2018 12:27:13 +0200 (CEST)",
            "from mga03.intel.com (mga03.intel.com [134.134.136.65])\n\tby dpdk.org (Postfix) with ESMTP id 037421B52A\n\tfor <dev@dpdk.org>; Fri, 29 Jun 2018 12:27:09 +0200 (CEST)",
            "from fmsmga005.fm.intel.com ([10.253.24.32])\n\tby orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t29 Jun 2018 03:27:09 -0700",
            "from jeffguo-z170x-ud5.sh.intel.com (HELO localhost.localdomain)\n\t([10.67.104.10])\n\tby fmsmga005.fm.intel.com with ESMTP; 29 Jun 2018 03:27:06 -0700"
        ],
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "X-Amp-File-Uploaded": "False",
        "Subject": "[dpdk-dev] [PATCH V4 6/9] eal: add failure handle mechanism for hot\n\tplug",
        "In-Reply-To": "<1530267871-7161-1-git-send-email-jia.guo@intel.com>",
        "Message-Id": "<1530267871-7161-7-git-send-email-jia.guo@intel.com>",
        "X-ExtLoop1": "1",
        "X-BeenThere": "dev@dpdk.org",
        "X-Original-To": "patchwork@dpdk.org"
    },
    "content": "This patch introduces a failure handler mechanism to handle device\nhot plug removal event.\n\nFirst register sigbus handler, once sigbus error be captured, will\ncheck the failure address and accordingly remap the invalid memory\nfor the corresponding device. Bese on this mechanism, it could\nguaranty the application not to be crash when hot unplug devices.\n\nSigned-off-by: Jeff Guo <jia.guo@intel.com>\n---\nv4->v3:\nsplit patches to be small and clear.\n---\n lib/librte_eal/linuxapp/eal/eal_dev.c | 88 ++++++++++++++++++++++++++++++++++-\n 1 file changed, 87 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..c9dddab 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,24 @@\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 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 void dev_uev_handler(__rte_unused void *param);\n \n /* identify the system layer which reports this event. */\n@@ -33,6 +44,34 @@ enum eal_dev_event_subsystem {\n \tEAL_DEV_EVENT_SUBSYSTEM_MAX\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+\n+\trte_spinlock_lock(&dev_failure_lock);\n+\tret = rte_bus_sigbus_handler(info->si_addr);\n+\trte_spinlock_unlock(&dev_failure_lock);\n+\tif (!ret)\n+\t\tRTE_LOG(INFO, EAL,\n+\t\t\t\"Success to handle SIGBUS error for hotplug!\\n\");\n+\telse\n+\t\trte_exit(EXIT_FAILURE,\n+\t\t\t \"A generic SIGBUS error, (rte_errno: %s)!\",\n+\t\t\t strerror(rte_errno));\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 +186,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 +213,48 @@ 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\tbusname);\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, \"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+\t\t\trte_spinlock_lock(&dev_failure_lock);\n+\t\t\tret = bus->hotplug_handler(dev);\n+\t\t\trte_spinlock_unlock(&dev_failure_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 +274,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+\tsigaction(SIGBUS, &action, NULL);\n+\n \tmonitor_started = true;\n \n \treturn 0;\n@@ -220,5 +305,6 @@ rte_dev_event_monitor_stop(void)\n \tclose(intr_handle.fd);\n \tintr_handle.fd = -1;\n \tmonitor_started = false;\n+\n \treturn 0;\n }\n",
    "prefixes": [
        "V4",
        "6/9"
    ]
}