aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/ena
diff options
context:
space:
mode:
authorZbigniew Bodek <zbb@FreeBSD.org>2017-05-30 12:00:56 +0000
committerZbigniew Bodek <zbb@FreeBSD.org>2017-05-30 12:00:56 +0000
commit416e886499fd2fd6f94e4939a6d32211e98c9c95 (patch)
tree274a09d80536513bfc33aad10b711c6e1857aefd /sys/dev/ena
parentb9252a8889bbc8abc10b048203ed91b32c8eae0d (diff)
downloadsrc-416e886499fd2fd6f94e4939a6d32211e98c9c95.tar.gz
src-416e886499fd2fd6f94e4939a6d32211e98c9c95.zip
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
Notes
Notes: svn path=/head/; revision=319201
Diffstat (limited to 'sys/dev/ena')
-rw-r--r--sys/dev/ena/ena.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/sys/dev/ena/ena.c b/sys/dev/ena/ena.c
index 3ef1f41f4604..fc82ed4aa17b 100644
--- a/sys/dev/ena/ena.c
+++ b/sys/dev/ena/ena.c
@@ -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;
}