From patchwork Tue Jun 6 14:48:29 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Moti Haimovsky X-Patchwork-Id: 25073 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id DCDCE7CAF; Tue, 6 Jun 2017 16:49:10 +0200 (CEST) Received: from EUR01-DB5-obe.outbound.protection.outlook.com (mail-db5eur01on0040.outbound.protection.outlook.com [104.47.2.40]) by dpdk.org (Postfix) with ESMTP id CA0A9101B for ; Tue, 6 Jun 2017 16:49:08 +0200 (CEST) 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=Tg5JJUn+6vx2rnU7+bRYi77qB3uQ6zMmEUUgOM2h5qo=; b=Rs4PaLyj55FL1o7C/R3wwDrzjHGEGdiyy1Asp1BEn7aCZKQUOEGBvyxqUNJBFfKQilVDv4UsK6Z0M8jyEVhubME0tQlqgWDBgzuiOf4i5G+qiffs9CZLq0O5PViaLslQhbt3LEDRdy2Kx+IJESMwQR2OilzcDwJMYLyczwgr9jA= Authentication-Results: intel.com; dkim=none (message not signed) header.d=none; intel.com; dmarc=none action=none header.from=mellanox.com; Received: from mellanox.com (37.142.13.130) by VI1PR05MB1920.eurprd05.prod.outlook.com (2a01:111:e400:7b79::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1143.10; Tue, 6 Jun 2017 14:49:06 +0000 From: Moti Haimovsky To: ferruh.yigit@intel.com Cc: dev@dpdk.org, vasilyf@mellanox.com, Moti Haimovsky Date: Tue, 6 Jun 2017 17:48:29 +0300 Message-Id: <1496760509-152931-2-git-send-email-motih@mellanox.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1496760509-152931-1-git-send-email-motih@mellanox.com> References: <1495987898-70002-2-git-send-email-motih@mellanox.com> <1496760509-152931-1-git-send-email-motih@mellanox.com> MIME-Version: 1.0 X-Originating-IP: [37.142.13.130] X-ClientProxiedBy: VI1PR0901CA0107.eurprd09.prod.outlook.com (2603:10a6:800:7e::33) To VI1PR05MB1920.eurprd05.prod.outlook.com (2a01:111:e400:7b79::19) X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI1PR05MB1920: X-MS-Office365-Filtering-Correlation-Id: 18470649-1371-4e21-cf07-08d4aceb2ec6 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(48565401081)(201703131423075)(201703031133081); SRVR:VI1PR05MB1920; X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB1920; 3:dJvy6H1mW0YHkuclT+hZ+x3BybKUtn7/qKvii4a2eCf+7i+cCSQwWtlyfs3GCEDUODbH648X4yAtDAZkO/9WtsRVH/TfHYWqWlthhlHV49kTlSXGuSUa7alCAfImu8lm7FTx0cdrQN1y/pduz8Y5HK8W4qiDut7lACrg1wAyiPszeJAfUtzw9+lLhJL3XYMO8KQoPjfZ1tsnZvY46FjKn5HV83PGwFjHZNQnyVTFv7/U47Y3G7aShSQU1N9ejICvm7e8id1LPTuZSz4uFYSPxSn8Z5RW7DzgBU6xPMm3bpZfbQgGinTkF63x1YmZ8gAY4ezBfpJ/uO8/fr4EBk5X8Z5dRAu7+qlIcqEsj1fAgUc=; 25:4ZU7VIhqhX/P6NPJWlDPN/whUHaaAFgV4wSW1lGCjojWm79a52iUpB7SZ0a547qQGrt60FR4BaWnljtuuq9akqVPeQ8bkCF5T689ZKvIb5HjYGo1GYMkQ5GzFmnXSC+36TAfpgPKzWZsnxVtz4WfeUV9e9fmxK2ZJbn8KDDBqV/YnEnodYQ8Szlfj23qxbeXCu7YaCwAwUd1A3BlGwTcfsSFgF65kbUnfL68zoRTjj8rykN3G9Gd86pnFg/fDn3FwASPx2amnty1RGuOgxnvceNRP1h6/SR4in6NYlqxKmDwbNacysTSEM58e6LN4Iut72NadRA1+LVd4dZ797Z8xRwijOM8SM1VhUkzSNaOv3pLdODiOzAQnWQ52fGgrMjUUm76IqaojA129L521Xy2ZhqJcDzJrHpB+tBz6MC/ch5kKnQ1yeRg1R/Q3+Pri0nethGNyTxpiEvjjqvuOQ3rahXl7NUz8TtzgKLSt/kshSk= X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB1920; 31:iWc1i+zSy40PRzkPYRZzBc8vGeUX0vOluzNgIqJvNAN6w7yDRk71tCJ5VZckEl2w4gklWleYPUM2mJI8onWOA2u/ffpCCgkUdDBM4NQHtRcZY4x8l+a0+harCxN40kUdn3pwaAb9bJ0plmRgHNwJGocKoLvV+xEhN34UoF/GX81l8i0RupxbO/SN6MJkbLNY+5VhefkZqfRH0CNLMr5LvsLSLiN+XKyw7zp4g6tPJjAfy1DbujhMYSrPSkKfkj2SiIFcW2Yp4xDaURX6Pgh7RA==; 20:yYnwi0gSa5RLdtNAqI5pAieZMOeivqaWtwpUkjHCo0juSf/O+RuVlkDmSVSMV0GLSoaOJG4vslL+Uwh5hIDdC4pmEOXkw+/XU+Vx+wm7/O5WWkZIz6jk+c6JB8Ce7JegUl/x0j8uusCoB2TzV0WjeUrckCuuUvZOPbBgHc/viG9gwxM3+3/FC05NNcT4YvD0SGAxVqDJIgRsGQ9C7xq7Rald4OSv+THPT6AaigoOsx0Msq7a9oL+zm3CHfUYkJWodwvLSNIrD+G2ji3BBUy9qPSJXNV1USp55vCwVdM/bB9yMXynnS6zif87gjXbgvOuR9Ji605nRrbeDM9yA5Qig5GDnBcXm9Ao8TrEuavyBM+UN+uhvkcjr0HTremajU2zrbuzVpOQz6PMcKbSp+H54ulBmNV90Zd8gAn+/RFTzEj6QMUGNFxtCHOGHqfyYCpEP1ILcSacboXkKNU5fOwJgtXVSd14ekdVEInWCRY7u7n0f5rGhlf1z95peLkztArK X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(8121501046)(5005006)(93006095)(93001095)(10201501046)(3002001)(100000703101)(100105400095)(6055026)(6041248)(20161123558100)(20161123564025)(20161123555025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123560025)(20161123562025)(6072148)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:VI1PR05MB1920; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:VI1PR05MB1920; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR05MB1920; 4:6cSwWzic7ZmkFCYW2dio3booxCg4IQYzxKTdL1bKwJ?= y2D4nx1KRpT2HCywO2XzCpm6njtaC6HYnNi9Dm/F7QCA4hgX3kBBShFyOPIdoV6TRVtRiEL0kp2vsKEdFJGB4DRUN0f6N1O3rJCFTIoQwmGtwJAZoJL0tfrYM8CGHe1bMxEVQspZWvQkkSBUqV7O9kyjZidCf/BzVBYmZmOiu89El/8v1eNXXWtNbshQEuCCqeA3YL0WvbGd969TP5YhdAi+/pRuD6uRi2uwfvlCsAXaQ6DuhLjqcu0EAWWG9vYcvGmfcFZTBiL5UAWQrXsP6PvQCcWggnK5jXA+SRHsFB7KxboI8T6UsGPp8Q94iIDAbnTOCPyi/NzkAsI5qBSZwFfY6kfhUCGKJDLP+ezK9hB3oLlr+gKAY2WWehAxjVUQLHWdLyS7uZ7qcqXe1PTyYkQSB4YAeVoNshjMm1OpR9rs0JTPRKpVRV9WE0FHXpWaFfaOMxncFXLcrVp8fJFI6tsl4zk7ot/W9Dt2lhYmN8Jts/FRsm3NKOwOGjWym+Y4eGNnJYmjvw3weNf29kcHnMeg42yDEgBV618eAP18tp5GtoQ5F1zrXWCUJOtwpLUUSsHlRHxhVTuRFgVeQqXZ/nU6nDYCIIUGVpD4MpQ90qqNJojsAfZ7/WQM3IxAf/bIYjLq+i7StFROLlEtFXw85vj2EkOvavP/WzE0H6CaTYigR8mMFJ1jaX5VRV4HrZ9ISEF+3RX6qFOQjajRJP6osZQethFTqNODq+XRFqQDo/8TEGtXqj3IZ/uVY+DKAI1A3IBHVZD9C1x6B56Rk98jGj9eluj4q2Q9MIc08yk/uNY09PAvWMxmpJVBuwY25Mphl7/k5aS+sz2v1MFLpsi7NQYXQ8dAPqMNxjdk6/TJX32f+tCuvHaiBFoNo7Rd36NlTIYtQwtLNb0qsPaHca6eWfXF2dx8TQjirDC1BXUQvYncXKpIZFfno/B9XqOR/UG6B/P4+VswfYS3VgjFmKvj49qjRSsEnEs/reXIJ9sldo8s+y6dFMmzqtrC7QnHI13ZY+QgbSaw+VCv7miqCbT6DW5tfOzslNTV5knQEa/HQUWourxMXIepcexwXxVsx3+YT6eDdvQ4b9DO5u0c6yfoOqXtrwIYSMOHxnc4ClU4JJdA== X-Forefront-PRVS: 033054F29A X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(6009001)(39840400002)(39450400003)(39850400002)(39400400002)(39860400002)(39410400002)(6116002)(6666003)(4720700003)(3846002)(5660300001)(189998001)(2361001)(42186005)(2351001)(81166006)(33026002)(2950100002)(48376002)(6916009)(53936002)(8676002)(305945005)(7736002)(50466002)(25786009)(110136004)(86362001)(2906002)(575784001)(4326008)(36756003)(5003940100001)(38730400002)(76176999)(47776003)(66066001)(50986999)(478600001)(107886003)(33646002)(50226002); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR05MB1920; H:mellanox.com; FPR:; SPF:None; MLV:sfv; LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR05MB1920; 23:RnBtiiF5bvgC1CZQVmq7LfdqySp35LAABPZKp+9zD?= isFEfvxQGY+S0csLjVgkHhqV3Elqmn8BO+lUqg+7nDCISDlA2qPDHIj60AridRuJbkYwwJ5oecV11/ri6V8/+g4pI3ZXnFDDYhzy5Bonh9SDcxHLWqI4eWU8G2J1NqRF8ExYQ9tJeRFIU2cQHt7/Q6KACRVBe8sNlhODjNX+DFN+c/zYBvA4FjXbOQ/fqRJswaUW3eRpCb24o+Oeb2NcePZtdB6Oj7EKlrjNclDnr1dSrvLH0lzUceS+Zxb/ZNKsf3+I6EPGSrbKPzTuPNlRy6wd63EI3qoxLFw+v9CWkau67xCLb2/Lj9ZHBOM7g5v7RsT26jnIn1oD0aWq6QD0VPzppWdEMroC8FO/CeATVOmS95fg1J67y7fJ2JEpKO1sPRTy3vG/9WdOaxTf4LyMzmkCoe+7t9LJoqfWTp9NpgMYB+UzR2CQlDXkTopDqMVCF9VBly+hS6rHScHo+VNMI9oMN6k7KPhFsenO5H5Knpu0k6pLgivnVnCvw6gkrtsiF5Za6/YM7rJYFkfFa/cV9Q8zq7WXZbqfDv6HfyEBwE8IENw3PdBlSAKBfoVwpgXRLB2xp57ElnLBQGM/UdhqUaHyXA54+wfMvCo8AkTcW1aY2JGWLLBmjHHmRAcToB3MfRzabnK4DyUag4bWNoHVJc068cInhsZbYPbHX2F5zCBxAoS9aHzmDWrtyevto9jxoBIN2U4Xk8z7Ih7gVU/ZW2xjRkxBvI36ofINHoUMnu8d0tJ0BiXG4S7cVYL5boOh8F3KNKJghD4QE8xEQtEleJF1Cdc8uePHp3U8xSF1bifV5OpVI5NRT7cKtwNoAZ7SpDVSTqNbCnqVixp2+iDpiS3+LgNgYWCjntbJEjNfWzZOGkyujkFixqFp+HfCNbjrBH6grV95NXU0hCJ+Y53uim57+1tgwlGSlgOKnUz0P59GILj89rOPP1MKTOolBcF0QD151Xpe4wDp4YXkTbmiGi5jE0D0iIXzi2PUjWZu+gNbA16BfqZctTWpaPKz0vBPIFUj8/H2Xj4pRqOpzMzP3mysmAc9ulkMsxDdlQBqL9ml405Yzq296qgSRtKt5b9WWc= X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB1920; 6:XW0AG9rqH775QVH0G8pvg32EbEO6BvnvI2mVYTtSRs4Ew7JSxZqY9XLzPeqJ6a7VsAilwE5YgfanlhYUFbpCO56qA6N+4HaK9glLHhwkfA90RUfjEU6dqdww0DipVodrcTt38tiATonfqo3STpSR6PI4WvyoE77uw3GqqnP6LFpDELr66UfoObjmoJtg4g3/ZcLrtzKl3Rghv/TTnZ8h/2ZX1hsxw3uWhv1Ge5HuwtCyCo7uPQD8j5/5idSCy/eQD7Bs13QLxaXU2aG/4YM4dfB9CtZL7b0id8qg31HJeT4yCvmsFIni4uPTfZcV5LL5isYH8OXqdvE8XhNG6PXEwtyTSgN4wRGXCdBO3Bf7PIFHbuw9Qz9mYZE2j4qNQKk1vO7HqisoPNyCnDry2Zom0yscx7pCvPVObmBdtqGSA/KHAsECWjmQhdE55vRivfyNWUfjd/AOUwaXdoCiREP5u4p+Ni7bO1yviNPVvY4qPeOu4KfWqwcSx8aNbWu2QMCjhOpKA5hv3o7KKSwi0JSyADoKJUMc/F6onGvUDJzkzMg= X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB1920; 5:TaxMoBmWjooET5c98f18ZA4VSGR+Z8B19xC81hIj5Yon029qj3yjc56v4UceRoMhjT/VTeFK8+ezhM2dCkM4iXAeKLc/SG0XtQIzu6docbxmraH+QhMgkosSp2HYfyv03RItIJrIwoxiYWFXI/1EjHyTDag/2gEf1fMK+6xx2lxbWlomWm6y4dkf96ntUy86N/5sTWZONvDW4cBTV/eFULK3JQf8p5yqoFgGiKsg4f8501tgIi4vUoy8q+zuiUoM774amg4Xt2H3zoWFw9mb2ziYqJN8wXVItKt6sIO1dy2+EdclCw49phGIX9VoNMzyGt5X/atI8NHvHrf46TuyM7NRf6t/PG8upeiu370/txOxhE/DOugbJT1rku5PrUvOs2EZLrAUjYrKP7xhf9H5mDNCSadQj2eEBYjq0fQqXk0zR4qYHgx/4et54fJj1vkRqPkWexIOd4DFdcdcVUeMySCCwwOBiDefu6CRPDkV/AK9RykXpSteQLxDVbpsFOj7; 24:/2pAnWu6Fg6csYJQ7TLHPbU1z+R89j/KoHwEpRrE94SuN9DMMRxCkgWgYTGfwCTUqHgfsRx1PJACU1CeBUUnsqlcx2KM+w8qVBJO02R+Pdc= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB1920; 7:nEBcCCx2F5vhWkKi9JjMi8s/XIZg+E9Yux2pera00IZ4T2C0PMAk0niJ2P6EPsFcFVh09kbLBlz7rBfvjFc/w+JdQWJ8Xsb236ORnbrpZZxrY3NMthr/nRuY7tCtXuiQZI/bDpNgnQuNnycwcfbJl9+tbYPffA3KB/ZrUMW8XniJnU5jbrhziqJQy1GeH8L8luvWjIxSsNzo+g3Zpf03WA5lqH6F80PSJRAPHJ0PpKMCE3+hT9gje4TheQRb5855mgPhKcWMXA8YnU0++2vj04kZJRBVoawQurDvs7KuG35bRwDDeKyKQPhap1jR29T4Seubv4qWtzRyp3z9n38aiw== X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Jun 2017 14:49:06.1009 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR05MB1920 Subject: [dpdk-dev] [PATCH v3] net/mlx4: support user space rxq interrupt event 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Implement rxq interrupt callbacks Signed-off-by: Moti Haimovsky Acked-by: Adrien Mazarguil --- doc/guides/nics/features/mlx4.ini | 1 + doc/guides/rel_notes/release_17_08.rst | 5 + drivers/net/mlx4/mlx4.c | 207 ++++++++++++++++++++++++++++++++- drivers/net/mlx4/mlx4.h | 1 + 4 files changed, 213 insertions(+), 1 deletion(-) diff --git a/doc/guides/nics/features/mlx4.ini b/doc/guides/nics/features/mlx4.ini index 285f0ec..1a5e08b 100644 --- a/doc/guides/nics/features/mlx4.ini +++ b/doc/guides/nics/features/mlx4.ini @@ -6,6 +6,7 @@ [Features] Link status = Y Link status event = Y +Rx interrupt = Y Removal event = Y Queue start/stop = Y MTU update = Y diff --git a/doc/guides/rel_notes/release_17_08.rst b/doc/guides/rel_notes/release_17_08.rst index 74aae10..3bb83db 100644 --- a/doc/guides/rel_notes/release_17_08.rst +++ b/doc/guides/rel_notes/release_17_08.rst @@ -41,6 +41,11 @@ New Features Also, make sure to start the actual text at the margin. ========================================================= + * **Added support for Rx interrupts on mlx4 driver.** + + Rx queues can be armed with an interrupt which will trigger on the + next packet arrival. + Resolved Issues --------------- diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c index ec4419a..6239ac3 100644 --- a/drivers/net/mlx4/mlx4.c +++ b/drivers/net/mlx4/mlx4.c @@ -75,6 +75,7 @@ #include #include #include +#include /* Generated configuration header. */ #include "mlx4_autoconf.h" @@ -127,6 +128,24 @@ struct mlx4_conf { NULL, }; +static int +mlx4_rx_intr_enable(struct rte_eth_dev *dev, uint16_t idx); + +static int +mlx4_rx_intr_disable(struct rte_eth_dev *dev, uint16_t idx); + +static int +priv_intr_efd_enable(struct priv *priv); + +static void +priv_intr_efd_disable(struct priv *priv); + +static int +priv_create_intr_vec(struct priv *priv); + +static void +priv_destroy_intr_vec(struct priv *priv); + /** * Check if running as a secondary process. * @@ -2756,6 +2775,8 @@ struct txq_mp2mr_mbuf_check_data { } if (rxq->cq != NULL) claim_zero(ibv_destroy_cq(rxq->cq)); + if (rxq->channel != NULL) + claim_zero(ibv_destroy_comp_channel(rxq->channel)); if (rxq->rd != NULL) { struct ibv_exp_destroy_res_domain_attr attr = { .comp_mask = 0, @@ -3696,11 +3717,22 @@ struct txq_mp2mr_mbuf_check_data { (void *)dev, strerror(ret)); goto error; } + if (dev->data->dev_conf.intr_conf.rxq) { + tmpl.channel = ibv_create_comp_channel(priv->ctx); + if (tmpl.channel == NULL) { + dev->data->dev_conf.intr_conf.rxq = 0; + ret = ENOMEM; + ERROR("%p: Comp Channel creation failure: %s", + (void *)dev, strerror(ret)); + goto error; + } + } attr.cq = (struct ibv_exp_cq_init_attr){ .comp_mask = IBV_EXP_CQ_INIT_ATTR_RES_DOMAIN, .res_domain = tmpl.rd, }; - tmpl.cq = ibv_exp_create_cq(priv->ctx, desc, NULL, NULL, 0, &attr.cq); + tmpl.cq = ibv_exp_create_cq(priv->ctx, desc, NULL, tmpl.channel, 0, + &attr.cq); if (tmpl.cq == NULL) { ret = ENOMEM; ERROR("%p: CQ creation failure: %s", @@ -4005,6 +4037,11 @@ struct txq_mp2mr_mbuf_check_data { (void *)dev); goto err; } + if (dev->data->dev_conf.intr_conf.rxq) { + ret = priv_intr_efd_enable(priv); + if (!ret) + ret = priv_create_intr_vec(priv); + } ret = mlx4_priv_flow_start(priv); if (ret) { ERROR("%p: flow start failed: %s", @@ -4197,6 +4234,10 @@ struct txq_mp2mr_mbuf_check_data { assert(priv->ctx == NULL); priv_dev_removal_interrupt_handler_uninstall(priv, dev); priv_dev_link_interrupt_handler_uninstall(priv, dev); + if (priv->dev->data->dev_conf.intr_conf.rxq) { + priv_destroy_intr_vec(priv); + priv_intr_efd_disable(priv); + } priv_unlock(priv); memset(priv, 0, sizeof(*priv)); } @@ -5157,6 +5198,8 @@ struct txq_mp2mr_mbuf_check_data { .mac_addr_set = mlx4_mac_addr_set, .mtu_set = mlx4_dev_set_mtu, .filter_ctrl = mlx4_dev_filter_ctrl, + .rx_queue_intr_enable = mlx4_rx_intr_enable, + .rx_queue_intr_disable = mlx4_rx_intr_disable, }; /** @@ -5592,6 +5635,168 @@ struct txq_mp2mr_mbuf_check_data { } /** + * Fill epoll fd list for rxq interrupts. + * + * @param priv + * Poinetr to private structure. + * + * @return + * 0 on success, negative on failure. + */ +static int +priv_intr_efd_enable(struct priv *priv) +{ + unsigned int i; + unsigned int rxqs_n = priv->rxqs_n; + unsigned int n = RTE_MIN(rxqs_n, (uint32_t)RTE_MAX_RXTX_INTR_VEC_ID); + struct rte_intr_handle *intr_handle = priv->dev->intr_handle; + + if (n == 0) + return 0; + if (n < rxqs_n) { + WARN("rxqs num is larger than EAL max interrupt vector " + "%u > %u unable to supprt rxq interrupts", + rxqs_n, (uint32_t)RTE_MAX_RXTX_INTR_VEC_ID); + return -EINVAL; + } + intr_handle->type = RTE_INTR_HANDLE_EXT; + for (i = 0; i != n; ++i) { + struct rxq *rxq = (*priv->rxqs)[i]; + int fd = rxq->channel->fd; + int flags; + int rc; + + flags = fcntl(fd, F_GETFL); + rc = fcntl(fd, F_SETFL, flags | O_NONBLOCK); + if (rc < 0) { + WARN("failed to change rxq interrupt file " + "descriptor %d for queue index %d", fd, i); + return rc; + } + intr_handle->efds[i] = fd; + } + intr_handle->nb_efd = n; + return 0; +} + +/** + * Clean epoll fd list for rxq interrupts. + * + * @param priv + * Ponter to private structure. + */ +static void +priv_intr_efd_disable(struct priv *priv) +{ + struct rte_intr_handle *intr_handle = priv->dev->intr_handle; + + rte_intr_free_epoll_fd(intr_handle); +} + +/** + * Create and init interrupt vector array. + * + * @param priv + * Pointer to private structure. + * + * @return + * 0 on success, negative on failure. + */ +static int +priv_create_intr_vec(struct priv *priv) +{ + unsigned int rxqs_n = priv->rxqs_n; + unsigned int i; + struct rte_intr_handle *intr_handle = priv->dev->intr_handle; + + if (rxqs_n == 0) + return 0; + intr_handle->intr_vec = (int *) + rte_malloc("intr_vec", rxqs_n * sizeof(int), 0); + if (intr_handle->intr_vec == NULL) { + WARN("Failed to allocate memory for intr_vec " + "rxq interrupt will not be supported"); + return -ENOMEM; + } + for (i = 0; i != rxqs_n; ++i) { + /* 1:1 mapping between rxq and interrupt. */ + intr_handle->intr_vec[i] = RTE_INTR_VEC_RXTX_OFFSET + i; + } + return 0; +} + +/** + * Destroy init interrupt vector array. + * + * @param priv + * Pointer to private structure. + */ +static void +priv_destroy_intr_vec(struct priv *priv) +{ + struct rte_intr_handle *intr_handle = priv->dev->intr_handle; + + rte_free(intr_handle->intr_vec); +} + +/** + * DPDK callback for rx queue interrupt enable. + * + * @param dev + * Pointer to Ethernet device structure. + * @param idx + * RX queue index. + * + * @return + * 0 on success, negative on failure. + */ +static int +mlx4_rx_intr_enable(struct rte_eth_dev *dev, uint16_t idx) +{ + struct priv *priv = dev->data->dev_private; + struct rxq *rxq = (*priv->rxqs)[idx]; + struct ibv_cq *cq = rxq->cq; + int ret = 0; + + ret = ibv_req_notify_cq(cq, 0); + if (ret) + WARN("unable to arm interrupt on rx queue %d", idx); + return -ret; +} + +/** + * DPDK callback for rx queue interrupt disable. + * + * @param dev + * Pointer to Ethernet device structure. + * @param idx + * RX queue index. + * + * @return + * 0 on success, negative on failure. + */ +static int +mlx4_rx_intr_disable(struct rte_eth_dev *dev, uint16_t idx) +{ + struct priv *priv = dev->data->dev_private; + struct rxq *rxq = (*priv->rxqs)[idx]; + struct ibv_cq *cq = rxq->cq; + struct ibv_cq *ev_cq; + void *ev_ctx; + int ret = 0; + + ret = ibv_get_cq_event(cq->channel, &ev_cq, &ev_ctx); + if (ret || ev_cq != cq) + ret = -1; + else + ibv_ack_cq_events(cq, 1); + if (ret) + WARN("unable to disable interrupt on rx queue %d", + idx); + return ret; +} + +/** * Verify and store value for device argument. * * @param[in] key diff --git a/drivers/net/mlx4/mlx4.h b/drivers/net/mlx4/mlx4.h index 9a3bae9..c46fc23 100644 --- a/drivers/net/mlx4/mlx4.h +++ b/drivers/net/mlx4/mlx4.h @@ -226,6 +226,7 @@ struct rxq { struct ibv_qp *qp; /* Queue Pair. */ struct ibv_exp_qp_burst_family *if_qp; /* QP burst interface. */ struct ibv_exp_cq_family *if_cq; /* CQ interface. */ + struct ibv_comp_channel *channel; /* * Each VLAN ID requires a separate flow steering rule. */