From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR01-VE1-obe.outbound.protection.outlook.com (mail-ve1eur01on0055.outbound.protection.outlook.com [104.47.1.55]) by dpdk.org (Postfix) with ESMTP id 7AE361B66C for ; Mon, 29 Jan 2018 12:18:39 +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=ym8sCBRAmxYuaYM/K3yURJmUgzfyyhR4X/BZKl7PsJs=; b=KQILT45iBX/75DFYZ27rhnq8Nnuf5ajOwpG9xD3CVtHzFhfO/5l+smtTfstIDbx7+53meXCQg+hAMYUemRtg6oDKjRcYG9EqZatScGjOuuR3gn7LVRbxixGCoRaj70X5T2KM5b8Zfz5UVCbQXVgl9s26NXjceAD3u9WHg+2JGrg= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=ophirmu@mellanox.com; Received: from mellanox.com (37.142.13.130) by AM0PR0502MB3873.eurprd05.prod.outlook.com (2603:10a6:208:20::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.444.14; Mon, 29 Jan 2018 11:18:36 +0000 From: Ophir Munk To: dev@dpdk.org, Pascal Mazon Cc: Thomas Monjalon , Olga Shern , Ophir Munk Date: Mon, 29 Jan 2018 11:18:23 +0000 Message-Id: <1517224703-20708-1-git-send-email-ophirmu@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: HE1PR0402CA0055.eurprd04.prod.outlook.com (2603:10a6:7:7c::44) To AM0PR0502MB3873.eurprd05.prod.outlook.com (2603:10a6:208:20::15) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: a79f17bf-9530-4f57-f27f-08d5670a0af7 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(4627221)(201703031133081)(201702281549075)(48565401081)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:AM0PR0502MB3873; X-Microsoft-Exchange-Diagnostics: 1; AM0PR0502MB3873; 3:tLX2N+/Y80g2KUxRsJvzIiohLQ4KS3JpYq9OjXcsfPpoCvPfTrOqddhqTRBp7V9l09v5vZjveeiFHM6tde2fqVI/4IYCz3QFBq1oGIMkK9hHK318bVNvWvJPyn96H7+WohIQ9hQIRPCRA0cr5u7efmRznKvhsk0eTpizt0KL+JW0+/1+X7Yqf0i/yRCw/e7JC9MsN3IxrpqBMiIu1ElHQXXMPlne8xTa5VE/wySkm2WTLOKvtawWAgLbPo9QJMtA; 25:fBzhWxGNoAAvGpq8VBX194wF/BsVRvvWIupTf07g0lGkzDO57wgTyuVE1TbqKbNE+CXx/OIJ961R/2FMGnuZJ+w+ow1oqeuE3+l+Di4B88V668xjZ9qZpqXpZGo/06PGkH1R8vc8cSaxpTNp6ZgsTdb+nxAJDZUmU/Y7YiaTRpE2kclzGeYB0xieCEgbgWwL8KLQCfta9dm+A4bpNe7ItxjLJ7xC4+AfPmFIuT6FCnr4Q/9O5v3UgsAoYwiT/YYuN8mbvJBs8nYmtC5Me+lNppIbN6//1xaYO6g0268HZTALQXs9YKjgu63rQDTN1DIq+wWEI89yqcljdl97a1W5zg==; 31:SZ+vbw/CIkZJ6HjMJ3IjtiZjVJavtjJ9PpKlK+RbUxa84daT2WXLzLseWcnFDHegqHCCkRpsi0v8Qjk/a5eMzF3YO7fkdcrrMY7hnoS9omlN0OAJ8GxjaZJBmMMW3jaOgQjwWTX3ijTIlzx9C/NocLMuRQ9ZypPifzzSA/lhuynXEvo4f6QXYXecURW92j8ic5WlIuREYQ1o4wD7eGalLCxG2tCYll4HsSB0T04a5jo= X-MS-TrafficTypeDiagnostic: AM0PR0502MB3873: X-LD-Processed: a652971c-7d2e-4d9b-a6a4-d149256f461b,ExtAddr X-Microsoft-Exchange-Diagnostics: 1; AM0PR0502MB3873; 20:hiYOKs8WOw1SE5mpLThcRSSUuFcOHwC4+Q1uDoYFIQZHXpMB5Iceti3ZGlMx/nlJEGiRryZWsn6RKOe10PDb3EpbpC/Wg2rIgzuhoSf2tTOsBknzyVA+Wq6mTVOmctyzBm1QGcmw48O2+FXjShYhj7L+v1hNGZ2lr6vJt/uz06VjgG6EqD5tKepxGWTxJ5tHPk7hm2hn9QXVb1lDZqV0H4jHVID86x/Gku2kOwmSt3SozsQ2xQJM697IsXrs6ZYqM0AY11H99EboxJQKIzqXqY8BgTEoJeTWokAH6N14kubdRuoFSvEgUzdI8xAxfVO3rKW8hqI3jl7L8Cwyh+IZnUvPeEgWaIbBMfuiqMEiOwLAItGQnz/PcgHWbJ1Dy2qexUXD+Xm8Dyd+EVGPeBaVo5v3xXOCPUNimtcJBiRlx4uG59NeZc0JoqQgpwCtDivZQKUxB65Am0crgBJgUpDbwv8TJP5vUdo9imlorAMiF/mOfhc06e1p92OgRTTxvjmk; 4:wzncPBV4Ki6xbn6ZPpoE0tXnRB4dtKvqErFD2eYJ9J+pAwEEQZ4gY5rYJZzhrb3rk4qRPXWM3T4MgDQQif2WvBBAgh5SqIrL0tZgsk0DFViT7kxBdbs8GpfKy21+cyU6GXjvSkSbQdmjqXdyNs4NaJcj73y+xdUAVViWhUMyUDUCbZYGY7bJnE+VRLF3c7F1O5OuMucLr4d5rrcvz/ECVBc38UqHb+5Nfta7ry8/gpnreRwTyO4fH5nUeTptjl20HbTXxiIgOaQXhA+FH5q8eA== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(8121501046)(5005006)(93006095)(93001095)(3231101)(944501161)(10201501046)(3002001)(6055026)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(20161123558120)(20161123564045)(20161123562045)(6072148)(201708071742011); SRVR:AM0PR0502MB3873; BCL:0; PCL:0; RULEID:; SRVR:AM0PR0502MB3873; X-Forefront-PRVS: 0567A15835 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(396003)(39860400002)(39380400002)(346002)(376002)(366004)(189003)(199004)(25786009)(68736007)(4326008)(6666003)(33026002)(107886003)(86362001)(4720700003)(66066001)(53936002)(2906002)(316002)(21086003)(52116002)(386003)(59450400001)(6916009)(47776003)(7696005)(26005)(36756003)(48376002)(7736002)(50226002)(478600001)(97736004)(16586007)(55016002)(186003)(105586002)(305945005)(51416003)(6116002)(50466002)(8676002)(54906003)(8936002)(106356001)(5660300001)(3846002)(16526019)(81156014)(69596002)(81166006); DIR:OUT; SFP:1101; SCL:1; SRVR:AM0PR0502MB3873; H:mellanox.com; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A: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; AM0PR0502MB3873; 23:/fgcSdF22q3FJpvkCu5oOxsL51HMywWEL5ljxE7?= =?us-ascii?Q?+cXvkQgxgNy+R+pkYc/LwXxF6yB1r25QUesZfrggctpa31/cANK68sXuoVMG?= =?us-ascii?Q?W5q1yhXDokFY+V/XpvjY2R4WIy8ZTKNHYowexTY7Uu4DUH2oXMoXDhXBNRMw?= =?us-ascii?Q?Sh/aQbm55EAM1j2+tHqF1q4QXSQ7v11XFJPzEsxwuvIrjms6X1YUdLmNxknW?= =?us-ascii?Q?GdtioKSOXT/lLQiyJyWWXu/h6IUkgVw5+tUzPYQrnaaY9W/otaO5gLPu7hwl?= =?us-ascii?Q?485lZlP7KsTf/Gppaz0W1cWuGlMDR2UzPtWZxsOusuQN1A96V25lH0dF6IKu?= =?us-ascii?Q?0fpGm6DOy/226SSfAGxqvX+O+2oe30IGvNpBsQ7FrRHMCCzq3h9UPoUxJF17?= =?us-ascii?Q?k7MupnV1vZ03xEmZJOKYBxuk5C+KUE7MkVBHofVC/zce2iV/MtUNzHtgloXM?= =?us-ascii?Q?E8khEAlnXOcBViTm56/KyWlzHgHzETp/CinihCeP2d/KfEOHKvARflcC0aDW?= =?us-ascii?Q?9VaASOK2rxvoCFBFjVyPYpI53dlafdWkxcczxvDqIWsBQ1wK51rWccqpLJdv?= =?us-ascii?Q?Pf0rGzew7Px0wgUGWa02myqSp9hJlJqi155dJf7qOpg2Fa2WIrm3AUUjycH3?= =?us-ascii?Q?fYKVUq2hclgCT/0vz2Zrn+EFsgnsW1wI1Y+8P3wyhP7q1CvL2g/jWNizmA+2?= =?us-ascii?Q?OdiZ5ipGbRH6hRH4KDILY8rN6GCf/hLlLpu5x9H88AUi7dWgFDLRkS7rQtjB?= =?us-ascii?Q?dF+Xpm4De3YPtJC5rz2VgHQdc0OYUyMX8vY04izcfMPwgHk9QlxA4HGry5U8?= =?us-ascii?Q?iKX3JlS0Dmj93/CiVtnFO/qGXSO0rjIH6L++UdECbbj4FSpULpZQ8hjnwlOL?= =?us-ascii?Q?DPFpeU+yLEElwFfOAgOCPVcPgsN3S9aP2O1bGDP/ZeqH70cGqY2T6YIj3AT8?= =?us-ascii?Q?PeBcgp064fRFqYoxPvaKDrAdkv//apU1cVSIeiUcvuPunk5SlactGN+x077I?= =?us-ascii?Q?aeoGb9sMatUg9H/AxlA4SJ8AD5fwXJj+q7b7Q4b6YITcuOn6QR5G+/Y5rWRY?= =?us-ascii?Q?vWuV7pt9QTzQZb+VfDAGYuAi7A5orIFIOVSJAWRrGxmMWLsO2kmdlNSODvM0?= =?us-ascii?Q?cN1hxz57rYYsFmoh/y/28pXEKvDjqVBmqMkbIVABMGBwYXTUbJJ84ZaujmHw?= =?us-ascii?Q?MM+YSoUGR+3TKMWf7cJ9xOrvXQJ6sNe24C1UG?= X-Microsoft-Exchange-Diagnostics: 1; AM0PR0502MB3873; 6:0hDJR31+J/a3MEN1HpmspXB06FqAppI8b1WsxWU14huePCf5hudTNjbbZgU5PexJaRnff42SXhb9bhpACTGUjTZ44oVFnJigGORshRFEMN9zzPFsHuWhGkwRpc9B7OH+wH7pYKr4GY8dmKf5fkzVji16WDvG558Q2LwPxAGO0SW9T+DrNgFVAFHkCHG5CQS/9Pw8My779YyJ2YLyWhFslDGXXa2oY6RZ62RsoD8Btq6OFY3BBfg1YKSTwbCGFEIuDhrt9ps1V5x33Gg1ZRGNdUZCrFeA2xrqbIunVqYrYEUi4ayZ3nE1dAaywD7+I01GsDB9C6mXfHRHNVAb+N4Ricd820eqqCVyPlQMhe4nVDU=; 5:m+DXHZVznsJqVGZFdTAsg9JusPQUpyGc9meQGDiJnAmI+kmzyeaQWJlI657nC4SMTDtnFaPyRaRc/xbLUxzbAmQFwwRfSa/GPI6SueiGPkPyHauHmJoHCVfas1hX34wIpobTvOakU5T9L/cSyLFsJjbpSHZXikxCHnMj5emjPjw=; 24:hEFzjx0Y0vFbPSFBrlO2IgudUlptP0YiGwI39Utj/6E0q5xint1VTZH4JPb4+FVXfP7n8TOxlUm/VtLyvN97+PMq5J/PwsjaWMEkNTirurM=; 7:kqv0ynnfJ7zi44ChaH2WGduW2GAG9eSwI48B1akfz+Zi15Tsvpi1UvqowLUQe3dX1sVt9g+O/wOoqhXCQByacmyYB8EuUATgSQIkkcEeunb3VJ/aRROwSkJSyezGOZ5j3Bat1l9Su8xpEUpG0t28QmBkM4qDvSGFi5bfuZVCL1JOk463tRIf8Il0cYtauOFZ0p5LtzRX7We0rAR1YL4VGGQXtwo84AH5XKi1AV3Richb+ipzPF7JZ+b2cQevEc59 SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Jan 2018 11:18:36.2430 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: a79f17bf-9530-4f57-f27f-08d5670a0af7 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR0502MB3873 Subject: [dpdk-dev] [PATCH v1] net/tap: fix eBPF file descriptors leakage 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: Mon, 29 Jan 2018 11:18:39 -0000 When a user creates an RSS rule, the tap PMD dynamically allocates a 'flow' data structure, and uploads BPF programs (represented by file descriptors) to the kernel. The kernel might reject the rule (due to filters overlap, for example) in which case, flow memory should be freed and BPF file descriptors should be closed. In the corrupted code there were scenarios where BPF file descriptors were not closed. The fix is to add a new function - tap_flow_free(), which will make sure to always close BPF file descriptors before freeing the flow allocated memory. Fixes: 036d721a8229 ("net/tap: implement RSS using eBPF") Signed-off-by: Ophir Munk --- drivers/net/tap/tap_flow.c | 84 +++++++++++++++++++++++++++++----------------- 1 file changed, 53 insertions(+), 31 deletions(-) diff --git a/drivers/net/tap/tap_flow.c b/drivers/net/tap/tap_flow.c index 6aa53a7..5c87f8e 100644 --- a/drivers/net/tap/tap_flow.c +++ b/drivers/net/tap/tap_flow.c @@ -212,6 +212,9 @@ struct action_data { const struct rte_flow_action actions[], struct rte_flow_error *error); +static void +tap_flow_free(struct rte_flow *flow); + static int tap_flow_destroy(struct rte_eth_dev *dev, struct rte_flow *flow, @@ -1311,6 +1314,36 @@ struct tap_flow_items { } /** + * Free the flow opened file descriptors and allocated memory + * + * @param[in] flow + * Pointer to the flow to free + * + */ +static void +tap_flow_free(struct rte_flow *flow) +{ + int i; + + if (!flow) + return; + + /* Close flow BPF file descriptors */ + for (i = 0; i < SEC_MAX; i++) + if (flow->bpf_fd[i] != 0) { + close(flow->bpf_fd[i]); + flow->bpf_fd[i] = 0; + } + + /* Release the map key for this RSS rule */ + bpf_rss_key(KEY_CMD_RELEASE, &flow->key_idx); + flow->key_idx = 0; + + /* Free flow allocated memory */ + rte_free(flow); +} + +/** * Create a flow. * * @see rte_flow_create() @@ -1428,7 +1461,7 @@ struct tap_flow_items { if (remote_flow) rte_free(remote_flow); if (flow) - rte_free(flow); + tap_flow_free(flow); return NULL; } @@ -1450,7 +1483,6 @@ struct tap_flow_items { struct rte_flow_error *error) { struct rte_flow *remote_flow = flow->remote_flow; - int i; int ret = 0; LIST_REMOVE(flow, next); @@ -1476,22 +1508,6 @@ struct tap_flow_items { "couldn't receive kernel ack to our request"); goto end; } - /* Close opened BPF file descriptors of this flow */ - for (i = 0; i < SEC_MAX; i++) - if (flow->bpf_fd[i] != 0) { - close(flow->bpf_fd[i]); - flow->bpf_fd[i] = 0; - } - - /* Release map key for this RSS rule */ - ret = bpf_rss_key(KEY_CMD_RELEASE, &flow->key_idx); - if (ret < 0) { - rte_flow_error_set( - error, EINVAL, RTE_FLOW_ERROR_TYPE_HANDLE, NULL, - "Failed to release BPF RSS key"); - - goto end; - } if (remote_flow) { remote_flow->msg.nh.nlmsg_flags = NLM_F_REQUEST | NLM_F_ACK; @@ -1520,7 +1536,7 @@ struct tap_flow_items { end: if (remote_flow) rte_free(remote_flow); - rte_free(flow); + tap_flow_free(flow); return ret; } @@ -1778,6 +1794,7 @@ int tap_flow_implicit_destroy(struct pmd_internals *pmd, } #define MAX_RSS_KEYS 256 +#define KEY_IDX_OFFSET (3 * MAX_RSS_KEYS) #define SEC_NAME_CLS_Q "cls_q" const char *sec_name[SEC_MAX] = { @@ -1934,38 +1951,45 @@ static int rss_enable(struct pmd_internals *pmd, static int bpf_rss_key(enum bpf_rss_key_e cmd, __u32 *key_idx) { __u32 i; - int err = -1; + int err = 0; static __u32 num_used_keys; static __u32 rss_keys[MAX_RSS_KEYS] = {KEY_STAT_UNSPEC}; static __u32 rss_keys_initialized; switch (cmd) { case KEY_CMD_GET: - if (!rss_keys_initialized) + if (!rss_keys_initialized) { + err = -1; break; + } - if (num_used_keys == RTE_DIM(rss_keys)) + if (num_used_keys == RTE_DIM(rss_keys)) { + err = -1; break; + } *key_idx = num_used_keys % RTE_DIM(rss_keys); while (rss_keys[*key_idx] == KEY_STAT_USED) *key_idx = (*key_idx + 1) % RTE_DIM(rss_keys); rss_keys[*key_idx] = KEY_STAT_USED; + /* add offset to return a key out of range */ + *key_idx += KEY_IDX_OFFSET; num_used_keys++; - err = 0; break; case KEY_CMD_RELEASE: - if (!rss_keys_initialized) { - err = 0; + if (!rss_keys_initialized) + break; + + /* subtract offest to restore real key index in range */ + __u32 key = *key_idx - KEY_IDX_OFFSET; + if (key >= RTE_DIM(rss_keys)) break; - } - if (rss_keys[*key_idx] == KEY_STAT_USED) { - rss_keys[*key_idx] = KEY_STAT_AVAILABLE; + if (rss_keys[key] == KEY_STAT_USED) { + rss_keys[key] = KEY_STAT_AVAILABLE; num_used_keys--; - err = 0; } break; @@ -1975,7 +1999,6 @@ static int bpf_rss_key(enum bpf_rss_key_e cmd, __u32 *key_idx) rss_keys_initialized = 1; num_used_keys = 0; - err = 0; break; case KEY_CMD_DEINIT: @@ -1984,7 +2007,6 @@ static int bpf_rss_key(enum bpf_rss_key_e cmd, __u32 *key_idx) rss_keys_initialized = 0; num_used_keys = 0; - err = 0; break; default: -- 1.8.3.1