From patchwork Mon Aug 20 05:18:45 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jia Yu X-Patchwork-Id: 43787 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 [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id B99263230; Mon, 20 Aug 2018 08:54:45 +0200 (CEST) Received: from NAM01-BN3-obe.outbound.protection.outlook.com (mail-bn3nam01on0063.outbound.protection.outlook.com [104.47.33.63]) by dpdk.org (Postfix) with ESMTP id 44EB12BCD; Mon, 20 Aug 2018 08:54:44 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vmware.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=2P7+j3goFJdXJbAnG3QWyZz5Fl/LXf++MFi0ZVQjXuk=; b=Dan/NSQn3+enZfyKy2qyyl6grO4U+5coyMNt7xSU8gcnqSzBuy6lLj4i9LuK/92p1ZdtnfRoahuOO8s9pFfs9+6Bb1oRS9Q9BHskaMgNphJtDU1RzzbHyDor90VB4Bi4K3U008CIP7nbnrp8vgYQFX+NKTq+hHOkiqPj1PF1kf0= Received: from sc2-edge-ivybridge-12.eng.vmware.com (66.170.99.2) by BN3PR05MB2484.namprd05.prod.outlook.com (2a01:111:e400:7bb4::25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1080.10; Mon, 20 Aug 2018 06:54:41 +0000 From: Jia Yu To: dev@dpdk.org Cc: 3chas3@gmail.com, declan.doherty@intel.com, stable@dpdk.org Date: Sun, 19 Aug 2018 22:18:45 -0700 Message-Id: <1534742325-10181-1-git-send-email-jyu@vmware.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: References: MIME-Version: 1.0 X-Originating-IP: [66.170.99.2] X-ClientProxiedBy: BN6PR03CA0008.namprd03.prod.outlook.com (2603:10b6:404:23::18) To BN3PR05MB2484.namprd05.prod.outlook.com (2a01:111:e400:7bb4::25) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 64233df7-46fa-4cd9-3646-08d60669cde9 X-Microsoft-Antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989137)(4534165)(4627221)(201703031133081)(201702281549075)(8990107)(5600074)(711020)(2017052603328)(7153060)(7193020); SRVR:BN3PR05MB2484; X-Microsoft-Exchange-Diagnostics: 1; BN3PR05MB2484; 3:IWhE21HJMkaCJHuC2xRkOGeYM2m4v+3FM0nkHfNH9+SLY9TZ3MjZrwvm8QlwzyNIjiJLiQcaikiFsrIITDzBHDDoV2jGEENchqb4gB4SphnbuwOwRHYWGLlgzatfDez0rvsWQCbh1rGPcvdwGC/Px9u8435pxj9uzSF0eOXkpZYpNG3Y+jm/9aCjofJROKDvtWcMpgvwi6IZMR7HFKAujS1t/d1j7A5FuFhPFSJVqg+Xpst78kNDQqQX80B7yVeF; 25:fI4zqvMMv31wGd2MJU/XlWkf5hvnfKlys7R2B2wUB1EF+37X4d8wYImpP7EEgQFUfKxo6SIgMykNqg8XvQfHTdQ/RHPrTPoPIk1zLIqzNrafmSBSV4lpv5hIRds2XEQX1m103Wm/8R3pBp7ZMs7wjMRuU4DNx8SiqtX3UTyXdeD0hLJMHpZsXDwpP0ElYbrVqyvu6KvOn1MhNhkzYBfi18aNDY2C0vX4C13Dr5lj4nDCKKWsSuBoXvOli5DpmhuOrbJUD2s+li5zwjfcefKSmKSbXmXSLThgpF/5T9SOyPAE/0vZ5dImV0TgU+IhMmp7aQSSpwv/yM0tSyKtkUb3mw==; 31:p5sKnUHJ+gEKeDvaslgczW/+oNY76PFtBz9gjsrtmrRuzxbkwBgOjNS9VITkVdKRmEFMBhyvPrK5aP7l1H/ejItaUbDRLbA16HMvM1nXh+D/0nlPOLsYgqHpY8UlAyn6/fRe7Y7ViqE35TFntFmoITvHa4Je+v6O5goZBvzQ7rx50XKQRaxtpqdsvqNB78JktVJcG9ovECB3N+Ce/Knt5nfhHJjAa6D6PSyM/Lc0Prc= X-MS-TrafficTypeDiagnostic: BN3PR05MB2484: Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=jyu@vmware.com; BCL: 0 X-Microsoft-Exchange-Diagnostics: 1; BN3PR05MB2484; 20:VIJnINa8vtnEgcoqVg4+XMKfeoGzwE7rzm5yVP0NpHuZ1epU3ISMntCH03aVyO/iFJTTsWMCkDAoG0kJJSJsn1K7nH0kIPptAKaxGo4U2EbiiVzBjvHZy0bXYx2wApH6Ps/AYqM0ftz1x2MLnjFTe1fRYL0qEoZjDIhIU/FmW40yMiy3/VDbmCQPf+7Ic3BSFdGqXaOvRxbkAweHU4Rr7dyfPHpY/OVim0vbsGVw0pIfk9wBwnaDGX+bFoVBCgCDl8qNllzE2eDeUkj1IOOT5dQVP6Zd3cMqk6r/5htMQS9z2VIrN8wdcsdAoh2aaBLjfRyz9vXTgGeLqRxULhHgmbGH0bGSduUMiNOpMcaE2JSJ1leUAvV0FtHSuPI3E/6ZHs0kE54jUXlWwYKSc8lQLqxqFteDD91Vv8lj1NHC0Y1Y74MWuwzfPXwMTi23sFI9NlhlLvnAgBy5CNHNXLI1KYaJq9svDLxax6Xnh64UhDB2PoI7EOsnJu8s37fS/CCUZwxaFqS1g6h0ODzrz9FMTBxpSsZFltnyvL5UNLcRuWAqS6XFVjhhZEAllFbwAPKiHYHKwDD/r+he5S7mkKZ8NVZd1p9sxwBnBQY6TOA6fUc=; 4:k0D4lV+/QvgSu+FQTS2l/SO2oncHbrbccgrXbTLq2OXWmJjTuy975kCEbNXpBgqvrM/eu99hhf6lTLIXVAuZMo/U0I3dQ3vFS89m4ah0WpbMZ+zUo434Gy+AINxA1sErVN2Pdf5k6E4m8WMfHEpAaofMSxkVHI11/Y6uB9jAUhPt6hT2lkBiCYXkwL/1UViEWBlrwvV4UE+7oTiecP80cqBRid1WvE02tQKwlJuNINr3mf+nKSijZU9NNwuvseMjo+RbdTQRdGYRmfV3pNpH760U4P+ooSR3O1bhkDUsMN0i2/yYw1AwH2NcCSl8hBOP X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(61668805478150); X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(20180801012)(6040522)(2401047)(8121501046)(5005006)(93006095)(93001095)(3002001)(10201501046)(3231311)(944501410)(52105095)(149027)(150027)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123562045)(20161123564045)(20161123558120)(20161123560045)(201708071742011)(7699016); SRVR:BN3PR05MB2484; BCL:0; PCL:0; RULEID:; SRVR:BN3PR05MB2484; X-Forefront-PRVS: 0770F75EA9 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(366004)(136003)(39860400002)(396003)(346002)(376002)(199004)(189003)(26005)(2906002)(50466002)(7696005)(51416003)(52116002)(97736004)(76176011)(39060400002)(386003)(8936002)(6116002)(2351001)(16586007)(3846002)(106356001)(16526019)(6486002)(316002)(446003)(2616005)(956004)(4326008)(50226002)(11346002)(186003)(476003)(5660300001)(486006)(105586002)(53936002)(25786009)(66066001)(81166006)(68736007)(47776003)(7736002)(48376002)(6916009)(11926002)(305945005)(86362001)(2361001)(81156014)(36756003)(8676002)(478600001); DIR:OUT; SFP:1101; SCL:1; SRVR:BN3PR05MB2484; H:sc2-edge-ivybridge-12.eng.vmware.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; Received-SPF: None (protection.outlook.com: vmware.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BN3PR05MB2484; 23:spMeDEzwRlCcABgolj6iRUThQS7HeIB9PQ+dBDos5?= 97v3Jf02VghrnzUSfOl+msl3ExOoco2xr4S6rKGE7UD0w509n3P3ePtvnZzCYymUHar5K12Mj2MGhh7uhA8s1ntIN+raOA2gGrZdVfvJxKlQHk7814zad08P0uyW1x9Gf8wsq5/HvE7QNoLKfrYvL9YcK47LG7KDXbqzep0jCmVuqu0DZfE7anrUvP15UmPUAy298CHsSWdWZ+c5v0WFQ/8qFzWBPWCl3Azzyjm3SajgNx8kkSJLiIzdYaVO5Jaj/ebQJRLzXSeofx0MnJ2mLlV0YCyqEQYxxJaHpK6Jx7esi0Rfsh2M90YYJK8aUU2wrtVyuKxaGVc/qFnhOxj091wl6+PLndAPyoJE1UMgRU/xoeuNptD8FZT8f5SPBhNJsvBs3ru794mbxFhYmiDWXWOmUuRevmS9J0RICUYmpm3fByxe28J6R80XL3T0BYy3v5mBfX5iAA2V4LqGxWAnwdkiBKWWOhJBU+vO8ChN3Qvyi7SqOy9ro6Q9fNx5LJjrw1IhdZXdtrC8qT+bF21uSRcY2x3DzzhhukSDHclnBwCpnkAyd5EwLd/6Pa5gP5W8+ljCEhWculf4SbsuCznRJ03qRm+Fq0QsaEob5gznbkxh6efkusL6O7M/nYIk1rrpgNYTwuCIuZ3NvTceGu1v/dAZUoDzXwAvOVBQWqCBoQTtnzdZEypQmDF8cBNG80CJI9WJvackBi2iw+7lm4XQIoJRtRFn0gHsC/Mge9k9G0t5xS+DpAG+f1hcsCHHScByoPKUhioW0FYuDTvDQcyrFJXZClHawsXZk4b/86gTqi5xXFVXSCrPcN09MP9+kTeLLPU8gvqHW9VsSpGAW/Or/+XikIe9JTlglnKPHeouyNdm1FUfaMdEEJNFsTLoVJKeKrpJEssnwud3eNyjerRN8LJZbqYuWBDuNc9JCHh6ZxB3nxXNCY1yp5+/5B4OhyAG1AS6tJez1VSULTPoqvoLkydxtVtWdzXIj/d0l5erwJcCSAiRJJ3ddVA6I08bIQzjjqYIGQsqPVoj0wJbte3Ye3Cf42LK07aeAOM3uUzoHijgtj2n1BMNSXE+NSsxE6u66W2GzTfBRhSVqpqn1PupN6b1kBwquT9i8MW8TKSYIFDP5NjM1i+P6FnCyDRhGP8c85Cg16qE+v2mgwPwNDQJySk X-Microsoft-Antispam-Message-Info: 73RWfyQ4Qj1V4FoohZTGiyDsGZ6JLhsjsJHQkIyAmqMBfPFcwHZjaTVULZbXnasiSmM0jWF4y877WAMwP3rtVC2jGWTFB4SjSGZm3UKW+K+aDsCo4hfHgRg6CEk25fo4mL450IaIHs9B9Bt8G6P6FaKcHBwEZIpAXvBhwZehzBpOwf0UTbN/j9woozsJTMre6eXQKWxsrapRTsZGqvqHlsuvEOQf8uBnVROgR3zXd7DDLZSt8JqItkJTekSfJoIhp7rXra9rJ96d+A++bw1Xxdq0Mb0xYtphN6T1ZFw0rIn4Et+b/xW/SfJvwRh0x1mPQTGn3NJD993Zve4cBmsKD94CExjjw5+Er+FvlMlJM9g= X-Microsoft-Exchange-Diagnostics: 1; BN3PR05MB2484; 6:6NGZnV7FV6biEnJgTHgEtRWWfSR8AvZZAZCRdjCc3xGl/ytULxGGHxOhTh3EuAiAWBcOC2nFrL6o5gB1YVEJPUEOe8wb2TfMHZU02zc7YGwse9QOe8Nut++XYeAsoa76kwYgaHMv/e+dTig/ELGZjBTRZwzyA+hqrFhyJE1BHA1w+7lSbBpRRRG1fC8sBS4MPWA8/5ugpHxdzGrqfiopn17YvdBpFUqP2eArJnljvkkU75vUchTxdT3SUz1BfcDOoqNZDhucYNWWmNALXEnSvo4SOz+pjTDd9dg4g3tRU8T8XGg9Rs49edJoSnsefDraWQ9msQ+KtJm+LBi1RbQ0gTJ6wxAELgR8pwghr3GeZDmXy6OAcb9K9n/E875OxoMUQtRfmeAq6B+10XNZYaMFxC8SbTACPQS9uv4392U9JNdbRzICsKThMn2hh3VWrlO2yUDAa8iUs3K6QagHVcrg/A==; 5:4+bA+1/hQb402ooZrTCWDWUmvnltqd4OpyfFt3E2MpGtT+T2DxbMwJORYuQgcmW2W7iwmVmp+uqv6AzkPov/zc5mw4zvLvFAT19l/SOiEMHD5KoBzny2N3jPyYsk5yvnGNgEkIM2I3JZB4P1lcl4GYMU1wsF2s6/IqqOJ2oPRC0=; 7:409YF3gZzYf1JDf24lsivIMsgqilbVoxEtiuRGk/c0JzF9K3nZCB1SgggntOvo7XP76tn1ZylvMucuWQ08mjMnvjN0f3+wrPxpe8eboIaAEbKnGDTOd1RQzSpV1h0E8sNlLcXXidRrdQ7muAv0dv6HqbTj8mJoH9p0pJ6bcrXY5qrUxHm/EiANTQOI2R4wyuldvheCIflARIwPx8vX3hezlSAqyulUyHhKtY9nMNZJh4BJc0pGZbdq5XSF9VSLhR SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; BN3PR05MB2484; 20:x0AUgOxQAiM1fvXMfRykQxcnChT4m0OUxgsTbobv+TE3tBbqHR7i7doncvmDupIsP1kqnmmwXnBhMvU91AIU3EiW94LAIxGaJnr1w6bDzVC6faksPI7IIJEcVwZHnV8/ZCry84UDFeQepKgGq3JKSpglBQrX9rRVCsJTM55UK5k= X-OriginatorOrg: vmware.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Aug 2018 06:54:41.0996 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 64233df7-46fa-4cd9-3646-08d60669cde9 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: b39138ca-3cee-4b4a-a4d6-cd83d9dd62f0 X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN3PR05MB2484 Subject: [dpdk-dev] [PATCH v2] net/bonding: fix buf corruption in merging un-transmitted packets 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" When bond slave devices cannot transmit all packets in bufs array, tx_burst callback shall merge the un-transmitted packets back to bufs array. Recent merge logic introduced a bug which causes invalid mbuf addresses being written to bufs array. When caller frees the un-transmitted packets, due to invalid addresses, application will crash. The fix is avoid shifting mbufs, and directly write un-transmitted packets back to bufs array. Fixes: 09150784a776 ("net/bonding: burst mode hash calculation") Cc: stable@dpdk.org Signed-off-by: Jia Yu Acked-by: Chas Williams --- drivers/net/bonding/rte_eth_bond_pmd.c | 116 +++++++-------------------------- 1 file changed, 23 insertions(+), 93 deletions(-) diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c index 58f7377..c745f31 100644 --- a/drivers/net/bonding/rte_eth_bond_pmd.c +++ b/drivers/net/bonding/rte_eth_bond_pmd.c @@ -300,10 +300,10 @@ bond_ethdev_tx_burst_8023ad_fast_queue(void *queue, struct rte_mbuf **bufs, /* Mapping array generated by hash function to map mbufs to slaves */ uint16_t bufs_slave_port_idxs[RTE_MAX_ETHPORTS] = { 0 }; - uint16_t slave_tx_count, slave_tx_fail_count[RTE_MAX_ETHPORTS] = { 0 }; + uint16_t slave_tx_count; uint16_t total_tx_count = 0, total_tx_fail_count = 0; - uint16_t i, j; + uint16_t i; if (unlikely(nb_bufs == 0)) return 0; @@ -358,34 +358,12 @@ bond_ethdev_tx_burst_8023ad_fast_queue(void *queue, struct rte_mbuf **bufs, /* If tx burst fails move packets to end of bufs */ if (unlikely(slave_tx_count < slave_nb_bufs[i])) { - slave_tx_fail_count[i] = slave_nb_bufs[i] - + int slave_tx_fail_count = slave_nb_bufs[i] - slave_tx_count; - total_tx_fail_count += slave_tx_fail_count[i]; - - /* - * Shift bufs to beginning of array to allow reordering - * later - */ - for (j = 0; j < slave_tx_fail_count[i]; j++) { - slave_bufs[i][j] = - slave_bufs[i][(slave_tx_count - 1) + j]; - } - } - } - - /* - * If there are tx burst failures we move packets to end of bufs to - * preserve expected PMD behaviour of all failed transmitted being - * at the end of the input mbuf array - */ - if (unlikely(total_tx_fail_count > 0)) { - int bufs_idx = nb_bufs - total_tx_fail_count - 1; - - for (i = 0; i < slave_count; i++) { - if (slave_tx_fail_count[i] > 0) { - for (j = 0; j < slave_tx_fail_count[i]; j++) - bufs[bufs_idx++] = slave_bufs[i][j]; - } + total_tx_fail_count += slave_tx_fail_count; + memcpy(&bufs[nb_bufs - total_tx_fail_count], + &slave_bufs[i][slave_tx_count], + slave_tx_fail_count * sizeof(bufs[0])); } } @@ -715,8 +693,8 @@ bond_ethdev_tx_burst_round_robin(void *queue, struct rte_mbuf **bufs, tx_fail_total += tx_fail_slave; memcpy(&bufs[nb_pkts - tx_fail_total], - &slave_bufs[i][num_tx_slave], - tx_fail_slave * sizeof(bufs[0])); + &slave_bufs[i][num_tx_slave], + tx_fail_slave * sizeof(bufs[0])); } num_tx_total += num_tx_slave; } @@ -1221,10 +1199,10 @@ bond_ethdev_tx_burst_balance(void *queue, struct rte_mbuf **bufs, /* Mapping array generated by hash function to map mbufs to slaves */ uint16_t bufs_slave_port_idxs[nb_bufs]; - uint16_t slave_tx_count, slave_tx_fail_count[RTE_MAX_ETHPORTS] = { 0 }; + uint16_t slave_tx_count; uint16_t total_tx_count = 0, total_tx_fail_count = 0; - uint16_t i, j; + uint16_t i; if (unlikely(nb_bufs == 0)) return 0; @@ -1265,34 +1243,12 @@ bond_ethdev_tx_burst_balance(void *queue, struct rte_mbuf **bufs, /* If tx burst fails move packets to end of bufs */ if (unlikely(slave_tx_count < slave_nb_bufs[i])) { - slave_tx_fail_count[i] = slave_nb_bufs[i] - + int slave_tx_fail_count = slave_nb_bufs[i] - slave_tx_count; - total_tx_fail_count += slave_tx_fail_count[i]; - - /* - * Shift bufs to beginning of array to allow reordering - * later - */ - for (j = 0; j < slave_tx_fail_count[i]; j++) { - slave_bufs[i][j] = - slave_bufs[i][(slave_tx_count - 1) + j]; - } - } - } - - /* - * If there are tx burst failures we move packets to end of bufs to - * preserve expected PMD behaviour of all failed transmitted being - * at the end of the input mbuf array - */ - if (unlikely(total_tx_fail_count > 0)) { - int bufs_idx = nb_bufs - total_tx_fail_count - 1; - - for (i = 0; i < slave_count; i++) { - if (slave_tx_fail_count[i] > 0) { - for (j = 0; j < slave_tx_fail_count[i]; j++) - bufs[bufs_idx++] = slave_bufs[i][j]; - } + total_tx_fail_count += slave_tx_fail_count; + memcpy(&bufs[nb_bufs - total_tx_fail_count], + &slave_bufs[i][slave_tx_count], + slave_tx_fail_count * sizeof(bufs[0])); } } @@ -1319,10 +1275,10 @@ bond_ethdev_tx_burst_8023ad(void *queue, struct rte_mbuf **bufs, /* Mapping array generated by hash function to map mbufs to slaves */ uint16_t bufs_slave_port_idxs[RTE_MAX_ETHPORTS] = { 0 }; - uint16_t slave_tx_count, slave_tx_fail_count[RTE_MAX_ETHPORTS] = { 0 }; + uint16_t slave_tx_count; uint16_t total_tx_count = 0, total_tx_fail_count = 0; - uint16_t i, j; + uint16_t i; if (unlikely(nb_bufs == 0)) return 0; @@ -1380,39 +1336,13 @@ bond_ethdev_tx_burst_8023ad(void *queue, struct rte_mbuf **bufs, /* If tx burst fails move packets to end of bufs */ if (unlikely(slave_tx_count < slave_nb_bufs[i])) { - slave_tx_fail_count[i] = slave_nb_bufs[i] - + int slave_tx_fail_count = slave_nb_bufs[i] - slave_tx_count; - total_tx_fail_count += slave_tx_fail_count[i]; - - /* - * Shift bufs to beginning of array to allow - * reordering later - */ - for (j = 0; j < slave_tx_fail_count[i]; j++) - slave_bufs[i][j] = - slave_bufs[i] - [(slave_tx_count - 1) - + j]; - } - } + total_tx_fail_count += slave_tx_fail_count; - /* - * If there are tx burst failures we move packets to end of - * bufs to preserve expected PMD behaviour of all failed - * transmitted being at the end of the input mbuf array - */ - if (unlikely(total_tx_fail_count > 0)) { - int bufs_idx = nb_bufs - total_tx_fail_count - 1; - - for (i = 0; i < slave_count; i++) { - if (slave_tx_fail_count[i] > 0) { - for (j = 0; - j < slave_tx_fail_count[i]; - j++) { - bufs[bufs_idx++] = - slave_bufs[i][j]; - } - } + memcpy(&bufs[nb_bufs - total_tx_fail_count], + &slave_bufs[i][slave_tx_count], + slave_tx_fail_count * sizeof(bufs[0])); } } }