mirror of
https://github.com/torvalds/linux.git
synced 2024-12-15 23:51:46 +00:00
ibmvnic: Properly dispose of all skbs during a failover.
During a reset, there may have been transmits in flight that are no
longer valid and cannot be fulfilled. Resetting and clearing the
queues is insufficient; each skb also needs to be explicitly freed
so that upper levels are not left waiting for confirmation of a
transmit that will never happen. If this happens frequently enough,
the apparent backlog will cause TCP to begin "congestion control"
unnecessarily, culminating in permanently decreased throughput.
Fixes: d7c0ef36bd
("ibmvnic: Free and re-allocate scrqs when tx/rx scrqs change")
Tested-by: Nick Child <nnac123@linux.ibm.com>
Reviewed-by: Brian King <brking@linux.vnet.ibm.com>
Signed-off-by: Rick Lindsley <ricklind@us.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
ea1c3b77bc
commit
1b18f09d31
@ -5981,6 +5981,15 @@ static int ibmvnic_reset_init(struct ibmvnic_adapter *adapter, bool reset)
|
|||||||
release_sub_crqs(adapter, 0);
|
release_sub_crqs(adapter, 0);
|
||||||
rc = init_sub_crqs(adapter);
|
rc = init_sub_crqs(adapter);
|
||||||
} else {
|
} else {
|
||||||
|
/* no need to reinitialize completely, but we do
|
||||||
|
* need to clean up transmits that were in flight
|
||||||
|
* when we processed the reset. Failure to do so
|
||||||
|
* will confound the upper layer, usually TCP, by
|
||||||
|
* creating the illusion of transmits that are
|
||||||
|
* awaiting completion.
|
||||||
|
*/
|
||||||
|
clean_tx_pools(adapter);
|
||||||
|
|
||||||
rc = reset_sub_crq_queues(adapter);
|
rc = reset_sub_crq_queues(adapter);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user