lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Message-Id: <20170429081604.13438.58260.stgit@ltcalpine2-lp23.aus.stglabs.ibm.com> Date: Sat, 29 Apr 2017 04:16:04 -0400 From: Nathan Fontenot <nfont@...ux.vnet.ibm.com> To: netdev@...r.kernel.org Cc: brking@...ux.vnet.ibm.com, jallen@...ux.vnet.ibm.com, muvic@...ux.vnet.ibm.com, tlfalcon@...ux.vnet.ibm.com Subject: [PATCH net-next 06/11] ibmvnic: Clean up tx pools when closing When closing the bimvnic driver, most notably during the reset path, the tx pools need to be cleaned to ensure there are no hanging skbs that need to be free'ed. The need to do this was found during debugging a loss of network traffic after handling a driver reset. The underlying cause was some skbs that were in the tx pool that were never free'ed. As a result the upper network layers never tried a re-send since it believed the driver still had the skb. Signed-off-by: Nathan Fontenot <nfont@...ux.vnet.ibm.com> --- drivers/net/ethernet/ibm/ibmvnic.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c index d20d884..0400ae7 100644 --- a/drivers/net/ethernet/ibm/ibmvnic.c +++ b/drivers/net/ethernet/ibm/ibmvnic.c @@ -760,6 +760,34 @@ static void disable_sub_crqs(struct ibmvnic_adapter *adapter) } } +static void clean_tx_pools(struct ibmvnic_adapter *adapter) +{ + struct ibmvnic_tx_pool *tx_pool; + u64 tx_entries; + int tx_scrqs; + int i, j; + + if (!adapter->tx_pool) + return; + + tx_scrqs = be32_to_cpu(adapter->login_rsp_buf->num_txsubm_subcrqs); + tx_entries = adapter->req_tx_entries_per_subcrq; + + /* Free any remaining skbs in the tx buffer pools */ + for (i = 0; i < tx_scrqs; i++) { + tx_pool = &adapter->tx_pool[i]; + if (!tx_pool) + continue; + + for (j = 0; j < tx_entries; j++) { + if (tx_pool->tx_buff[j].skb) { + dev_kfree_skb_any(tx_pool->tx_buff[j].skb); + tx_pool->tx_buff[j].skb = NULL; + } + } + } +} + static int __ibmvnic_close(struct net_device *netdev) { struct ibmvnic_adapter *adapter = netdev_priv(netdev); @@ -768,6 +796,8 @@ static int __ibmvnic_close(struct net_device *netdev) adapter->state = VNIC_CLOSING; netif_tx_stop_all_queues(netdev); + + clean_tx_pools(adapter); disable_sub_crqs(adapter); if (adapter->napi) {
Powered by blists - more mailing lists