From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR03-VE1-obe.outbound.protection.outlook.com (mail-eopbgr50087.outbound.protection.outlook.com [40.107.5.87]) by dpdk.org (Postfix) with ESMTP id 4BB01152A for ; Sun, 28 May 2017 16:04:38 +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=uQcd48Qngbi9VmuLRW/S7ZOVg+1sypds5AdSydMeDp/bH1mIrCloo7jJ7KR5iykTOBUoF5DBKjUaMeeb1j7DLbuxRfGrpSQNnX0zjtsPZm8HpWtudZTULbNPha/6oI3IH6RNtWJH8BQS0h50Ft1feGDFv24GDbWS0/SKiDxi/x4= 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 VI1PR05MB1917.eurprd05.prod.outlook.com (2a01:111:e400:7b79::16) 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 14:04:34 +0000 From: Moti Haimovsky To: CC: , , Moti Haimovsky Date: Sun, 28 May 2017 17:03:56 +0300 Message-ID: <1495980236-64710-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: VI1P190CA0005.EURP190.PROD.OUTLOOK.COM (2603:10a6:802:2b::18) To VI1PR05MB1917.eurprd05.prod.outlook.com (2a01:111:e400:7b79::16) X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI1PR05MB1917: X-MS-Office365-Filtering-Correlation-Id: 3ba1bcc9-673a-4528-01bc-08d4a5d278e5 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(48565401081)(201703131423075)(201703031133081); SRVR:VI1PR05MB1917; X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB1917; 3:WpY4QzSlApwTUn+tzBWOj9cCHo4WtcfUE4JQ4WJg2MMBGwB9TWc95DNs8L22VmFHdPnyGSac2BizQhAQm6jNTAlafipdjVkjwzQmP0Kw8kGADbPfzu8uQ7KXhyybaoJ0gXJ5HiF+QETo5iZHkTBG+IdmG3hvpZab9HOSJR2sOmUylrlAxXdxqE3vVvDyBmcbXa8gaeKl/I9LjqPW5wLRlgTSTaSwmQafGeSwknJ6OgoawdUegSzZOJOda8s6wZNMZDUKnXKhud77uDtNo0HkmRbhEjNl67yauJqxtE73iO1ZGpsz/Uxdw3owPqvty96PPq1G8WEcxFi51nYwCgQUmYLGaMC+jv2ryqL/INQdGt8=; 25:QAvd6qrw7RWWGtdrlMKj34d5otz/b7xmSaW+G5S4ojKfXzLrB4ZvHnQ/vEz9fczUAuE5329SQuOqNu+LeBL9mHmZCa6q7W219/spvSrSBGKs0IIxf/2kQHxpyV5VK36GxXk2NMSyiny1oDUznlhoWYntLZDhARKNMTGctLHh9zdqduLkExkbuw3BoIExlGFqESRFLTivRE6iCqudh90VWWQ7PJ6e476uB8Lv29QOu89OsoDx9Mtv1VhX90VT0l1tREazWhR22hZLL6uEZKDnqaCWSErFGrsvJFoj0KvHLetx7tj7SYx6uEB2w3KtU7jZJQ9cdkx6jhxxsz8WvV4o+zDeFEmhttzFFAUAqBrDkUreycBFjhnHdUiue1+W2si9mlw7Eh9AgH84m9cXKQwplDWyLLXtQGQ4GxenuZtOl/WMHQTEIXqHyINIlDis5xY0MuLZWQYx4DyB8zo11SP4IbGkNmQaOohi87lwgrCdSvk= X-LD-Processed: a652971c-7d2e-4d9b-a6a4-d149256f461b,ExtAddr X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB1917; 31:g0XULwNjnxBqk8Hot3Cv4DtL8z9ues9UMBjcfc/8olDcr7CJJKM7oVXfG30KbwzNsOzESIumx/4ezPI1Y5eotruuIwIoWp8HDffQadBPYT35n3B5SDvtIGHuXK/bNuWwtZkisXQCVqhkDbEzWQet94651nWCJdO2u2E7IEflicPfE6Z3v1MgZsv+XrFONEkHu/MUJA/PvyNpCJZE66vqOC26c5sRUxFhl3lraH+i7ZM=; 20:U54q8qmNioui5oxnvVAJX4SrkaeihSeTFF37Y+w6mLGGssI/+/8njpa0es1SmyZsWzx0NSVP8bpPS7AdHcTAnSPAxV3y30PSHqmYYCsy+ll2Vj1uTQrEkjwIODsXS0W2jeHIuQj0swO76JSAaGKaVIoCvqUlqpf68XJw0xcVuUhq+GEYxiQB1tWPZfYj6ZzSu13k9OZbAqtj+odPZSF157r+C1CzCkMEyr7mIrQUqLjv0EoeLOc3A54KFj7bcRv/L0WSeelCO7CD2rcez+lEmgUjBXSEkI2lnoRGJ9kDx/CqIix8RHlpfXJx196XuSi3P9vBSo+bzVtt5RBNvbkEo93y2qgeuSduS3i2TlYVb3pJKkJx63l66/LnNBkqNbFeQbCLBLaRbgVPUA8LnxnZ6QTUM/f38Ena856Pbp0ALgsHhID9OnCrcwxg9b71KIIDvRISoT6e3/GdnxM28gUiQdTSMxJlpmZq7OZLPfj/HO+h8yqKpMmR8JlOGH6Hz6A8 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)(10201501046)(3002001)(93006095)(93001095)(100000703073)(100105400095)(6055026)(6041248)(20161123564025)(20161123562025)(20161123560025)(20161123555025)(20161123558100)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(6072148)(100000704073)(100105200095)(100000705073)(100105500095); SRVR:VI1PR05MB1917; BCL:0; PCL:0; RULEID:(100000800073)(100110000095)(100000801073)(100110300095)(100000802073)(100110100095)(100000803073)(100110400095)(100000804073)(100110200095)(100000805073)(100110500095); SRVR:VI1PR05MB1917; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR05MB1917; 4:igKDtLsqfNxFaPk4M23xpvLJs3YY0XDzfX02QhXSt7?= =?us-ascii?Q?0T+Lm5Qqk3qV8DemUD02AXNUQpGa/H/RuWZj++rmwzS4Alt8YetVQ9Qrqe7Q?= =?us-ascii?Q?9IsQ/flybUdKQ8/l837dCLBxoQx5jtky7FsOZP3pya5i43+H3ovwTBw+wcDF?= =?us-ascii?Q?7EWbvd8g5Dyi/5P3N+uKX+w14lgomPcZNUNRzA1aa5Edtf5HZ5+dvjmi6a/O?= =?us-ascii?Q?UDg90AAAJtxkDk1QeUdV7490JEX7AkcXfCjSWOonbmLko6IobEivzfMeqyOD?= =?us-ascii?Q?pz+Ljd6xiEqtzCEHU520kRbEK80GILWdydaPHqeC+doXshs6uG5CwJB4GD0F?= =?us-ascii?Q?pnii7A6z4YxoK0NL+WWDGjKh5CpqvkQxC4wl0vIh3FXsXdOJ9hDrfmUQfiiZ?= =?us-ascii?Q?B0g+J5aGm4Z6+SQbej1z/b+ZSKxiR7K039TQp1jeykbdZMbxXEwOwIlnBCt7?= =?us-ascii?Q?UZhm8ZITGsiauLiYCsqTPa5RhtFkXZgdeNc1P0GliwmrdD3eZkMP7CpnicXE?= =?us-ascii?Q?pbOPPAFY3vPk3A7Q9ji2XURStR8WM5Z9zt1Bvh6Kr4Mo0jH9oJ347sxJMKKs?= =?us-ascii?Q?FptRYIIpAnCLXC9tnelBXXZuOIm6YPtRiSpZJy6kC64j/uYaQ2C0YsP+EjNt?= =?us-ascii?Q?upKCG24xb50nDMFdsHhoprHPLnDfdaWCI2iyll71znAtP8Wwjrc/15az6s5R?= =?us-ascii?Q?PgQQOhIO1Wqg6Z2JfktfrcN9lttAFu1BzF9OAnlKCtly4sDDGO0gtyGmvHUa?= =?us-ascii?Q?aRv/gAFOsbMH6vl/7dhN5doUCQLPWK5RTDYEna78vLikvN7ntHdY8GDAOZNZ?= =?us-ascii?Q?6+oadHDuxP6Ejdvp7dXl4CshTCwDqd22iE3Zf5JD0F4UcADyPvLqAax1kljP?= =?us-ascii?Q?NDTSN/7NIr/4066Whq1Vykz6Hdi2KMcFG4HgeT/lay+FJAXvvmpi2WBcdDva?= =?us-ascii?Q?sKK9plBOMWdKl4TOt1TYRDzDpes9wdoylNNg7QHTBrvyvxyy6EunQfXmse/3?= =?us-ascii?Q?edPvKeeOuSYb/yc0RIItv3xUslFE3+AnVhdvddFg3E00L8anhlmg3+584OUn?= =?us-ascii?Q?8MhGyy+NPGUWfGgn7jwX+7WDPrGDGfNpekfksInfUr4mAaZFmi/vAI7w/D4c?= =?us-ascii?Q?VXzRWwKiZ25CErM2hLhPwckaM7lJI3PKiKrx35MFYtfAfYq1vJFQ=3D=3D?= X-Forefront-PRVS: 03218BFD9F X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(6009001)(39400400002)(39860400002)(39850400002)(39840400002)(39450400003)(39410400002)(7736002)(305945005)(42186005)(6916009)(50466002)(33646002)(48376002)(478600001)(110136004)(53936002)(5660300001)(38730400002)(107886003)(81166006)(8676002)(575784001)(86362001)(4326008)(25786009)(189998001)(36756003)(47776003)(6666003)(55016002)(54906002)(4720700003)(50226002)(2351001)(50986999)(2906002)(66066001)(6116002)(3846002); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR05MB1917; H:mellanox.com; FPR:; SPF:None; MLV:sfv; LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR05MB1917; 23:ybp1440imzV4IZXGsNEhKpYwiXaGWU25PDxscSY7C?= =?us-ascii?Q?eOnnUrdXaXLq1Vc5OK6thd6+f2FL+m0jlkbkJ8eRhwTnseJEBJmxh4Lt2Fg7?= =?us-ascii?Q?7d0+IzxBaLoGJwzFBrA/QcOs1SE3B5bJYTkCEj682ey3IIZKnjdWBnyNq8pS?= =?us-ascii?Q?JUH6yZ0Li61zLBdp3ACkT7W5XyZLz1bbmBk7nilp2j5FhfxlhcRdUiOa2OSI?= =?us-ascii?Q?1kiMjpKg9VmtM4PnwsRiI+9xnxgU/UyBe14uMN8Zhu6INf9cr1GwViOE/j6l?= =?us-ascii?Q?NQcs+sDhpe/n+C8oB9gO8tItR6H3lpPwsJ9hRqq2XGQZWguqq3o26sITUoRh?= =?us-ascii?Q?ng0uMM25VHP/QxV0Ubt4kJ+8rQC3wwanWTGwGd8gIsmLMgg82g9ku2HpIru3?= =?us-ascii?Q?+2mtki0vXm5deabr8ZcGFtt4jKYIAOciepc9wQOmTMrmZH1OQcsh+Z8bvpHA?= =?us-ascii?Q?KIw5H9As1T50/GHGvwI0Sil3d4Tna8fDg2gxeSDV6k1K0ITFPPUDCtg1FEx6?= =?us-ascii?Q?ijz5j7/LAkP8sdYYiKAAV5g/9/Jgcqhx2Byo8GrkXpnUTg9HWGey9NYfqfMw?= =?us-ascii?Q?kcL95KLeye4ie/ehDPA6wWgXjYnZgNZOLT1LDcOuyr5IK3d7xB+JNluMtYuH?= =?us-ascii?Q?Ex94wLygCnDOQkv7+dkaFsm3lwApgbZJEOcu8t/7ldb7rVIhg+izn01f0J4n?= =?us-ascii?Q?jh0/jZ4gxzQOo25jxkrjJaAB0CgLwPMvHw19U01cvp+0WxJfXV9skAyK75gG?= =?us-ascii?Q?rfVsLSxXUIhB95iexzFS0epEHz6cmXO6y5kSrPCyrsudURbknAp3BCkeystf?= =?us-ascii?Q?HbxAXSkJ17Ww2qN9kYubLDW572ovOJxczEX0fls81oKIbvMsB29B1EcfkNQA?= =?us-ascii?Q?nynwwpD6EQS4MSZDaZmigLAlaLp2mi0vVRKhki+lR4bHA3RKCZ9DLc1nxvmC?= =?us-ascii?Q?8lCSZJp9WQeMeJ2nWhLoNnEh/godjtXSVgi8zWSESdVzlb5bEaYyU/BDVwzx?= =?us-ascii?Q?E8/aqpXxV1jtqIvW3elVXhnLVsLOnGDkm+xTtmbPKLHxGA0K87EQnQR3l98R?= =?us-ascii?Q?b0yTXg=3D?= X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB1917; 6:9tLJhfwaoV4KL2F6wFbGgkKg8TYE3+zBVA0d3fXr5Nb2Zh1Q7nv4HMQUMtupCxb4oLglgZPnQsDHxxR09l2da76aUITDDFjmhBpSFvCaRWC3RPFLz8SyZsJsLsgz6rQQoLthnZISkd/TfIIFey2AkTkxQhnKj+6dBRnU7BCwpL7oIWYqE1Ozt+/0lcXFcIhZdrKI2E6jfTQpy0SFgUOhAElHIR2YPstCQZ+H2RibhS28+dDNJsOCaNy78C1KBEfTd46OPX9GbMTX/IfDvoInXULB27qoVujsbWhrdX1liOsksn4ybr02c83nOBbBB3T5GjIoMZRH5Qm70W2c+i5mJjcfH1twRe/s/leXB3xxISCOG4jdIxJU8We4Ha/y8UhXrIyj4SZe1WUe2XnkQuoGRDaWoRK/47tvFGQf+2i4LG5oEePxXIlS/y4hBvV20Z3KqdIV6FxhE/z2AOorWVvStp+ckzqIWgfcdDs+WXtE6H3buQMoqaZnb9ZpnXdqTyPccZrwNg+xWGtTZnIbPik8KW/MU5yIDcSNZDCm7xgjIHA= X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB1917; 5:szz59IS3cej2HrDHvbiUgXsXnrG4DN16IW0rAWw7KEvkrdLHKHLaBW6whXVMlaZHzCJKIjHYZaQTUSNN62BDaBqD57r7rg/pshdhYHDN/nkMzh09QjR1BtnbneAP5RAJbiipT171O+tkORDUQz+1s2bD5cp01BuUPLGptDLJuCbzRB3PdfZ7sX6aZ1s9qQ1+QftpzwCLlpFIC9horyghRRpAAGL1GLyDlXEM8Eg4pB78TAytIZjKKC2CYKWa38qQv1sbAvqMr7jK2nnYK2jWQnUX9PsI+JaEhZbL8YmtWVddy3n9m/bleF1AVLVaHxGAevozkkTvRSPhLTuMOC67Qssufyots1xIAgfFMTGA46mIkxav0fVr5pKB+vbd7/fQkv6G0H6TdnKhtyQ+KPLPim7zz7ARHk08NVJjH+Lme+ofi9epZzIcTXDeb3ihl0avGyo3pc4xaQJqKXtB+pBqOiGdH7y2nlhwAnPJ5Fz17R4uMqdb9oqBhpF1F9Y4BNTl; 24:pufQ5Fxk2nzaTRxTCgP9IroSVvTZynx9E+aORbeyufj+3PBdC/nzopJRtWAqOhBFENrT7q7WgJR/oBqXu5c547bICl9OqqK5F1BZA/FrcuY= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB1917; 7:AEbRy/LHklihRqsrp+OcDXAYeI8jq4RC9EHhzso5B/3VSaVN72ZbW7PtLDNydmACWnuqpY1XoPp9Zc8aC3xHWU56zwxORszzP4fRBP377hyN2kmmYC2qcVQH0iDzs0rcgQqJzBomF/GHYLO+JOqIUM1I96Qf1wEDq9uaelCeDMXr13nnA9LumHGEIAUT3oHWIwGojJ0vMORRyYM5ka1SduIln+EdduhaHuUIfOCEvRZePIThIRnTNicfg79WzhV8kZeZZ4v2idXq7RJAAu1oDnaJyuxBBBujFesIZhfDdEgpqjNO3MligH9oEU2Xt36usyOhQnnRUi8orAPChI4G/Q== X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 May 2017 14:04:34.9040 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR05MB1917 X-Mailman-Approved-At: Tue, 30 May 2017 15:50:57 +0200 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 14:04:38 -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