diff options
author | Zbigniew Bodek <zbb@FreeBSD.org> | 2017-05-30 12:00:56 +0000 |
---|---|---|
committer | Zbigniew Bodek <zbb@FreeBSD.org> | 2017-05-30 12:00:56 +0000 |
commit | 416e886499fd2fd6f94e4939a6d32211e98c9c95 (patch) | |
tree | 274a09d80536513bfc33aad10b711c6e1857aefd /sys/dev/ena | |
parent | b9252a8889bbc8abc10b048203ed91b32c8eae0d (diff) | |
download | src-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.c | 4 |
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; } |