mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-09 04:10:18 +09:00
net: aquantia: tx clean budget logic error
[ Upstream commit31bafc49a7] In case no other traffic happening on the ring, full tx cleanup may not be completed. That may cause socket buffer to overflow and tx traffic to stuck until next activity on the ring happens. This is due to logic error in budget variable decrementor. Variable is compared with zero, and then post decremented, causing it to become MAX_INT. Solution is remove decrementor from the `for` statement and rewrite it in a clear way. Fixes:b647d39809("net: aquantia: Add tx clean budget and valid budget handling logic") Signed-off-by: Igor Russkikh <igor.russkikh@aquantia.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
b7ca3f331d
commit
388534d45f
@@ -139,10 +139,10 @@ void aq_ring_queue_stop(struct aq_ring_s *ring)
|
||||
bool aq_ring_tx_clean(struct aq_ring_s *self)
|
||||
{
|
||||
struct device *dev = aq_nic_get_dev(self->aq_nic);
|
||||
unsigned int budget = AQ_CFG_TX_CLEAN_BUDGET;
|
||||
unsigned int budget;
|
||||
|
||||
for (; self->sw_head != self->hw_head && budget--;
|
||||
self->sw_head = aq_ring_next_dx(self, self->sw_head)) {
|
||||
for (budget = AQ_CFG_TX_CLEAN_BUDGET;
|
||||
budget && self->sw_head != self->hw_head; budget--) {
|
||||
struct aq_ring_buff_s *buff = &self->buff_ring[self->sw_head];
|
||||
|
||||
if (likely(buff->is_mapped)) {
|
||||
@@ -167,6 +167,7 @@ bool aq_ring_tx_clean(struct aq_ring_s *self)
|
||||
|
||||
buff->pa = 0U;
|
||||
buff->eop_index = 0xffffU;
|
||||
self->sw_head = aq_ring_next_dx(self, self->sw_head);
|
||||
}
|
||||
|
||||
return !!budget;
|
||||
|
||||
Reference in New Issue
Block a user