提交 c650e048 编写于 作者: G Ganji Aravind 提交者: David S. Miller

cxgb4: Fix race between loopback and normal Tx path

Even after Tx queues are marked stopped, there exists a
small window where the current packet in the normal Tx
path is still being sent out and loopback selftest ends
up corrupting the same Tx ring. So, ensure selftest takes
the Tx lock to synchronize access the Tx ring.

Fixes: 7235ffae ("cxgb4: add loopback ethtool self-test")
Signed-off-by: NGanji Aravind <ganji.aravind@chelsio.com>
Reviewed-by: NJesse Brandeburg <jesse.brandeburg@intel.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 33595642
...@@ -2561,11 +2561,14 @@ int cxgb4_selftest_lb_pkt(struct net_device *netdev) ...@@ -2561,11 +2561,14 @@ int cxgb4_selftest_lb_pkt(struct net_device *netdev)
lb->loopback = 1; lb->loopback = 1;
q = &adap->sge.ethtxq[pi->first_qset]; q = &adap->sge.ethtxq[pi->first_qset];
__netif_tx_lock(q->txq, smp_processor_id());
reclaim_completed_tx(adap, &q->q, -1, true); reclaim_completed_tx(adap, &q->q, -1, true);
credits = txq_avail(&q->q) - ndesc; credits = txq_avail(&q->q) - ndesc;
if (unlikely(credits < 0)) if (unlikely(credits < 0)) {
__netif_tx_unlock(q->txq);
return -ENOMEM; return -ENOMEM;
}
wr = (void *)&q->q.desc[q->q.pidx]; wr = (void *)&q->q.desc[q->q.pidx];
memset(wr, 0, sizeof(struct tx_desc)); memset(wr, 0, sizeof(struct tx_desc));
...@@ -2598,6 +2601,7 @@ int cxgb4_selftest_lb_pkt(struct net_device *netdev) ...@@ -2598,6 +2601,7 @@ int cxgb4_selftest_lb_pkt(struct net_device *netdev)
init_completion(&lb->completion); init_completion(&lb->completion);
txq_advance(&q->q, ndesc); txq_advance(&q->q, ndesc);
cxgb4_ring_tx_db(adap, &q->q, ndesc); cxgb4_ring_tx_db(adap, &q->q, ndesc);
__netif_tx_unlock(q->txq);
/* wait for the pkt to return */ /* wait for the pkt to return */
ret = wait_for_completion_timeout(&lb->completion, 10 * HZ); ret = wait_for_completion_timeout(&lb->completion, 10 * HZ);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册