Skip to content

Commit

Permalink
usrsock_rpmsg_server: Add net_lock to combine get_tx_payload and recv…
Browse files Browse the repository at this point in the history
…from in recvfrom_handler

A dead lock may happen before this patch:
rptun thread (usrsock_rpmsg_recvfrom_handler):
 Gets all tx payload but waiting net_lock in psock_recvfrom
net driver thread (higher priority):
 Receives a packet, holding net_lock, calling usrsock_rpmsg_send_event
 But no tx buffer left, so rpmsg_send blocks, and won't release net_lock

In short:
Rptun: Hold all `tx_payload_buffer` -> want `net_lock`
Driver: Hold `net_lock` -> want `tx_payload_buffer`

This patch use net_lock to combine get_tx_payload and recvfrom together,
then:
- If it's waiting net_lock, tx payload will not be held, other threads
  may get tx buffer and do their work.
- If net_lock is got, it won't be disturbed before finish receiving,
  then tx payload won't have chance to be blocked before releasing.

Signed-off-by: Zhe Weng <[email protected]>
  • Loading branch information
wengzhe authored and xiaoxiang781216 committed Sep 14, 2023
1 parent 50e6dcb commit e4721ce
Showing 1 changed file with 9 additions and 0 deletions.
9 changes: 9 additions & 0 deletions drivers/usrsock/usrsock_rpmsg_server.c
Original file line number Diff line number Diff line change
Expand Up @@ -562,6 +562,13 @@ static int usrsock_rpmsg_recvfrom_handler(FAR struct rpmsg_endpoint *ept,
(FAR void *)(ack + 1) + inaddrlen, ret);
}

/* Hold net_lock to combine get_tx_payload and recvfrom together.
* Otherwise we may keep holding tx buffer when waiting net_lock in
* recvfrom, which may block rpmsg and may cause dead lock if
* another thread tries to get tx buffer with net_lock held.
*/

net_lock();
while (totlen < buflen &&
i < CONFIG_NET_USRSOCK_RPMSG_SERVER_NIOVEC)
{
Expand Down Expand Up @@ -616,6 +623,8 @@ static int usrsock_rpmsg_recvfrom_handler(FAR struct rpmsg_endpoint *ept,
{
events |= USRSOCK_EVENT_RECVFROM_AVAIL;
}

net_unlock();
}
}

Expand Down

0 comments on commit e4721ce

Please sign in to comment.