Skip to content

Commit 1392cb6

Browse files
committed
issue: 1792164 Fix race access to error queue
Signed-off-by: Igor Ivanov <[email protected]>
1 parent fc9acbe commit 1392cb6

File tree

4 files changed

+24
-9
lines changed

4 files changed

+24
-9
lines changed

src/vma/sock/sockinfo.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1663,7 +1663,9 @@ void sockinfo::handle_recv_errqueue(struct cmsg_state *cm_state)
16631663
return;
16641664
}
16651665

1666+
m_error_queue_lock.lock();
16661667
buff = m_error_queue.get_and_pop_front();
1668+
m_error_queue_lock.unlock();
16671669

16681670
if (!(buff->m_flags & mem_buf_desc_t::CLONED)) {
16691671
si_logerr("Detected invalid element in socket error queue as %p with flags 0x%x",

src/vma/sock/sockinfo.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,7 @@ class sockinfo : public socket_fd_api, public pkt_rcvr_sink, public pkt_sndr_sou
269269
* to provide notification ability.
270270
*/
271271
descq_t m_error_queue;
272+
lock_spin m_error_queue_lock;
272273

273274
/* TX zcopy counter
274275
* The notification itself for tx zcopy operation is a simple scalar value.

src/vma/sock/sockinfo_tcp.cpp

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4635,10 +4635,6 @@ mem_buf_desc_t* sockinfo_tcp::tcp_tx_zc_alloc(mem_buf_desc_t* p_desc)
46354635

46364636
void sockinfo_tcp::tcp_tx_zc_callback(mem_buf_desc_t* p_desc)
46374637
{
4638-
uint32_t lo, hi;
4639-
uint16_t count;
4640-
uint32_t prev_lo, prev_hi;
4641-
mem_buf_desc_t* err_queue = NULL;
46424638
sockinfo_tcp* sock = NULL;
46434639

46444640
if (!p_desc) {
@@ -4655,6 +4651,22 @@ void sockinfo_tcp::tcp_tx_zc_callback(mem_buf_desc_t* p_desc)
46554651
goto cleanup;
46564652
}
46574653

4654+
sock->tcp_tx_zc_handle(p_desc);
4655+
4656+
cleanup:
4657+
/* Clean up */
4658+
p_desc->m_flags &= ~mem_buf_desc_t::ZCOPY;
4659+
memset(&p_desc->tx.zc, 0, sizeof(p_desc->tx.zc));
4660+
}
4661+
4662+
void sockinfo_tcp::tcp_tx_zc_handle(mem_buf_desc_t* p_desc)
4663+
{
4664+
uint32_t lo, hi;
4665+
uint16_t count;
4666+
uint32_t prev_lo, prev_hi;
4667+
mem_buf_desc_t* err_queue = NULL;
4668+
sockinfo_tcp* sock = this;
4669+
46584670
count = p_desc->tx.zc.count;
46594671
lo = p_desc->tx.zc.id;
46604672
hi = lo + count - 1;
@@ -4665,6 +4677,8 @@ void sockinfo_tcp::tcp_tx_zc_callback(mem_buf_desc_t* p_desc)
46654677
p_desc->ee.ee_info = lo;
46664678
// p_desc->ee.ee_code |= SO_EE_CODE_ZEROCOPY_COPIED;
46674679

4680+
m_error_queue_lock.lock();
4681+
46684682
/* Update last error queue element in case it has the same type */
46694683
err_queue = sock->m_error_queue.back();
46704684
if (err_queue &&
@@ -4691,14 +4705,11 @@ void sockinfo_tcp::tcp_tx_zc_callback(mem_buf_desc_t* p_desc)
46914705
sock->m_error_queue.push_back(err_queue);
46924706
}
46934707

4708+
m_error_queue_lock.unlock();
4709+
46944710
/* Signal events on socket */
46954711
NOTIFY_ON_EVENTS(sock, EPOLLERR);
46964712
sock->do_wakeup();
4697-
4698-
cleanup:
4699-
/* Clean up */
4700-
p_desc->m_flags &= ~mem_buf_desc_t::ZCOPY;
4701-
memset(&p_desc->tx.zc, 0, sizeof(p_desc->tx.zc));
47024713
}
47034714

47044715
struct tcp_seg * sockinfo_tcp::tcp_seg_alloc(void* p_conn)

src/vma/sock/sockinfo_tcp.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ class sockinfo_tcp : public sockinfo, public timer_handler
187187

188188
mem_buf_desc_t* tcp_tx_zc_alloc(mem_buf_desc_t* p_desc);
189189
static void tcp_tx_zc_callback(mem_buf_desc_t* p_desc);
190+
void tcp_tx_zc_handle(mem_buf_desc_t* p_desc);
190191

191192
bool inline is_readable(uint64_t *p_poll_sn, fd_array_t *p_fd_array = NULL);
192193
bool inline is_writeable();

0 commit comments

Comments
 (0)