get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 56522,
    "url": "https://patches.dpdk.org/api/patches/56522/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20190716164424.16776-2-ndabilpuram@marvell.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": "<20190716164424.16776-2-ndabilpuram@marvell.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20190716164424.16776-2-ndabilpuram@marvell.com",
    "date": "2019-07-16T16:44:23",
    "name": "[RFC,v3,2/3] eal: add mask and unmask interrupt APIs",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "c3d936ca649396b310178c053d542a5f6284d338",
    "submitter": {
        "id": 1202,
        "url": "https://patches.dpdk.org/api/people/1202/?format=api",
        "name": "Nithin Dabilpuram",
        "email": "ndabilpuram@marvell.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/20190716164424.16776-2-ndabilpuram@marvell.com/mbox/",
    "series": [
        {
            "id": 5511,
            "url": "https://patches.dpdk.org/api/series/5511/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=5511",
            "date": "2019-07-16T06:46:31",
            "name": "[RFC] eal: add mask and unmask interrupt apis",
            "version": 1,
            "mbox": "https://patches.dpdk.org/series/5511/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/56522/comments/",
    "check": "fail",
    "checks": "https://patches.dpdk.org/api/patches/56522/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 00BAB324D;\n\tTue, 16 Jul 2019 18:44:50 +0200 (CEST)",
            "from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com\n\t[67.231.148.174]) by dpdk.org (Postfix) with ESMTP id 828BC324D\n\tfor <dev@dpdk.org>; Tue, 16 Jul 2019 18:44:48 +0200 (CEST)",
            "from pps.filterd (m0045849.ppops.net [127.0.0.1])\n\tby mx0a-0016f401.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id\n\tx6GGe07D030153; Tue, 16 Jul 2019 09:44:46 -0700",
            "from sc-exch02.marvell.com ([199.233.58.182])\n\tby mx0a-0016f401.pphosted.com with ESMTP id 2ts07vc82j-1\n\t(version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); \n\tTue, 16 Jul 2019 09:44:46 -0700",
            "from SC-EXCH03.marvell.com (10.93.176.83) by SC-EXCH02.marvell.com\n\t(10.93.176.82) with Microsoft SMTP Server (TLS) id 15.0.1367.3;\n\tTue, 16 Jul 2019 09:44:45 -0700",
            "from maili.marvell.com (10.93.176.43) by SC-EXCH03.marvell.com\n\t(10.93.176.83) with Microsoft SMTP Server id 15.0.1367.3 via Frontend\n\tTransport; Tue, 16 Jul 2019 09:44:45 -0700",
            "from hyd1588t430.marvell.com (unknown [10.29.52.204])\n\tby maili.marvell.com (Postfix) with ESMTP id CCCED3F703F;\n\tTue, 16 Jul 2019 09:44:41 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com;\n\th=from : to : cc :\n\tsubject : date : message-id : in-reply-to : references : mime-version\n\t: content-type; s=pfpt0818;\n\tbh=EVSOL/gu2T5iCWpdxqIo7ayPHJhuzRSaASpsEYXLEwU=; \n\tb=JWFlbw4O4lSx38or+7ZdNa8oxTkkBIY2PpwDDNlaiWL3oUkZJhj3l09UjKvfMQ2p3DzR\n\t00tpjaeA0GXoLgRkGqQXm9OyeV4hMaGgPqdMIj/Ul+uGhDmNjBSEFjgfi5h/be4JuSdH\n\tRlkCDmlyZpHa1KbXopeBpNW3W5Dqh60uTTM0JRxPRXE7/daJFLImYfNn7R2vIp3e4P0B\n\t+anFMciqwcrKYMm7rcqWkilg+9zTozhM8ybXxTBIipLeI1fTjOwsSUStdXuu3wkDBBZz\n\tHt1MQkqYJ9DwJO/N4h5Y0mpy6BM36y34PiJVC43dBNfMhq7NDBKS2evPt0H0qiYTFM/N\n\t+A== ",
        "From": "Nithin Dabilpuram <ndabilpuram@marvell.com>",
        "To": "Hyong Youb Kim <hyonkim@cisco.com>, David Marchand\n\t<david.marchand@redhat.com>, Thomas Monjalon <thomas@monjalon.net>,\n\t\"Ferruh Yigit\" <ferruh.yigit@intel.com>, Bruce Richardson\n\t<bruce.richardson@intel.com>",
        "CC": "<jerinj@marvell.com>, John Daley <johndale@cisco.com>, Shahed Shaikh\n\t<shshaikh@marvell.com>, <dev@dpdk.org>, Nithin Dabilpuram\n\t<ndabilpuram@marvell.com>",
        "Date": "Tue, 16 Jul 2019 22:14:23 +0530",
        "Message-ID": "<20190716164424.16776-2-ndabilpuram@marvell.com>",
        "X-Mailer": "git-send-email 2.8.4",
        "In-Reply-To": "<20190716164424.16776-1-ndabilpuram@marvell.com>",
        "References": "<BYAPR18MB24241C91FEA95541CE94FFABC8CF0@BYAPR18MB2424.namprd18.prod.outlook.com>\n\t<20190716164424.16776-1-ndabilpuram@marvell.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-Proofpoint-Virus-Version": "vendor=fsecure engine=2.50.10434:5.22.84,1.0.8\n\tdefinitions=2019-07-16_04:2019-07-16,2019-07-16 signatures=0",
        "Subject": "[dpdk-dev] [RFC PATCH v3 2/3] eal: add mask and unmask interrupt\n\tAPIs",
        "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": "Add new mask and unmask interrupt APIs to avoid using\nVFIO_IRQ_SET_ACTION_TRIGGER for masking/unmasking purpose for VFIO\nbased handlers. This implementation is specific to Linux.\n\nUsing action trigger for masking and unmasking has below issues\n\n * Time consuming to do for every interrupt received as it will\n   free_irq() followed by request_irq() and all other initializations\n * A race condition because of a window between free_irq() and\n   request_irq() with packet reception still on and device still\n   enabled and would throw warning messages like below.\n   [158764.159833] do_IRQ: 9.34 No irq handler for vector\n\nIn this patch, mask/unmask is a no-op for VFIO_MSIX/VFIO_MSI interrupts\nas they are edge triggered and kernel would not mask the interrupt before\ndelivering the event to userspace.\n\nSigned-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com>\n---\nv3:\n* Re-org patch to move driver change to 3/3\n* Add stub implementation for freebsd.\n* Fix version map file for new apis.\nv2:\nMake change in qede driver for unmask\n lib/librte_eal/common/include/rte_interrupts.h |  23 ++++\n lib/librte_eal/freebsd/eal/eal_interrupts.c    |  54 +++++++++\n lib/librte_eal/linux/eal/eal_interrupts.c      | 155 +++++++++++++++++++++++++\n lib/librte_eal/rte_eal_version.map             |   2 +\n 4 files changed, 234 insertions(+)",
    "diff": "diff --git a/lib/librte_eal/common/include/rte_interrupts.h b/lib/librte_eal/common/include/rte_interrupts.h\nindex c1e912c..b0675be 100644\n--- a/lib/librte_eal/common/include/rte_interrupts.h\n+++ b/lib/librte_eal/common/include/rte_interrupts.h\n@@ -118,6 +118,29 @@ int rte_intr_enable(const struct rte_intr_handle *intr_handle);\n  */\n int rte_intr_disable(const struct rte_intr_handle *intr_handle);\n \n+/**\n+ * It masks the interrupt for the specified handle.\n+ *\n+ * @param intr_handle\n+ *  pointer to the interrupt handle.\n+ *\n+ * @return\n+ *  - On success, zero.\n+ *  - On failure, a negative value.\n+ */\n+int rte_intr_mask(const struct rte_intr_handle *intr_handle);\n+\n+/**\n+ * It unmasks the interrupt for the specified handle.\n+ *\n+ * @param intr_handle\n+ *  pointer to the interrupt handle.\n+ *\n+ * @return\n+ *  - On success, zero.\n+ *  - On failure, a negative value.\n+ */\n+int rte_intr_unmask(const struct rte_intr_handle *intr_handle);\n #ifdef __cplusplus\n }\n #endif\ndiff --git a/lib/librte_eal/freebsd/eal/eal_interrupts.c b/lib/librte_eal/freebsd/eal/eal_interrupts.c\nindex 10375bd..c2f487a 100644\n--- a/lib/librte_eal/freebsd/eal/eal_interrupts.c\n+++ b/lib/librte_eal/freebsd/eal/eal_interrupts.c\n@@ -387,6 +387,60 @@ rte_intr_disable(const struct rte_intr_handle *intr_handle)\n \treturn 0;\n }\n \n+int\n+rte_intr_unmask(const struct rte_intr_handle *intr_handle)\n+{\n+\tif (intr_handle && intr_handle->type == RTE_INTR_HANDLE_VDEV)\n+\t\treturn 0;\n+\n+\tif (!intr_handle || intr_handle->fd < 0 || intr_handle->uio_cfg_fd < 0)\n+\t\treturn -1;\n+\n+\tswitch (intr_handle->type) {\n+\t/* not used at this moment */\n+\tcase RTE_INTR_HANDLE_ALARM:\n+\t\treturn -1;\n+\t/* not used at this moment */\n+\tcase RTE_INTR_HANDLE_DEV_EVENT:\n+\t\treturn -1;\n+\t/* unknown handle type */\n+\tdefault:\n+\t\tRTE_LOG(ERR, EAL,\n+\t\t\t\"Unknown handle type of fd %d\\n\",\n+\t\t\t\t\tintr_handle->fd);\n+\t\treturn -1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+int\n+rte_intr_mask(const struct rte_intr_handle *intr_handle)\n+{\n+\tif (intr_handle && intr_handle->type == RTE_INTR_HANDLE_VDEV)\n+\t\treturn 0;\n+\n+\tif (!intr_handle || intr_handle->fd < 0 || intr_handle->uio_cfg_fd < 0)\n+\t\treturn -1;\n+\n+\tswitch (intr_handle->type) {\n+\t/* not used at this moment */\n+\tcase RTE_INTR_HANDLE_ALARM:\n+\t\treturn -1;\n+\t/* not used at this moment */\n+\tcase RTE_INTR_HANDLE_DEV_EVENT:\n+\t\treturn -1;\n+\t/* unknown handle type */\n+\tdefault:\n+\t\tRTE_LOG(ERR, EAL,\n+\t\t\t\"Unknown handle type of fd %d\\n\",\n+\t\t\t\t\tintr_handle->fd);\n+\t\treturn -1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n static void\n eal_intr_process_interrupts(struct kevent *events, int nfds)\n {\ndiff --git a/lib/librte_eal/linux/eal/eal_interrupts.c b/lib/librte_eal/linux/eal/eal_interrupts.c\nindex 79ad5e8..f619981 100644\n--- a/lib/librte_eal/linux/eal/eal_interrupts.c\n+++ b/lib/librte_eal/linux/eal/eal_interrupts.c\n@@ -197,6 +197,63 @@ vfio_disable_intx(const struct rte_intr_handle *intr_handle) {\n \treturn 0;\n }\n \n+/* unmask legacy (INTx) interrupts */\n+static int\n+vfio_unmask_intx(const struct rte_intr_handle *intr_handle)\n+{\n+\tstruct vfio_irq_set *irq_set;\n+\tchar irq_set_buf[IRQ_SET_BUF_LEN];\n+\tint len, ret;\n+\n+\tlen = sizeof(struct vfio_irq_set);\n+\n+\t/* unmask INTx */\n+\tirq_set = (struct vfio_irq_set *) irq_set_buf;\n+\tmemset(irq_set, 0, len);\n+\tirq_set->argsz = len;\n+\tirq_set->count = 1;\n+\tirq_set->flags = VFIO_IRQ_SET_DATA_NONE | VFIO_IRQ_SET_ACTION_UNMASK;\n+\tirq_set->index = VFIO_PCI_INTX_IRQ_INDEX;\n+\tirq_set->start = 0;\n+\n+\tret = ioctl(intr_handle->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, irq_set);\n+\n+\tif (ret) {\n+\t\tRTE_LOG(ERR, EAL, \"Error unmasking INTx interrupts for fd %d\\n\",\n+\t\t\tintr_handle->fd);\n+\t\treturn -1;\n+\t}\n+\treturn 0;\n+}\n+\n+/* mask legacy (INTx) interrupts */\n+static int\n+vfio_mask_intx(const struct rte_intr_handle *intr_handle)\n+{\n+\tstruct vfio_irq_set *irq_set;\n+\tchar irq_set_buf[IRQ_SET_BUF_LEN];\n+\tint len, ret;\n+\n+\tlen = sizeof(struct vfio_irq_set);\n+\n+\t/* mask interrupts */\n+\tirq_set = (struct vfio_irq_set *) irq_set_buf;\n+\tirq_set->argsz = len;\n+\tirq_set->count = 1;\n+\tirq_set->flags = VFIO_IRQ_SET_DATA_NONE | VFIO_IRQ_SET_ACTION_MASK;\n+\tirq_set->index = VFIO_PCI_INTX_IRQ_INDEX;\n+\tirq_set->start = 0;\n+\n+\tret = ioctl(intr_handle->vfio_dev_fd, VFIO_DEVICE_SET_IRQS, irq_set);\n+\n+\tif (ret) {\n+\t\tRTE_LOG(ERR, EAL, \"Error masking INTx interrupts for fd %d\\n\",\n+\t\t\tintr_handle->fd);\n+\t\treturn -1;\n+\t}\n+\n+\treturn 0;\n+}\n /* enable MSI interrupts */\n static int\n vfio_enable_msi(const struct rte_intr_handle *intr_handle) {\n@@ -694,6 +751,104 @@ rte_intr_enable(const struct rte_intr_handle *intr_handle)\n }\n \n int\n+rte_intr_mask(const struct rte_intr_handle *intr_handle)\n+{\n+\tif (intr_handle && intr_handle->type == RTE_INTR_HANDLE_VDEV)\n+\t\treturn 0;\n+\n+\tif (!intr_handle || intr_handle->fd < 0 || intr_handle->uio_cfg_fd < 0)\n+\t\treturn -1;\n+\n+\tswitch (intr_handle->type){\n+\t/* Both masking and disabling are same for UIO */\n+\tcase RTE_INTR_HANDLE_UIO:\n+\t\tif (uio_intr_disable(intr_handle))\n+\t\t\treturn -1;\n+\t\tbreak;\n+\tcase RTE_INTR_HANDLE_UIO_INTX:\n+\t\tif (uio_intx_intr_disable(intr_handle))\n+\t\t\treturn -1;\n+\t\tbreak;\n+\t/* not used at this moment */\n+\tcase RTE_INTR_HANDLE_ALARM:\n+\t\treturn -1;\n+#ifdef VFIO_PRESENT\n+\tcase RTE_INTR_HANDLE_VFIO_MSIX:\n+\tcase RTE_INTR_HANDLE_VFIO_MSI:\n+\t\treturn 0;\n+\tcase RTE_INTR_HANDLE_VFIO_LEGACY:\n+\t\tif (vfio_mask_intx(intr_handle))\n+\t\t\treturn -1;\n+\t\tbreak;\n+#ifdef HAVE_VFIO_DEV_REQ_INTERFACE\n+\tcase RTE_INTR_HANDLE_VFIO_REQ:\n+\t\treturn -1;\n+#endif\n+#endif\n+\t/* not used at this moment */\n+\tcase RTE_INTR_HANDLE_DEV_EVENT:\n+\t\treturn -1;\n+\t/* unknown handle type */\n+\tdefault:\n+\t\tRTE_LOG(ERR, EAL,\n+\t\t\t\"Unknown handle type of fd %d\\n\",\n+\t\t\t\t\tintr_handle->fd);\n+\t\treturn -1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+int\n+rte_intr_unmask(const struct rte_intr_handle *intr_handle)\n+{\n+\tif (intr_handle && intr_handle->type == RTE_INTR_HANDLE_VDEV)\n+\t\treturn 0;\n+\n+\tif (!intr_handle || intr_handle->fd < 0 || intr_handle->uio_cfg_fd < 0)\n+\t\treturn -1;\n+\n+\tswitch (intr_handle->type){\n+\t/* Both unmasking and disabling are same for UIO */\n+\tcase RTE_INTR_HANDLE_UIO:\n+\t\tif (uio_intr_enable(intr_handle))\n+\t\t\treturn -1;\n+\t\tbreak;\n+\tcase RTE_INTR_HANDLE_UIO_INTX:\n+\t\tif (uio_intx_intr_enable(intr_handle))\n+\t\t\treturn -1;\n+\t\tbreak;\n+\t/* not used at this moment */\n+\tcase RTE_INTR_HANDLE_ALARM:\n+\t\treturn -1;\n+#ifdef VFIO_PRESENT\n+\tcase RTE_INTR_HANDLE_VFIO_MSIX:\n+\tcase RTE_INTR_HANDLE_VFIO_MSI:\n+\t\treturn 0;\n+\tcase RTE_INTR_HANDLE_VFIO_LEGACY:\n+\t\tif (vfio_unmask_intx(intr_handle))\n+\t\t\treturn -1;\n+\t\tbreak;\n+#ifdef HAVE_VFIO_DEV_REQ_INTERFACE\n+\tcase RTE_INTR_HANDLE_VFIO_REQ:\n+\t\treturn -1;\n+#endif\n+#endif\n+\t/* not used at this moment */\n+\tcase RTE_INTR_HANDLE_DEV_EVENT:\n+\t\treturn -1;\n+\t/* unknown handle type */\n+\tdefault:\n+\t\tRTE_LOG(ERR, EAL,\n+\t\t\t\"Unknown handle type of fd %d\\n\",\n+\t\t\t\t\tintr_handle->fd);\n+\t\treturn -1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+int\n rte_intr_disable(const struct rte_intr_handle *intr_handle)\n {\n \tif (intr_handle && intr_handle->type == RTE_INTR_HANDLE_VDEV)\ndiff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map\nindex 1892d9e..b3b2df4 100644\n--- a/lib/librte_eal/rte_eal_version.map\n+++ b/lib/librte_eal/rte_eal_version.map\n@@ -309,6 +309,8 @@ DPDK_19.08 {\n \trte_service_lcore_attr_reset_all;\n \trte_service_may_be_active;\n \trte_srand;\n+\trte_intr_unmask;\n+\trte_intr_mask;\n \n } DPDK_19.05;\n \n",
    "prefixes": [
        "RFC",
        "v3",
        "2/3"
    ]
}