Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/56522/?format=api
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" ] }{ "id": 56522, "url": "