mirror of
https://github.com/apache/nuttx.git
synced 2026-06-07 01:05:54 +08:00
rptun: add ns_match callback to resolve rptun deadlock
thread A: accept -> net_lock -> socket_rpmsg_accept
-> rpmsg_register_callabck -> rptun_lock
thread B: ns_bind -> rpmsg_socket_ns_bind -> get_tx_payload_buffer
-> rptun_wait_tx -> usrsock_rpmsg_ept_cb -> usrsockdev_write
-> net_lock -> deadlock
fix:
add ns_match callback
Signed-off-by: ligd <liguiding1@xiaomi.com>
This commit is contained in:
@@ -63,6 +63,9 @@ struct syslog_rpmsg_server_s
|
||||
|
||||
static void syslog_rpmsg_write(FAR const char *buf1, size_t len1,
|
||||
FAR const char *buf2, size_t len2);
|
||||
static bool syslog_rpmsg_ns_match(FAR struct rpmsg_device *rdev,
|
||||
FAR void *priv_, FAR const char *name,
|
||||
uint32_t dest);
|
||||
static void syslog_rpmsg_ns_bind(FAR struct rpmsg_device *rdev,
|
||||
FAR void *priv_, FAR const char *name,
|
||||
uint32_t dest);
|
||||
@@ -167,6 +170,13 @@ static void syslog_rpmsg_write(FAR const char *buf1, size_t len1,
|
||||
}
|
||||
}
|
||||
|
||||
static bool syslog_rpmsg_ns_match(FAR struct rpmsg_device *rdev,
|
||||
FAR void *priv_, FAR const char *name,
|
||||
uint32_t dest)
|
||||
{
|
||||
return !strcmp(name, SYSLOG_RPMSG_EPT_NAME);
|
||||
}
|
||||
|
||||
static void syslog_rpmsg_ns_bind(FAR struct rpmsg_device *rdev,
|
||||
FAR void *priv_, FAR const char *name,
|
||||
uint32_t dest)
|
||||
@@ -174,11 +184,6 @@ static void syslog_rpmsg_ns_bind(FAR struct rpmsg_device *rdev,
|
||||
FAR struct syslog_rpmsg_server_s *priv;
|
||||
int ret;
|
||||
|
||||
if (strcmp(name, SYSLOG_RPMSG_EPT_NAME))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
priv = kmm_zalloc(sizeof(struct syslog_rpmsg_server_s));
|
||||
if (!priv)
|
||||
{
|
||||
@@ -308,5 +313,6 @@ int syslog_rpmsg_server_init(void)
|
||||
return rpmsg_register_callback(NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
syslog_rpmsg_ns_match,
|
||||
syslog_rpmsg_ns_bind);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user