Introduce additional locks when releasing TX resources and buffers in ENA

There could be race condition with TX cleaning routine when cleaning mbufs,
when it was called directly from main sending thread (ena_mq_start).

Submitted by:   Michal Krawczyk <mk@semihalf.com>
Obtained from:  Semihalf
Sponsored by:   Amazon.com Inc.
Differential revision: https://reviews.freebsd.org/D10927
This commit is contained in:
Zbigniew Bodek 2017-05-30 12:00:56 +00:00
parent b9252a8889
commit 416e886499
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=319201

View File

@ -713,6 +713,7 @@ ena_free_tx_resources(struct ena_adapter *adapter, int qid)
drbr_flush(adapter->ifp, tx_ring->br);
/* Free buffer DMA maps, */
ENA_RING_MTX_LOCK(tx_ring);
for (int i = 0; i < tx_ring->ring_size; i++) {
m_freem(tx_ring->tx_buffer_info[i].mbuf);
tx_ring->tx_buffer_info[i].mbuf = NULL;
@ -721,6 +722,7 @@ ena_free_tx_resources(struct ena_adapter *adapter, int qid)
bus_dmamap_destroy(adapter->tx_buf_tag,
tx_ring->tx_buffer_info[i].map);
}
ENA_RING_MTX_UNLOCK(tx_ring);
/* And free allocated memory. */
ENA_MEM_FREE(adapter->ena_dev->dmadev, tx_ring->tx_buffer_info);
@ -1121,6 +1123,7 @@ ena_free_tx_bufs(struct ena_adapter *adapter, unsigned int qid)
{
struct ena_ring *tx_ring = &adapter->tx_ring[qid];
ENA_RING_MTX_LOCK(tx_ring);
for (int i = 0; i < tx_ring->ring_size; i++) {
struct ena_tx_buffer *tx_info = &tx_ring->tx_buffer_info[i];
@ -1134,6 +1137,7 @@ ena_free_tx_bufs(struct ena_adapter *adapter, unsigned int qid)
m_free(tx_info->mbuf);
tx_info->mbuf = NULL;
}
ENA_RING_MTX_UNLOCK(tx_ring);
return;
}