From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR01-DB5-obe.outbound.protection.outlook.com (mail-db5eur01on0064.outbound.protection.outlook.com [104.47.2.64]) by dpdk.org (Postfix) with ESMTP id 1758B1075 for ; Sun, 28 May 2017 17:11:52 +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=imr7qque1EgFKIoFjGgqnNL7siSujwbPWKkrkhdT4Ls=; b=XOo+o6DRaRuwZqR8lDm5cQNTP55yKvVU+aJ0o24c35WBqL35AkAMyofIpAKRRb7yUjXNCKXhCdctu5/MEqcYGvFIbQwCb9D3z9HjVkqNFJJxXmppmroLLTqj8Y6MduwaP/FiNu7eWZOH9WbhrGql/BYMZVsDfsmy4lTrDdzc97o= Authentication-Results: 6wind.com; dkim=none (message not signed) header.d=none;6wind.com; dmarc=none action=none header.from=mellanox.com; Received: from mellanox.com (37.142.13.130) by VI1PR05MB1919.eurprd05.prod.outlook.com (2a01:111:e400:7b79::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1124.9; Sun, 28 May 2017 15:11:49 +0000 From: Moti Haimovsky To: CC: , , Moti Haimovsky Date: Sun, 28 May 2017 18:11:31 +0300 Message-ID: <1495984291-66861-1-git-send-email-motih@mellanox.com> X-Mailer: git-send-email 1.8.3.1 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [37.142.13.130] X-ClientProxiedBy: DB6PR0202CA0005.eurprd02.prod.outlook.com (2603:10a6:4:29::15) To VI1PR05MB1919.eurprd05.prod.outlook.com (2a01:111:e400:7b79::18) X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI1PR05MB1919: X-MS-Office365-Filtering-Correlation-Id: 1bb59131-f406-42b6-6807-08d4a5dbddf2 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(48565401081)(201703131423075)(201703031133081); SRVR:VI1PR05MB1919; X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB1919; 3:QxgE2gwQZQFC/XofkNUx9aumyaDn1BX8jL9Gz0kqKEL8S+cM88kHneny1mTfr3nVLystfdSsmq7XNPYrum5u3MZAVdh6SrfcxZxlOVmp7J7D61Zc9Zi6f5ZvlowRbJhbX/78zHg5TOPmIl+F9yJIxeGjt/qxYktDXzFvgR4BL67dWs0R0ZySV+N+yNM7Za74LV/o3dUHVH8nyLeLB+Q+wyhqwuXOc6Qz8K1rokHSJbNZxiXv2Ghi3hxHmMQmglD8h1EeJWtV3kla+RZZxuTSNhPq0suBk1CcVpj1A3jlSQyQHkEhgDtqIAtsvGKN+aau0SJcN+s82tPLccFk0UistZ4Jo3ZMpkVQGced6ekvMa4=; 25:Wj3aSguBGbo/LvZsHEs9l5gDTPxHBWsVTbHXDYc/UAjpcBS9j45xOrekNp8Yjn0Y0NtCjYwvpmldyjv+flgnNl1IrqsO3Gnc/MR4EsgbrsdLQLZZz6DNYpFhlouU+fYs9m0XkLuA/41ZmRm6sf4bFDce8RyJ1z59amCzASxFJj9pGiHe0k6lgKSKMtTuk3owgn2EeGK8vxPEW13vqSsBtILqLmBDj6gF9B4bjyix636FKFkgD36dALwsU1MkfqZCoYSUewZCBjP5bKPUUAFy6BmxDGzwsmU483zI6wLWO6HWk39EEMKn99S9PTe3HPGAxCeICPQaTd0g0DFFBz7xeBs76SZqAne7vcrsV6M5RWaY1Tj+xbgqyZjbWcd9f54/NQivhDIyEyotCwv/N1ogSHrPdYb7dtDSE8MbHDMZwIsSFf+Fw0aXgsVditPqkYO5RlLS3XxzflCU4Dg89QoovD910G7ygTUuEdxNUperfuA= X-LD-Processed: a652971c-7d2e-4d9b-a6a4-d149256f461b,ExtAddr X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB1919; 31:NDZShp5OjWiC3q1jlkojoo0Hs/oqjJ1u1/U1m5IHfuce8GGabWvuJp2BvmzoOSf0W22YTSUS+DEHWevh9fmBOKuv9XB8WmZ3dC3SNoi2j+a+6wKurwqrb6RChInnir2ZyrH3jMbwyYZUnoBbbhnwgMokl3HuKuRDk7WkehO9YEY8FWXzPsGZNsq7IOb2U5qHosXpX0AzZPbXs81kzlbcJpBgbzy10JeTkXWXwqHK6tI=; 20:W9OnMOL82ARGRu+QbGdxXUGc/2y5jpXXvIjCieGkfPIDQL06NKj2bYvbku0vhFsnvKfGjKwtb2W/bsVNESxQQQiFRH0oZe2gDMauq4//kvvTt0btwSqPy/kR73Nk0tYl4wZZsHZQ1HK0RH5MI07KyWvriFdmcLbsq0NO9k4qWr6nK3yd0g5w5sLU4aDIgZfty81/54sfcNCCWj3N0G/7klt/xVADsyb+NqVUw+Gfoq4zMgwf2D219Jg/e4J6Xh51/DSda8nJ8V6SwPW63R7cy75pz1Ivg+DMhh0OrQ1UMohGwjz2LFFr5C9d5XDqJi5PdgEDXhq9WFOSdRhQ0WDCbL9cB51dg4qADWVjLCbUE7dRJgx28LT6FoIKwI7A7KERebUwEAwSPnC4aSgWjO7dsMUnjQYV5xSVXnpORB5ej2ANjb/uDcY9MxpyfcPBPLq1YlBjwwHODYATr9cYD8+ZQXGa/T6x/zE2WUD482iwWl0JWbQSmmc+hDENoTUmBglw X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700073)(100105000095)(100000701073)(100105300095)(100000702073)(100105100095)(6040450)(601004)(2401047)(5005006)(8121501046)(93006095)(93001095)(3002001)(100000703073)(100105400095)(10201501046)(6055026)(6041248)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123558100)(20161123555025)(20161123562025)(20161123560025)(20161123564025)(6072148)(100000704073)(100105200095)(100000705073)(100105500095); SRVR:VI1PR05MB1919; BCL:0; PCL:0; RULEID:(100000800073)(100110000095)(100000801073)(100110300095)(100000802073)(100110100095)(100000803073)(100110400095)(100000804073)(100110200095)(100000805073)(100110500095); SRVR:VI1PR05MB1919; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR05MB1919; 4:JXmmjC2rAyMgrZtekfgeK99NjFw7jIVE1umdwPqy2l?= =?us-ascii?Q?w43G/Jn7S13X4qVCflTOW64aDiHSfRH8tP+oLPBrSW2JpwzuxCIauRanIZZa?= =?us-ascii?Q?NLBYLnOeuL02i+IrfnYtvRjNsPOFTjBmZYEuTh9ICEJN/cMqarbkI8AgGQCu?= =?us-ascii?Q?PXjIyI48UyMJeR9S8NvRnE5dhLdwaWWME4Drohftq8OD1cqRJbT5QHq1/te9?= =?us-ascii?Q?J0+kNGFT1MU5kD0Pj1w0x3Q4xXswjTYd+zNsV/PMF3DDcgOLNYVzJzxbopLE?= =?us-ascii?Q?FbQmKT5Tgyc3T/SDFfl3KBkW6xHq2Ys77MMB4qLwgBdzWyH1GHmf6SICd3kG?= =?us-ascii?Q?nlKi+W0EsrZf5Av92u6M2stAQ6ZqWib5EY6VP9NZ2Wjfg/bwfZ6fDir2s8X3?= =?us-ascii?Q?gzHd2wr6HSvQq+nkdNAojYGQObk4xCa5S2HpNOmtre1ozocGXtlNtM4LceFd?= =?us-ascii?Q?N5yCtyplU785k1HKaNunwB0TA9Np6fWK3Nh9TJEgkrRbl1G0F9Y752aVhRMf?= =?us-ascii?Q?EWh4Omvtr8PAV15EGWwABIJDRplzajhOl4spP6F9MGtGEYGICMM//hpnKRE2?= =?us-ascii?Q?S5qKu4R4iR5675/sqnL1phYn2LsLglJhK3KGcteg2GDPKMq+mmxWapowVG6S?= =?us-ascii?Q?sV/oXrPlC9xd7IJ5EqZ/W3aBxaRHEEGlUn0jPo+imtYSYT3Ikg8fBY7kfBMx?= =?us-ascii?Q?1syLm1xcsOhul49CuBNDFvBEYWcyUIAYCW1ZnXykNUmvEU6jPqORTv+qcaxK?= =?us-ascii?Q?J5OFitpsiWbUigigxjkwNwVapol6zfpTe4vkJ9Lnzu24+T0j+DzVXq+JWEds?= =?us-ascii?Q?OAfQPyHs8RYYfjr9D4LJtVh8NM9nwRlTS2rs4KvRX59Ht+smN+mLrLuu9PkI?= =?us-ascii?Q?FP57g3pRwTHPIZpwwNkZHYQDJmVlcgOHr/uQ9Ntvxj6vxLTPT5iJYrck9pD7?= =?us-ascii?Q?gaKzKB3sIUkugngDJNLQ9f4RDlp+PWuRrFGqxgallPfNfZ1oZFlkTNQufjnb?= =?us-ascii?Q?bmYdN3se+vcInxi/Rquki67TIxKPwN6JslKK1HnWz2xGbAQrnVmlSWwowG28?= =?us-ascii?Q?BZry0eJlGV2Kbzp4hdbNF2VKkpAgLXYrXsUX3G7oqK6CpPEi231i9hloBU7A?= =?us-ascii?Q?2SAPqUw2xDC8bJYcVGZIC44j+ngvMsDYByBdL+lw2rtC5ulUMK4Q=3D=3D?= X-Forefront-PRVS: 03218BFD9F X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(979002)(6009001)(39400400002)(39850400002)(39860400002)(39410400002)(39840400002)(39450400003)(106356001)(33646002)(2351001)(107886003)(42186005)(4326008)(38730400002)(2906002)(47776003)(53936002)(25786009)(66066001)(189998001)(478600001)(54906002)(7736002)(305945005)(5660300001)(6666003)(6916009)(4720700003)(110136004)(55016002)(3846002)(81166006)(6116002)(36756003)(8676002)(48376002)(5003940100001)(50466002)(50226002)(33026002)(575784001)(86362001)(50986999)(969003)(989001)(999001)(1009001)(1019001); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR05MB1919; H:mellanox.com; FPR:; SPF:None; MLV:ovrnspm; PTR:InfoNoRecords; LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR05MB1919; 23:uneO9raAjS3g5okCYdH5n1fBv3RTwN6HGCdgG80Wq?= =?us-ascii?Q?DJt0MJvDFpAt9fx44pGEcAPrD3k7s46mDq0oaMvBxdEF5hkJhR+Xyq1vrCxm?= =?us-ascii?Q?GJ21rvDxxSd+5LZ2LoxOBNk48/y7+w2i3tTH1M3bRE0SwiRql1hojWVxbg1Z?= =?us-ascii?Q?78kv6YD9SO9uumhPULSXvaodO3qgwjMh0mEfPADAeEF7FMI1SaAtJluw/MJZ?= =?us-ascii?Q?jZgEX1o3ALv1dCBuqjFATBY9iIX0k/ItmGzkYDWbdr5X5aUTityBHDFvEmyi?= =?us-ascii?Q?QCqbAPwlMpflMj8swuvw/cr0wvDKT+8magqqLMxI+Voba5TZFGtBkOik3AxN?= =?us-ascii?Q?Op0x7MBL8OxVQusqbnTmguUPQV/ZastpMfZwrWm6i+5rF+v4ZOK8gklu2crs?= =?us-ascii?Q?oMufSxKvhYPNz8peUcH0I78/5MKpmOrc/dCjvUXcynk/lpdhabom5ip8LSJJ?= =?us-ascii?Q?fUs/HD+/I22nCpJXFm5brQWrXMDnQyLWUTVigLABP/QtRl0mb82eFfhi2MKG?= =?us-ascii?Q?8Op/dh8D/77p4MTU5JqNEui+9vUFmSAiwRyYUfn1ar52fwwq6Wx8wIxV67Mo?= =?us-ascii?Q?WQ9xkg2+xYF9YiyS4sQ5u4okKnUzrjjIUQxcHGLGPCTuWkuGvMagp26RWHbj?= =?us-ascii?Q?CxoKQ1tX3EdCTB3fgBFImfXtkqk+xZUK03LtzLlHkOy0LB/XxyOb6jfSTD4K?= =?us-ascii?Q?rosxLg8xWYTjOFz8Fnz3KJs1eaGzOXanHP2qmeFelmnwu2NF79gqFesM0Typ?= =?us-ascii?Q?6xpJ2u4CKNbgCa0J+MD11M66YPtS0hLhn2whzf9VizRbgWYWrhoBaMkSdbff?= =?us-ascii?Q?N82XoMWUnK9Lp5y6ci6ILLPcXEwELFKSDSaazNGqY6+t6JzfL73TZzMH8yFW?= =?us-ascii?Q?PImn4broV2puxKpNgVNloazEXf2OSEujzxk/LxaZqSotx77M7B7D12yT7zfZ?= =?us-ascii?Q?ZYLOYvcNwJ4lY/LNR744YaWJ/FJ5CpXCsOOwT6VvV/oH9mWVRg6YVLHUvGcV?= =?us-ascii?Q?9pVsyXMoMYfL3h3JrUxEZ3Wn2I3FssmRVdvNg6cmIbyAc6mRglXxHICCNUt5?= =?us-ascii?Q?NQQILovpw/okKXmUsqaPPpV9nJYKkUcFj/ldrA7ZcoliItS3YGwysPjXuWZp?= =?us-ascii?Q?emge87N2/cFK74nWTagjmcg/YZwtvTyXWnp8MNSub2HNlS3ciWp7MUBc27mg?= =?us-ascii?Q?kcb9u0HuwWLjX3mGpIp/CFInquCipyc1jJkfgbgblxC/yxU8kpmdvb9Ag=3D?= =?us-ascii?Q?=3D?= X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB1919; 6:8F46I5NgHeYwYPBJmxYTEibqWt+iyBusTir6QkzA0cDn8QhtTDDE6iDcD0q7GZ58Vv7VP9x+HIX5j5ywoqhXU5lbXDsliRt3svQRu1Zf27wwPGCCsbsBpOMxd/HpfFl81IHCPdL0YPKZI8j8I2noAk4mlPlpBRwbEObnb8wzDTln7A3ccA7bI645vE6OGCPnlGMjgeHt6nX4+RSasS5EB43jB3eMbQLjRRTG4g1AQpNXCIkRsmQa4CXa5IPZxWhbSXBEe9GKeUsG45q/eJ2XYk87sN3bwhcY1STdAx4WzO+WE9Tg6mbZjRBTR0l5nBSr5Dbz4c+ldU1UJbavxHswhK4LVPRsE8l5G4fqDq1YVacGlAqbUr1VKefdv5S4rMQLrp/JYl9gB3X1MlisL1mJYoT9lcY8AVmHeYTkWoAGkvwKXB44ORY4Tl9XCC7CJJsxNmfeLmU7lXy6F2PqrKSFE3dRcEW3j7l4/c0qIhZl9MYJkMEZpkH/srJgyDVmYivwzeRx0TvPsK7c0juXbV3OXdWAE6eCDx8gmh3Ma/HKhSc= X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB1919; 5:w34yyu79dOVZAmpMKzxkJFLsP7q73ti9bQrYS5QSZYCeUDzf9kGl+oDS85tZEFltggAJFMbb4Nf0IUqihCuzDgv9Z5JJvZtLGyYGYxFkRjtrrAKm2R3/h8rsgqOphOe//Xm6SUzaYUMPjyX+nZkAkO1CdqMu/1ptmwE40wk8L+8k2s/iKVfQAxk6I5u1PKALRdLAEzsIk+hhJnDUL8+eIqVzMsh2L1YTEmmoJHmMolusqIr/jbV/rDh3IWAHOhDyHRnAArxyRMjCkIvTwBQbd5Y71sMWlx3vuP0QWtiSrHOVldFORPy6qoqHwLGYvf+oc79DvC6cJk4u/h4stzsZL5n+DiJui/KgmCUzFHVub6AO21g9ClwOSsmk13KGTY/AwAatCmja2OVPuvIRXjPfk7q9eNoLi069ik4weYEVqGSlDKMbCLNnHOm54vfLhLvT/XTmvaiI/WHMk8gVVkUEiGF9e+2LY2+QblgKSi2fWmXS6/N6ljTzeYEuHR/nFGly; 24:YdcmXkRoSojl+xIM81ikEf+Nv/yN7kC81OqLBvEoUhfqksdJPOqZ7Np0qmxKAUnI/8sJf3Kj8U26KqXC6R3q1KXwAdQEpyNuDHpxklVQidc= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB1919; 7:FasIgxvRjn+lkCoBY3BQNf+3WHuECA6SQt5SOAowL0JbYV/uR9fod1U2CykFtwbyM9v85sZWUE38UPOYIYY0s/DI4NdiM3vUr7iB5KTr6fGr4YigjtDDTHxqKsA4j3bAYet6Z/z3nVNpIdoIVGAGgCxMNbG8mq2SZaecnXGkjRDn56g17B6m56q7H2OE7WxGG3MqCpezQyRRGx1JhUXy8Rq+huBJFGXjl0DWyTovr/9on2RPgfqLw9YAVYAJERzY9qcSkOMP2DhDj4waCWjKDZ52pdYB7rmyyKxVmzyC6w7mbOCJYTAVwudJ4IlSE5AFnLaJKUHjl2HCNpki2bc1Dw== X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 May 2017 15:11:49.6626 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR05MB1919 Subject: [dpdk-dev] [PATCH] 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: , X-List-Received-Date: Sun, 28 May 2017 15:11:53 -0000 Implement rxq interrupt callbacks Based on implemantation done for mlx5 Signed-off-by: Moti Haimovsky --- doc/guides/nics/features/mlx4.ini | 1 + doc/guides/rel_notes/release_17_08.rst | 5 + drivers/net/mlx4/mlx4.c | 218 ++++++++++++++++++++++++++++++++- drivers/net/mlx4/mlx4.h | 1 + 4 files changed, 219 insertions(+), 6 deletions(-) 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..95ab325 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,30 @@ struct mlx4_conf { NULL, }; +static void +mlx4_dev_link_status_handler(void *); + +static void +mlx4_dev_interrupt_handler(void *); + +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 +2781,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 +3723,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 +4043,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 +4240,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 +5204,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, }; /** @@ -5284,11 +5333,6 @@ struct txq_mp2mr_mbuf_check_data { return atoi(val); } -static void -mlx4_dev_link_status_handler(void *); -static void -mlx4_dev_interrupt_handler(void *); - /** * Link/device status handler. * @@ -5592,6 +5636,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. */ -- 1.8.3.1