From patchwork Sun May 28 16:11:38 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Moti Haimovsky X-Patchwork-Id: 24806 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 756A958EC; Sun, 28 May 2017 18:12:11 +0200 (CEST) Received: from EUR03-VE1-obe.outbound.protection.outlook.com (mail-eopbgr50075.outbound.protection.outlook.com [40.107.5.75]) by dpdk.org (Postfix) with ESMTP id B130556A1 for ; Sun, 28 May 2017 18:12: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=13aaNveZyriwxYcbLsJCcBhi7+nmNENnazvFlEM8oTU=; b=iWtAva99OvDByBA2nLNqu9zdFKmAPay7zdozK9yJd7vv0Y9ZynGMqHHt2fFff55XbGYb4gtdbPB37Lrdmb45Huwv4SOOyKgAe4B6bSZXQ/q5fKad3QdFtWc+2WjyKE8ApPTKOMF93kHQ/S7aHgZJvaxv8MA6rzWBvPYzwkajaic= 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 DB5PR05MB1909.eurprd05.prod.outlook.com (2a01:111:e400:c584::14) 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 16:12:05 +0000 From: Moti Haimovsky To: CC: , , Moti Haimovsky Date: Sun, 28 May 2017 19:11:38 +0300 Message-ID: <1495987898-70002-2-git-send-email-motih@mellanox.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1495987898-70002-1-git-send-email-motih@mellanox.com> References: <1495984291-66861-1-git-send-email-motih@mellanox.com> <1495987898-70002-1-git-send-email-motih@mellanox.com> MIME-Version: 1.0 X-Originating-IP: [37.142.13.130] X-ClientProxiedBy: HE1PR0501CA0003.eurprd05.prod.outlook.com (2603:10a6:3:1a::13) To DB5PR05MB1909.eurprd05.prod.outlook.com (2a01:111:e400:c584::14) X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DB5PR05MB1909: X-MS-Office365-Filtering-Correlation-Id: 92d56f68-ed33-4e39-153d-08d4a5e44987 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(48565401081)(201703131423075)(201703031133081); SRVR:DB5PR05MB1909; X-Microsoft-Exchange-Diagnostics: 1; DB5PR05MB1909; 3:ZexrumF98aG39jn9M/oyIBJaGr2mShMr6VVUW6ULDCoHrtDUSD1z1qtjoihsB0CXorEI+md+jlASsBB+fMb5bttk73ChAWoYkdNj4tvvOg6/L/mQ3PZYBcyeAetF8cWMcIEKniwsFCmxxvk3Qt5gzArkZLNiwj5wxt0PfXbjnG/8g/9JcQZQMVmpizCPi6LOfnzwh0HunAS22UqlZ971jojuARDKVWuoIq7uCECK/92HRKgE+uw7TFvy/3t3oxhU7y63QjUDXc7yQmmuIPByy58FRLo0ecyN6DrTYLk6ZmKxt7WNcl99P44Vr0MOGj4S9g/Rx+7zL1yd1Z5KvtBSWjnOBMRptbo/8mQiDbzM5OA=; 25:lX3bbYPg4ncIX5WOY7EWsMXqGpgvWOuWlFF1xEumskpNDpGkilxTk8G84lR8+9juZmQQEJJ2baV9R7OlbCXokWcKu5a56BYc6xOLGLmLeI2bgYNr/xLA2MzgVTDQ4fY6/Nzesu0L2r933RQvI4Zu9l4pGZhB8e5Avt0rtO1MS3v/nWgoJ5o9yh51sT1YQNMcUUE9sSzCFJLdxLJfr7N4UbY1SYdlQAk+PpbgabB8fAIITHJ9R4wpW4J8VUlTAzlSZ/aww0PMjVAztIT+Tb4NDXaNGutEyshtHoJPxwM443EQunhmqZgBrg7OSB8mkfcA+3O3/wEgkQlMWGFyHe91/tyeqQY03GaYAoCs6MS0NP/6lh80ZhInJfQFaH8WxMq+rhyydhDdQDDcuzi1jbokQbQZq0+p/ixgVN6JGgS0ItQoOeWgS7Z2+1EkF+wrRSDwbiTQhfl8zm+02g6tCFTSZsROIpCuEkSy+PqDK1/p60k= X-LD-Processed: a652971c-7d2e-4d9b-a6a4-d149256f461b,ExtAddr X-Microsoft-Exchange-Diagnostics: 1; DB5PR05MB1909; 31:SnX8L3fm4GvFSMemUfwFRgtWawV6Bzop9JmRigswMI2V1FLI8mrnOgNEn/xf6dIJQmMPUucjyi4/bOedSZbcqiKzaZb/v3VvdtPcxzjxAk62/+b3Dgc1uH+Gis6XNSNm2Iq/X4L0V/ZTkD7fk4stnz9+s+LH4XTTaVhrzt5Lbfuz1gDAepEaym2Y2Jam0HrUc6SIHffZQulA6tTs4Z8urN6PNVGRWOhpX1Tta9KjDNU=; 20:yM++ZHwW2EA2OHMxYL8KTimyhTEXi8SgxvsFxpl2OK6MSRhMUzmu0CN9t6NU0JLXb3QnAwnj6TtGaPnUv5KYYz2c3i1EG9e2FGhfB3EGyGvcbidMKQY8JL0o/lXIorZyXBey1RbzfhY4fTKLEIYtgtH/zZBEAvEDrALE4r1YcKrjE+mpw7S7Dy5o0IXdxhpDloiZHhD8/igtQNv3cT0phAuYCiJKcT/A3RwWUXIK7ig4SS4KPh6VIalksSbUrse3Ok6lrHWPNwr7R3eS7iwESH4maF/47mVYLH68MipwIR3zZmFLUSk9MCa9Fz8/5Qcg/yKSvP+RGvf6QkLbVM3MHC3xq0hLsWsn8JfldERWr2g8aRrJj12sJWcZGAnMXcbZeZ0RzYBkRwBWiR87XsUUbyYWWB4/T65PhIkV0Bu36l7TAeCFXS5qV8wmmtG5LO5SIu74MSjIQNTeUcJV/YM9NfBcuLEskrCd6W3sTO57e/1xDiD/w+S3M86QIy07VFUZ 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)(3002001)(100000703073)(100105400095)(10201501046)(93006095)(93001095)(6055026)(6041248)(20161123558100)(20161123560025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123562025)(20161123555025)(20161123564025)(6072148)(100000704073)(100105200095)(100000705073)(100105500095); SRVR:DB5PR05MB1909; BCL:0; PCL:0; RULEID:(100000800073)(100110000095)(100000801073)(100110300095)(100000802073)(100110100095)(100000803073)(100110400095)(100000804073)(100110200095)(100000805073)(100110500095); SRVR:DB5PR05MB1909; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DB5PR05MB1909; 4:U7Mm62jsKnYKVGgbTH3435ikZHH1N+nQSXAkWuu0py?= tN4R/pewRmOoUwJafst/CIwK0pHQR9Ei+x6DErK0rKhY5fDIMUxQPI4IYtU05ao48QwjQCm9BPSapSU1D2XkEHCK1m0blJ6jP4T5P8eO5vR6+6st48e7hxKWWTfCpdib/Bo65dp0BfabEdmONueM2aSolP0vYgJ5H9hsDotXK9tWj2dJcuns7wHYOvh2gF7ToiHS+bv3z41XFkziU07FwSp5zCfIuzJbusDNggN44kL6YtDemffomKvr5RQQxty9HUae97m4j2JMBE/UXKuZu5ASqaKpY1szYAbCXvZ1M8c6QKLL5EP3PL2Bbmkx5dPYAEMdw1Z5D4EbK6A5EBpS501IY1mTn8BsVwq8qxc6h3TrsGm8wPUI6rKUs+tKd6pnJLbK2GjY5HiHXIZi6ZVKF4BxzyH7Qv/BAGX6zLCi74D52+BV9NEqAos++rkP2dQCK72xtEwu/ALFARpSZrbg/N2SibowktdXXfoKMH+MyK1M3gSCk80MJ4g29YHa7+iOX1BpPjf4VlLXnHjqM0/hPVboKUwPBprLmtvQxLtPf1o9VXJktBGzWxI2k4CAuB7X7Qzfn7vpra7ZFHpMlsPUG+QQogWEHl+zOflCVCOmIxCD27pKRz2wn1u1K1eOPFavdubilhetU+Jbp0E4jHoFbWyLGGhFqmQRSwZAUcVxcokBkUnqntaAEmMmp445wirfBXSRpZzyUSsgKx0KGx5H2U7JV2wQsFX2UMLunu88mmSX31or5V+Ncj9la6Oy2CNGEww+tEaCX6DEYFPLBLjKe81k9/zyvrCoRBI35uny13dr9dFlusil7GmZgcQUC3UmZudwZaydIUaoalxFqz53LYS/sTDDqA/R/z3vEu2xgglUZBn3+We8fXoA7xSAfN8eoY66qu7iOlonxw2J8XI9FpKLU5kmXbLBOLcVIth8RU4NwAcdnA4ZZuU+piFYxC2ykvpHN96OF75MJB1VjYi9xj11v9w6pubbwMOqEWY0C9RmDn9ufJSdsFgvgzhtNEUiAMMW6Yk2GmgSs59Fn1mqZAqx8nTrsE06WXn7DQmJUOmvh2rcaur83gIbqJpQG7UdqaYTrpgKLQstDdSbYItex40MXDf5CVUtBFIf32yOyUyQ== X-Forefront-PRVS: 03218BFD9F X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(6009001)(39840400002)(39450400003)(39410400002)(39400400002)(39850400002)(39860400002)(50466002)(48376002)(76176999)(2351001)(53936002)(42186005)(4720700003)(6666003)(33646002)(2950100002)(6916009)(50986999)(305945005)(36756003)(55016002)(110136004)(107886003)(54906002)(38730400002)(4326008)(50226002)(2906002)(3846002)(189998001)(8676002)(86362001)(66066001)(47776003)(25786009)(575784001)(6116002)(7736002)(81166006)(5660300001)(478600001); DIR:OUT; SFP:1101; SCL:1; SRVR:DB5PR05MB1909; H:mellanox.com; FPR:; SPF:None; MLV:sfv; LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DB5PR05MB1909; 23:wVS9CJZYZP0+x5baHsmgVUWVBrRAZNuK44HUECVzo?= gqA5A3KjKB/igLkM8FA2M7OX6hwmPirhs6kF8dBDdJmxmuVG1JOVQaSPrrylCbUDR9mm/b2pw2xRrkkFH1o9XnRBAewfi+SwTN9zSrMqSP+aAYIOr7ZXo/9mpeINC2+Jvf6j+AR58vcncNAQiHAi1jDwFTy+O5NUDLvSttrU0xu9SptU4os3dsKQHvjrUWzNdW5JqJtumPpFwlPWV4h5ja0bHF7xzrs3GSkr2sSmp6cdX4cCwswlsf8au2Ggb6nOc8Q4eArrESo0QU50AGIjV4Pfe1up/piUfyG7KeoCcuL70AczGbI1Xlzh0D/W/o3i8gK1ssPZbQ64xROhel+Dhcg3mmOrU3FO5cSl3NBh2EzeJXNQYWzCsjDaa1+a8taQRJtsEL3wsGwkuuitgZh34ovN+ivFZmv3Y5g2ZOXLDT/zncsb8/2IT6uPysKTinXIiq9ucQrs7IYu0qOCKz5vg52nWecG7Kr2SgYFhtIKdLQXb3+9/xkVjTIuksCZY61PjeXXPLVXbwNdulUgdgCDqHPL2SPtZL5zKPPJ74ROCK7X1nzz/r5CY5axnfrlIEv3zarIwCYhZ+0b2pZPfJN3aukWC1rOXgVC3tImIGH8BGO5yIMrBsh4y6izs0EoTFtZh56Up/svWTxAbPovZalZPRi3NjP3EegTUBAuNuaZuUiC8uuYLys6LtqompG+wFCLBkaVz91+l18ievhz1BWSgyxyC5Vpq6G+aflxCu38uu4p5BbSG3KwUqXgG2Hp89aTGow2pEsjldLkcWThGD53QRwvvkmkmqm893roje3gt6f8c7arPtUxZKl9knJn3/oEhT/XTeVcsb/Fg9J8wdAUZAaJ3KxQi8OSxTNqwQPOdmVozRHUD/UVJaGhk2f01WiGxi7eqTgvHiKgUWCb259UwkLfSmZL+Y+qi1g4UsLDRoh450VFuSeSDiQxQJtvSSZcCwP0dL81bssWjhuhho/kLX8lEI3U7I+n+EbpgpWUmOybDuMjgedFxsm//FRIAQHdQBC70+r8FTmubthtJfEjOXxxGN5EebV27z6PWveg6XxLg== X-Microsoft-Exchange-Diagnostics: 1; DB5PR05MB1909; 6:+ULXOqt7B3cw0WtrRfkPCLw1dJpwvDIsWuQQkHunOEf1WTjn8kGQRxrGDJRuz2mLmkvSJzlsmQ/YVh6AXFcn+zDeyFIKwHE6TE6bDS755R2ZGyhaikcrM8MbVZ5aqDvbMzottA5vT31h/Ic+Dwg9bJC3Syg9ChkrVsttqBsjKWRgq4RmoyexLv77Rn7j+sFXOH2wFWALXJJnYOwe2dCKBtGWb2XYuyBSD8iy84KM2C7UaWPLH0TPpVuMZ2C+lR/H88VYhGI3dMc5vx0LDo6wjZCiKdV156aeu618BVXW8MtYsiEuQ/wUjxMqEV6wIy46hSWUUte0WbeUMpgBTgGPk7+S2e9loJlo0OxpNGnw1wkaZsRNv1m2spkUfAFyAeChyeh0S0cNXC+FUP/S/O1pqmW7Qhou7qnb+G4MNDK4cSZdJbORdlP7e3qq8oMoYaWrgncM8NdnXwqVIoEz0v9K37sxX57KkrQOX1g//H9BhX99DCeiNEarvMTnpOphneOoqUfdm9FMviL4aEldWukWe9a8GWQlxc2OIK4PsgcnOyo= X-Microsoft-Exchange-Diagnostics: 1; DB5PR05MB1909; 5:3m/2FANixbiuSsaW17Dn+qyRIjfpOdRpHo75pCtmR/FQhtyqEVU0cHyuKxeC955r6pTzJmrl6v1lBwtdC4QFFrOz0zC0qboLeklKw6r/qh+wdBVgMps9MFfpPkIzF+GQXUZJjMEPOXhHEYFfc1hmBYIPLm1BlJR6dZOZN6G1Lmg7aoM9RyHDvj4ANDbEKKNiEsFVABfG6nu/Ov4Qet1OS+dff5PeDQofuTVpRJfFm2bgV/Zy2OiGZDxPP3q3pPGj7Dwn53oEg26s6KprADLpA8zeD7C0IHvoGQj/f4NONkQ6J5l26Ku4b6jewP0mtP2oS9vIOHlCJevgoWGIOQ8xLSqV3g9LvfwihdJxuG/2430yFEFiI9dRBllKxJhXAL3L+3txmxUM7BGGyFbxsGgm5QMsJrh7H6wZ6asf4mvWl7EjBxKqbxxC4/3xuULujsqGA1Dj0AdxHpQzKY7S0V+uoL5NL108zohtOL5fV2agXPyuYWyW7jnDmc57M8/RYIHR; 24:s0a4DWRicHa+fE+u28tv4u1Swne2dU1w6kh1cJM5DbJByrc+GC4KMYgXvU8JFUrAc+NAk4jAjfa0/m9VidqPtJ6+n7ripe5g7zfcBY9D+Nw= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; DB5PR05MB1909; 7:oK45+VRWSy/CdlciooJ3ZISbs4c6PX8POWOVUaMYdu+mZAT5xGcbpqmqZNGBHZWlG6AKdzlbvGrHW0B2cKnfHhUJvbVHcod0OkmjDq1R0sc87YNxOZmB6yUCyXTjcAcyfn9M0ASwSMlwgz0a4V/coYY0koHqDjOsEzHTVi9pwTxBBjHdIBrCuDn9aEq2EV18c0yg6qEjfz9EonZ/7lbuTt1hAZE/wrCx+dn1T1JnfJw2ECqbbXp7q6MWlyJUImuzPZovFPRpt04E08LislM0JQ12J/H6U7HBvfsNaLBbGdBdzM5rLcfuRAxo0W0Rh/88njJ9/Rd8kKYxhDV8Hul02A== X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 May 2017 16:12:05.9704 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB5PR05MB1909 Subject: [dpdk-dev] [PATCH v2] 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 | 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. */