From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR02-AM5-obe.outbound.protection.outlook.com (mail-eopbgr00049.outbound.protection.outlook.com [40.107.0.49]) by dpdk.org (Postfix) with ESMTP id 40E678E01 for ; Thu, 4 Jan 2018 16:32:21 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=wO4HSPuqpC6jt2K4lxMTRgKwOO8w+dpVNS3IulEvf30=; b=x2MS14W3UIdgZzz2SUvUgIQwoLeVYX0KTkW+aR0Pg1j5gSjW6jvdwWPSD4hZiB5oHiL1Lp4VCg1Nif/ij6zq5v7pG5A0GgWLs2OGWXGOYEGeIDDDEWaQcGf2NGDYveSlo+b7IZyKbkNCfrwVjUUdgLzjcxK4j8qOJL3eRbSYG5g= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=motih@mellanox.com; Received: from mellanox.com (37.142.13.130) by AM4PR05MB3203.eurprd05.prod.outlook.com (2603:10a6:205:3::32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.366.8; Thu, 4 Jan 2018 15:32:15 +0000 From: Moti Haimovsky To: pascal.mazon@6wind.com Cc: dev@dpdk.org, Moti Haimovsky Date: Thu, 4 Jan 2018 17:31:54 +0200 Message-Id: <1515079914-178171-1-git-send-email-motih@mellanox.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1511186362-72289-1-git-send-email-motih@mellanox.com> References: <1511186362-72289-1-git-send-email-motih@mellanox.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [37.142.13.130] X-ClientProxiedBy: VI1PR07CA0203.eurprd07.prod.outlook.com (2603:10a6:802:3f::27) To AM4PR05MB3203.eurprd05.prod.outlook.com (2603:10a6:205:3::32) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: b9c27c24-aca8-4434-c3d9-08d5538855ef X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(4534020)(4602075)(4627115)(201703031133081)(201702281549075)(5600026)(4604075)(48565401081)(2017052603307)(7153060); SRVR:AM4PR05MB3203; X-Microsoft-Exchange-Diagnostics: 1; AM4PR05MB3203; 3:4WZoEtxOnRG/8KKNr8hzfWHJoYyQYX41CVX8w26YkHg2hdApC0JDf+x9kIRnjQEhqTM0XqGpTIbRlqhpoW9gEKHRK65B4rNDdbLLjRsjO3Fiz5CXAMc/mXtX3QyyJlVHm1l1Js2gaR6bS46jkpntJFrdMyyMBQjcsGbfFkZl1QncPRmI7SiZXXcr9Z2F8e2cHRzXybk5gL8Oqhj/mLI79lanjHDHJ3Vw03ZCEpaQVZ3njcLy66xZEnuN0N0Q8PuA; 25:2E8n4H01ok6suhg0A33rJn2KR56LQ6unkQpNXbjGwnajDHMENvFBwya59N0+sAp5bc9kQxZtMaVk/gpci3ii3Z03iaLQlSExMP7If/oBRfmNgwUZx3EVo2Zh74TVNCFOcQrSYIVJjuP3P/a/SlyhMLRkIFlZIrFwFR6IJyc3+lcjEF9cZpeI38+rGx0Mo01f+qTsCMystU6NWYtFaGp6MBitbYCfbU16AtGQ/Xn1bMAX6ezoowlwVOiWjcGo5V+ggLRDNASZc0VRd5QfLx7ob0eSb8qXmKQTf1E1hOrU6wHKtzY9UBK1CtBxoJN5r9lEWYFfHLxgWwsqHbbK+F0xXw==; 31:zVpRsQdVvrGU/nHg8kdaVvz99smc88sLjIkB94M2F/RPr20sXDWcXvROnH54WDfn25pr+XTZ55UqZ7phS5X0Zq4/yGHf+PP6D8XDej33rDbz4oGh/kYZskEFWMIiFlGx2r9GMID3G8fEVAkvK/k5PjPePcbJij6r/e4w5atntqzHWMX5Mr2pqIXv1xOb6aLePWX7VJiURcghQASXCzdqaLhoq87ItUW6qz83x1vxSxA= X-MS-TrafficTypeDiagnostic: AM4PR05MB3203: X-Microsoft-Exchange-Diagnostics: 1; AM4PR05MB3203; 20:h4/sMjLd7XkTV5tD/WE0QAzd1ao+sNOaToRFMZyXKUmaE0zt4U/vCTRlot543WvuOGxgoHppSDRm63/Hw5vk1/tuG4B4Ld/oXnSZA9wJ/OfCQXp5eBxdbKP94Q3DQxx/Uubsf/JrV6w3OBhXYtmcdQvTG/QRSEWovNLYRxz38itVxkdsxLuPMEa66OUT5TARUQ9M6Snxjs3ZSrCyYDwG8+fXtpBF/7gUdlesg9X1ZR1QguCPSabHx/VTgEk+1NaIAljXM/cqbAIE7qvXeLOdf0tbA9AVY91fSVcBhskFKPxtocL97uvcxWntrRFUrwAwzfrX5/CsXy6svPyS1dCD+BB9TpJa+9PaPDSIMPAmmRAlrLhTbPWbR6AtyYZha/avpu48H9eOq2kwCCm7TQYx6ioz9sB7D9lRffdC+Dkv+r+l8iAoi65uKsyHEWE45uliP3pOIJHoPREIfwqDic/9h/kkHT8XPrMjo5SNfJu0drM6fhByDEwndkCqCaM/al4S; 4:R6wLN3WBtTF7c33Fu7H7z7kdn2gDPE5tSild5NPzBWV9A4rV7oDoaBJ3tgtznoS18+eRz9cQtnRF4N925EU2Ny/PrlFxMdqSGurpHi+X+S+6stwHB3iB4xlia41wHx/xZmNjX6yqVRe6g2tMngBGjzTXPLswYRxApQVDlmwaVYXW3PcI9kQ3OlQsHEPOYOx3iWAnqP2hWvr0vi6kluv3ZTdLz+w7Tm3gJW6NWfSiKaT3jftbaV2qNJ0AUHIDidNgtOgzSPQ9ENEyGdkwAVVjHsQTddySQmkVBlQltkyuPjRBHsiDkD8sPYb8v3ZeY+T2 X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(278428928389397); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040470)(2401047)(8121501046)(5005006)(10201501046)(93006095)(93001095)(3231023)(944501075)(3002001)(6055026)(6041268)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123564045)(20161123562045)(20161123560045)(20161123558120)(6072148)(201708071742011); SRVR:AM4PR05MB3203; BCL:0; PCL:0; RULEID:(100000803101)(100110400095); SRVR:AM4PR05MB3203; X-Forefront-PRVS: 054231DC40 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(39860400002)(396003)(346002)(366004)(39380400002)(376002)(199004)(189003)(59450400001)(2361001)(3846002)(36756003)(2906002)(386003)(47776003)(7696005)(76176011)(305945005)(51416003)(2351001)(5660300001)(7736002)(52116002)(106356001)(107886003)(105586002)(66066001)(6916009)(50466002)(6116002)(2950100002)(97736004)(86362001)(81166006)(8936002)(16526018)(53936002)(33026002)(575784001)(21086003)(50226002)(4326008)(69596002)(16586007)(68736007)(48376002)(8676002)(316002)(81156014)(55016002)(478600001)(6666003)(4720700003)(25786009); DIR:OUT; SFP:1101; SCL:1; SRVR:AM4PR05MB3203; H:mellanox.com; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: mellanox.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; AM4PR05MB3203; 23:9cPHHTMuMET55aIsbw2gom6hz6ebJiKeiDW7Rba6E?= =?us-ascii?Q?o7h+cvsDw2yfGj4JAMs9wmslBLVfPqp+6mbJa3zqsv1Uk5UapFVLcooQipUw?= =?us-ascii?Q?eABi86sAjHLAGKbEf3xS7gUWcjF4xOSAclpLmuMc5Kt5/hXEO03usBGpCDMA?= =?us-ascii?Q?/wTlYYn2epAPBL7pwpZRQFuJWA1BVq+aakhJT5WpgvGoYTnpIASXvgBzkDtT?= =?us-ascii?Q?PO1k4QShMQ+5z9JhCRfJgLiu4xXuLsNFyuki9em/h9UAqjmF2sBeklQA4iJc?= =?us-ascii?Q?XUhn9AXS2u7D1TOKXdy1DY+s2GBnQgRKfSjOBJbPuC+4IHSdptiqr5aa71Y5?= =?us-ascii?Q?bdzAEdRgXmMZu76MohOwGOIGrn5tFLIC2KJH+ttbVqa+3O+N9bqSd8gMqxF5?= =?us-ascii?Q?pLNmJUCMEpvmOHy77ggo2iCk7H8o553hDuidcEUKIOrg81yYnbp6kwQjGvC6?= =?us-ascii?Q?MlVmY99vrZWSlV/j2Gsm3995ScuO3b96wV+GMR4txsenJjJpDF5fKln1VpYB?= =?us-ascii?Q?phdwawaTGKMBajugC3E4GhoG+9FhQtdU+1hq8TlxuCJmeOvU4HHwFAnjMsAR?= =?us-ascii?Q?cl/GR1hUiLCr18ze4hNDztjzidZzuKysRX1XSMfEn9+T0nqxbbO6JY/q/cyG?= =?us-ascii?Q?UKpGzX0ZdtgYJfOCo/Qt8W28DnWouCO7aMxvV2jptp9NgZCLUUNE26twCaHm?= =?us-ascii?Q?qqLfRuMYfeTAZNDdO29ALNCTueWLaLk93RL+qwgMLYKWVxVJxs/votpJCjYP?= =?us-ascii?Q?ZOuuSdxHS5C2P0Dp8eKyLdyDRmTjBMaD1HjficYkPhAMDBGV1Busmew46od4?= =?us-ascii?Q?voMDTC+zNDwtRaXIdu70yNcXTeyCvFdzSMdft9Ozs1a/nOe9o68ZMEJZfRNG?= =?us-ascii?Q?bQaunK6mXwnimnZu/8sf0DoSLKcdc0loxhUCU/YlSEy9GnQRaYtHoAj6PLPa?= =?us-ascii?Q?qRDztDqf1J8bLu4XUNosIuZZlqzeI1sz7pKVsVp4x8/OLox2l/v1P405c7Qh?= =?us-ascii?Q?UnjoRxSHtIGxSM9xROsKqCqAVTjJAVkRfzBHwSJtmu2SVPpuTBHMty/qG3nD?= =?us-ascii?Q?axamjE7yZ/4Rj1AzppFeWCpwPZNyQmEFRCJmfUfVjA4lXSDGttBgi9P9x3v0?= =?us-ascii?Q?LJtXJ+Vv1LyE2Uza0HAxcmj9njolwlXot6VlOsNETqoyJqEeu7ra1tw055un?= =?us-ascii?Q?rCIYncsMjiRW6V0M9Sr0KDFCzxwkQasPN4lQwfjA419WtJavQwZHfq/4nZZq?= =?us-ascii?Q?KpF5biPijCPcNsl9go=3D?= X-Microsoft-Exchange-Diagnostics: 1; AM4PR05MB3203; 6:XsmKhiAD5KYO1zFHANvNg2RChsuFxlFPP5x1oouIDfg6oSVw1ZPlS9v1GUQoQnfa65ZY+xEWIq8tEQcjT0NUhuC8AMRRec8Nwo+xtW4fWD3EGyp/bHUgQPWGssixil3wxgz4bbl5DmIGRExWnpxJxI6ummaecem0nXIWTIfRBI/X0uTtwHpPWxYAQnQOVr3Qtf1u/fQXhk1d90PQFF2XGe7wlOV6N3ZckXl/+sEJGCfkh2mB7aUV0iJYO7u7uVH05V8X8+E5L+682TA0nRn7xgnwCb2hUUnv7mPonhg0/ofavN+O7P4TuWMCWcVn29CNpOz6WvS1bhibjHC8aSg8gnxFtMqVoZQXtPDGRuOvTNc=; 5:4Pl+uRC65wWZfWwUbbjYYozkiTTaVErcTL1wKkWYbBye5mhUrr3oKrRaeGQMcCSLtdi/aAwrYe1qY8JsNTXVMhiMzTvgnTJ0eRZj/zTsnkEpO9PaJxnDLQY4+pJjvUdQVIxBEh+gHXHPLWba7Z1MXAECU7i/eWGmAAxJhaf7yT0=; 24:byeGrvhQ3uSxAjes/nbWivl1UhRZWmVcpy103acb6UGym4yOZtrT1apf7nOSddtm9OeirgcutSI/D7/QMCAV4jgvozvdZCOmybZw+/Wi8KY=; 7:qSYixntlUCcYQJSzulT7sdYqjy+FZnqPUQcuWcRebVZi2DU0S0HE0JXGXxtqQC2yQ27t6xf515iR1TzKDNT+foF/m9y6wrBT5KAK+2i+Qjso+C8BcDQ3AscG1iwi3vqG39CtZtB0r0q8Vfm44fj/ZmPYz6T/DMYdy+lvxTG27qqO9Ar3irN8Ci9hGp61eAamdxjxKqC4w1dGvQ9xU4k3G4zIu6Cu8/vpT25FX0AocdZhZRHgvaNCrACCg6RhAYeI SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Jan 2018 15:32:15.9914 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: b9c27c24-aca8-4434-c3d9-08d5538855ef X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM4PR05MB3203 Subject: [dpdk-dev] [PATCH v2] net/tap: add Rx interrupts X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 04 Jan 2018 15:32:21 -0000 This patch adds support for registering and waiting for Rx interrupts. This allows applications to wait for Rx events from the PMD using the DPDK rte_epoll subsystem. Signed-off-by: Moti Haimovsky --- V2: Modifications according to inputs from Pascal Mazon * Removed unneeded counter limit check. --- doc/guides/nics/features/tap.ini | 1 + drivers/net/tap/Makefile | 1 + drivers/net/tap/rte_eth_tap.c | 17 ++++- drivers/net/tap/rte_eth_tap.h | 4 ++ drivers/net/tap/tap_intr.c | 138 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 160 insertions(+), 1 deletion(-) create mode 100644 drivers/net/tap/tap_intr.c diff --git a/doc/guides/nics/features/tap.ini b/doc/guides/nics/features/tap.ini index f0e893d..8bc5187 100644 --- a/doc/guides/nics/features/tap.ini +++ b/doc/guides/nics/features/tap.ini @@ -7,6 +7,7 @@ Speed capabilities = P Link status = Y Link status event = Y +Rx interrupt = Y Jumbo frame = Y Promiscuous mode = Y Allmulticast mode = Y diff --git a/drivers/net/tap/Makefile b/drivers/net/tap/Makefile index 405b49e..6636b77 100644 --- a/drivers/net/tap/Makefile +++ b/drivers/net/tap/Makefile @@ -54,6 +54,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += rte_eth_tap.c SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_flow.c SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_netlink.c SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_tcmsgs.c +SRCS-$(CONFIG_RTE_LIBRTE_PMD_TAP) += tap_intr.c include $(RTE_SDK)/mk/rte.lib.mk diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c index 6b27679..7e6de68 100644 --- a/drivers/net/tap/rte_eth_tap.c +++ b/drivers/net/tap/rte_eth_tap.c @@ -1127,7 +1127,7 @@ enum ioctl_mode { } static int -tap_intr_handle_set(struct rte_eth_dev *dev, int set) +tap_lsc_intr_handle_set(struct rte_eth_dev *dev, int set) { struct pmd_internals *pmd = dev->data->dev_private; @@ -1152,6 +1152,20 @@ enum ioctl_mode { tap_dev_intr_handler, dev); } +static int +tap_intr_handle_set(struct rte_eth_dev *dev, int set) +{ + int err; + + err = tap_lsc_intr_handle_set(dev, set); + if (err) + return err; + err = tap_rx_intr_vec_set(dev, set); + if (err && set) + tap_lsc_intr_handle_set(dev, 0); + return err; +} + static const uint32_t* tap_dev_supported_ptypes_get(struct rte_eth_dev *dev __rte_unused) { @@ -1284,6 +1298,7 @@ enum ioctl_mode { pmd->intr_handle.type = RTE_INTR_HANDLE_EXT; pmd->intr_handle.fd = -1; + dev->intr_handle = &pmd->intr_handle; /* Presetup the fds to -1 as being not valid */ for (i = 0; i < RTE_PMD_TAP_MAX_QUEUES; i++) { diff --git a/drivers/net/tap/rte_eth_tap.h b/drivers/net/tap/rte_eth_tap.h index 829f32f..fccc4b8 100644 --- a/drivers/net/tap/rte_eth_tap.h +++ b/drivers/net/tap/rte_eth_tap.h @@ -98,4 +98,8 @@ struct pmd_internals { struct rte_intr_handle intr_handle; /* LSC interrupt handle. */ }; +/* tap_intr.c */ + +int tap_rx_intr_vec_set(struct rte_eth_dev *dev, int set); + #endif /* _RTE_ETH_TAP_H_ */ diff --git a/drivers/net/tap/tap_intr.c b/drivers/net/tap/tap_intr.c new file mode 100644 index 0000000..544a257 --- /dev/null +++ b/drivers/net/tap/tap_intr.c @@ -0,0 +1,138 @@ +/*- + * BSD LICENSE + * + * Copyright 2017 Mellanox + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of the copyright holder nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @file + * Interrupts handling for tap driver. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + + +/** + * Unregister Rx interrupts free the queue interrupt vector. + * + * @param dev + * Pointer to the tap rte_eth_dev structure. + */ +static void +tap_rx_intr_vec_uninstall(struct rte_eth_dev *dev) +{ + struct pmd_internals *pmd = dev->data->dev_private; + struct rte_intr_handle *intr_handle = &pmd->intr_handle; + + rte_intr_free_epoll_fd(intr_handle); + free(intr_handle->intr_vec); + intr_handle->intr_vec = NULL; + intr_handle->nb_efd = 0; +} + +/** + * Allocate Rx queue interrupt vector and register Rx interrupts. + * + * @param dev + * Pointer to the tap rte_eth_dev device structure. + * + * @return + * 0 on success, negative errno value otherwise and rte_errno is set. + */ +static int +tap_rx_intr_vec_install(struct rte_eth_dev *dev) +{ + struct pmd_internals *pmd = dev->data->dev_private; + unsigned int rxqs_n = pmd->dev->data->nb_rx_queues; + struct rte_intr_handle *intr_handle = &pmd->intr_handle; + unsigned int n = RTE_MIN(rxqs_n, (uint32_t)RTE_MAX_RXTX_INTR_VEC_ID); + unsigned int i; + unsigned int count = 0; + + if (!dev->data->dev_conf.intr_conf.rxq) + return 0; + intr_handle->intr_vec = malloc(sizeof(intr_handle->intr_vec[rxqs_n])); + if (intr_handle->intr_vec == NULL) { + rte_errno = ENOMEM; + RTE_LOG(ERR, PMD, + "failed to allocate memory for interrupt vector," + " Rx interrupts will not be supported"); + return -rte_errno; + } + for (i = 0; i < n; i++) { + struct rx_queue *rxq = pmd->dev->data->rx_queues[i]; + + /* Skip queues that cannot request interrupts. */ + if (!rxq || (rxq->fd <= 0)) { + /* Use invalid intr_vec[] index to disable entry. */ + intr_handle->intr_vec[i] = + RTE_INTR_VEC_RXTX_OFFSET + + RTE_MAX_RXTX_INTR_VEC_ID; + continue; + } + intr_handle->intr_vec[i] = RTE_INTR_VEC_RXTX_OFFSET + count; + intr_handle->efds[count] = rxq->fd; + count++; + } + if (!count) + tap_rx_intr_vec_uninstall(dev); + else + intr_handle->nb_efd = count; + return 0; +} + +/** + * Register or unregister the Rx interrupts. + * + * @param dev + * Pointer to the tap rte_eth_dev device structure. + * @param set + * should the operation be register or unregister the interrupts. + * + * @return + * 0 on success, negative errno value otherwise and rte_errno is set. + */ +int +tap_rx_intr_vec_set(struct rte_eth_dev *dev, int set) +{ + tap_rx_intr_vec_uninstall(dev); + if (set) + return tap_rx_intr_vec_install(dev); + return 0; +} -- 1.8.3.1