net: mvpp2: fix a txq_done race condition
[ Upstream commitpull/10/head774268f3e5
] When no Tx IRQ is available, the txq_done() routine (called from tx_done()) shouldn't be called from the polling function, as in such case it is already called in the Tx path thanks to an hrtimer. This mostly occurred when using PPv2.1, as the engine then do not have Tx IRQs. Fixes:edc660fa09
("net: mvpp2: replace TX coalescing interrupts with hrtimer") Reported-by: Stefan Chulski <stefanc@marvell.com> Signed-off-by: Antoine Tenart <antoine.tenart@bootlin.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
parent
d9bf6699ae
commit
85ebbc5a25
|
@ -6534,10 +6534,12 @@ static int mvpp2_poll(struct napi_struct *napi, int budget)
|
|||
cause_rx_tx & ~MVPP2_CAUSE_MISC_SUM_MASK);
|
||||
}
|
||||
|
||||
cause_tx = cause_rx_tx & MVPP2_CAUSE_TXQ_OCCUP_DESC_ALL_MASK;
|
||||
if (cause_tx) {
|
||||
cause_tx >>= MVPP2_CAUSE_TXQ_OCCUP_DESC_ALL_OFFSET;
|
||||
mvpp2_tx_done(port, cause_tx, qv->sw_thread_id);
|
||||
if (port->has_tx_irqs) {
|
||||
cause_tx = cause_rx_tx & MVPP2_CAUSE_TXQ_OCCUP_DESC_ALL_MASK;
|
||||
if (cause_tx) {
|
||||
cause_tx >>= MVPP2_CAUSE_TXQ_OCCUP_DESC_ALL_OFFSET;
|
||||
mvpp2_tx_done(port, cause_tx, qv->sw_thread_id);
|
||||
}
|
||||
}
|
||||
|
||||
/* Process RX packets */
|
||||
|
|
Loading…
Reference in New Issue