This is an automated email from the ASF dual-hosted git repository. xiaoxiang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit d377f6b7883d1f39ab9e056e41649a61a98286d4 Author: zhanghongyu <[email protected]> AuthorDate: Fri Nov 14 17:53:20 2025 +0800 net: use netdev_lock to protect netdev_txnotify_dev since the type of sconn lock is rmutex, there is no need to release sconn lock before TX Signed-off-by: zhanghongyu <[email protected]> --- net/arp/arp_send.c | 4 ++-- net/can/can_sendmsg.c | 3 +-- net/can/can_sendmsg_buffered.c | 12 +++--------- net/icmp/icmp_sendmsg.c | 2 +- net/icmpv6/icmpv6_autoconfig.c | 2 ++ net/icmpv6/icmpv6_neighbor.c | 4 ++++ net/igmp/igmp_msg.c | 2 ++ net/igmp/igmp_timer.c | 3 --- net/mld/mld_msg.c | 2 ++ net/mld/mld_timer.c | 16 +++++++--------- net/pkt/pkt_sendmsg_buffered.c | 2 +- net/pkt/pkt_sendmsg_unbuffered.c | 3 +-- net/tcp/tcp_connect.c | 4 ++-- net/tcp/tcp_recvfrom.c | 2 ++ net/tcp/tcp_send_buffered.c | 2 +- net/tcp/tcp_sendfile.c | 2 +- net/tcp/tcp_shutdown.c | 2 -- net/tcp/tcp_timer.c | 2 ++ net/udp/udp_sendto_buffered.c | 12 +++++++----- net/udp/udp_sendto_unbuffered.c | 3 +-- 20 files changed, 42 insertions(+), 42 deletions(-) diff --git a/net/arp/arp_send.c b/net/arp/arp_send.c index 5bd032ef0d0..b56300578be 100644 --- a/net/arp/arp_send.c +++ b/net/arp/arp_send.c @@ -359,8 +359,6 @@ int arp_send(in_addr_t ipaddr) state.snd_cb->event = arp_send_eventhandler; state.finish_cb = NULL; - netdev_unlock(dev); - /* MAC address marked with all zeros to limit concurrent task * send ARP request for same destination. */ @@ -379,6 +377,8 @@ int arp_send(in_addr_t ipaddr) * net_sem_wait will also terminate if a signal is received. */ + netdev_unlock(dev); + do { ret = net_sem_timedwait_uninterruptible(&state.snd_sem, diff --git a/net/can/can_sendmsg.c b/net/can/can_sendmsg.c index 120eb7e8ada..373538a5d08 100644 --- a/net/can/can_sendmsg.c +++ b/net/can/can_sendmsg.c @@ -259,8 +259,6 @@ ssize_t can_sendmsg(FAR struct socket *psock, FAR struct msghdr *msg, state.snd_cb->priv = (FAR void *)&state; state.snd_cb->event = psock_send_eventhandler; - conn_dev_unlock(&conn->sconn, dev); - /* Notify the device driver that new TX data is available. */ netdev_txnotify_dev(dev); @@ -269,6 +267,7 @@ ssize_t can_sendmsg(FAR struct socket *psock, FAR struct msghdr *msg, * net_sem_timedwait will also terminate if a signal is received. */ + conn_dev_unlock(&conn->sconn, dev); if (_SS_ISNONBLOCK(conn->sconn.s_flags) || (flags & MSG_DONTWAIT) != 0) { ret = net_sem_timedwait(&state.snd_sem, 0); diff --git a/net/can/can_sendmsg_buffered.c b/net/can/can_sendmsg_buffered.c index 523fcaab54c..09b8ca4d384 100644 --- a/net/can/can_sendmsg_buffered.c +++ b/net/can/can_sendmsg_buffered.c @@ -381,20 +381,14 @@ ssize_t can_sendmsg(FAR struct socket *psock, FAR struct msghdr *msg, conn->sndcb->priv = (FAR void *)conn; conn->sndcb->event = psock_send_eventhandler; - /* unlock */ - - conn_dev_unlock(&conn->sconn, dev); - /* Notify the device driver that new TX data is available. */ netdev_txnotify_dev(dev); } - else - { - /* unlock */ - conn_dev_unlock(&conn->sconn, dev); - } + /* unlock */ + + conn_dev_unlock(&conn->sconn, dev); return msg->msg_iov->iov_len; diff --git a/net/icmp/icmp_sendmsg.c b/net/icmp/icmp_sendmsg.c index 82da6cd8f82..dfced7f117e 100644 --- a/net/icmp/icmp_sendmsg.c +++ b/net/icmp/icmp_sendmsg.c @@ -403,13 +403,13 @@ ssize_t icmp_sendmsg(FAR struct socket *psock, FAR struct msghdr *msg, /* Notify the device driver of the availability of TX data */ - conn_dev_unlock(&conn->sconn, dev); netdev_txnotify_dev(dev); /* Wait for either the send to complete or for timeout to occur. * net_sem_timedwait will also terminate if a signal is received. */ + conn_dev_unlock(&conn->sconn, dev); ret = net_sem_timedwait(&state.snd_sem, _SO_TIMEOUT(conn->sconn.s_sndtimeo)); conn_dev_lock(&conn->sconn, dev); diff --git a/net/icmpv6/icmpv6_autoconfig.c b/net/icmpv6/icmpv6_autoconfig.c index 8a8fcd6f9c5..1da602bebf5 100644 --- a/net/icmpv6/icmpv6_autoconfig.c +++ b/net/icmpv6/icmpv6_autoconfig.c @@ -231,11 +231,13 @@ static int icmpv6_send_message(FAR struct net_driver_s *dev, bool advertise) */ netdev_unlock(dev); + do { net_sem_wait(&state.snd_sem); } while (!state.snd_sent); + netdev_lock(dev); ret = state.snd_result; diff --git a/net/icmpv6/icmpv6_neighbor.c b/net/icmpv6/icmpv6_neighbor.c index a899c196e71..246d16e0b46 100644 --- a/net/icmpv6/icmpv6_neighbor.c +++ b/net/icmpv6/icmpv6_neighbor.c @@ -342,6 +342,8 @@ int icmpv6_neighbor(FAR struct net_driver_s *dev, * net_sem_wait will also terminate if a signal is received. */ + netdev_unlock(dev); + do { net_sem_wait(&state.snd_sem); @@ -354,6 +356,8 @@ int icmpv6_neighbor(FAR struct net_driver_s *dev, ret = icmpv6_wait(¬ify, CONFIG_ICMPv6_NEIGHBOR_DELAYMSEC); + netdev_lock(dev); + /* icmpv6_wait will return OK if and only if the matching Neighbor * Advertisement is received. Otherwise, it will return -ETIMEDOUT. */ diff --git a/net/igmp/igmp_msg.c b/net/igmp/igmp_msg.c index 9d46c3d70c4..ba044aeecfe 100644 --- a/net/igmp/igmp_msg.c +++ b/net/igmp/igmp_msg.c @@ -105,7 +105,9 @@ int igmp_schedmsg(FAR struct igmp_group_s *group, uint8_t msgid) /* Notify the device that we have a packet to send */ + netdev_lock(dev); netdev_txnotify_dev(dev); + netdev_unlock(dev); return OK; } diff --git a/net/igmp/igmp_timer.c b/net/igmp/igmp_timer.c index b1187013965..4a2a0668f82 100644 --- a/net/igmp/igmp_timer.c +++ b/net/igmp/igmp_timer.c @@ -113,7 +113,6 @@ static void igmp_timeout_work(FAR void *arg) * the timer is cancelled before sending the IGMP_LEAVE_GROUP during leave. */ - net_lock(); if (!IS_IDLEMEMBER(group->flags)) { /* Schedule (and forget) the Membership Report. NOTE: @@ -136,8 +135,6 @@ static void igmp_timeout_work(FAR void *arg) * once or twice after short delays [Unsolicited Report Interval]..." */ } - - net_unlock(); } /**************************************************************************** diff --git a/net/mld/mld_msg.c b/net/mld/mld_msg.c index 0b182ce7982..8b1d71ce40c 100644 --- a/net/mld/mld_msg.c +++ b/net/mld/mld_msg.c @@ -80,7 +80,9 @@ int mld_schedmsg(FAR struct mld_group_s *group, uint8_t msgtype) /* Notify the device that we have a packet to send */ + netdev_lock(dev); netdev_txnotify_dev(dev); + netdev_unlock(dev); return OK; } diff --git a/net/mld/mld_timer.c b/net/mld/mld_timer.c index aab12951394..0556082c487 100644 --- a/net/mld/mld_timer.c +++ b/net/mld/mld_timer.c @@ -120,7 +120,6 @@ static void mld_gendog_work(FAR void *arg) ifindex = (intptr_t)arg; DEBUGASSERT(ifindex > 0); - net_lock(); dev = netdev_findbyindex(ifindex); if (dev == NULL) { @@ -133,6 +132,8 @@ static void mld_gendog_work(FAR void *arg) return; } + netdev_lock(dev); + /* Check for an Other Querier Present Timeout. This timer is set in non- * Querier mode to detect the case where we have lost the Querier. */ @@ -171,7 +172,7 @@ static void mld_gendog_work(FAR void *arg) mld_start_gentimer(dev, MSEC2TICK(MLD_OQUERY_MSEC)); } - net_unlock(); + netdev_unlock(dev); } /**************************************************************************** @@ -239,7 +240,6 @@ static void mld_v1dog_work(FAR void *arg) ifindex = (intptr_t)arg; DEBUGASSERT(ifindex > 0); - net_lock(); dev = netdev_findbyindex(ifindex); if (dev == NULL) { @@ -253,14 +253,14 @@ static void mld_v1dog_work(FAR void *arg) { /* Exit MLDv1 compatibility mode. */ + netdev_lock(dev); CLR_MLD_V1COMPAT(dev->d_mld.flags); + netdev_unlock(dev); /* REVISIT: Whenever a host changes its compatibility mode, it cancels * all of its pending responses and retransmission timers. */ } - - net_unlock(); } /**************************************************************************** @@ -329,7 +329,6 @@ static void mld_polldog_work(FAR void *arg) /* Check if this a new join to the multicast group. */ - net_lock(); if (IS_MLD_STARTUP(group->flags)) { MLD_STATINCR(g_netstats.mld.report_sched); @@ -345,13 +344,14 @@ static void mld_polldog_work(FAR void *arg) fwarn("WARNING: No device associated with ifindex=%d\n", group->ifindex); - net_unlock(); return; } /* Schedule (and forget) the Report. */ + netdev_lock(dev); ret = mld_schedmsg(group, mld_report_msgtype(dev)); + netdev_unlock(dev); if (ret < 0) { mlderr("ERROR: Failed to schedule message: %d\n", ret); @@ -375,8 +375,6 @@ static void mld_polldog_work(FAR void *arg) CLR_MLD_STARTUP(group->flags); } } - - net_unlock(); } /**************************************************************************** diff --git a/net/pkt/pkt_sendmsg_buffered.c b/net/pkt/pkt_sendmsg_buffered.c index 8d6b9b43b9d..bc6481adaab 100644 --- a/net/pkt/pkt_sendmsg_buffered.c +++ b/net/pkt/pkt_sendmsg_buffered.c @@ -372,11 +372,11 @@ ssize_t pkt_sendmsg(FAR struct socket *psock, FAR const struct msghdr *msg, conn->sndcb->flags = PKT_POLL; conn->sndcb->priv = conn; conn->sndcb->event = psock_send_eventhandler; - conn_dev_unlock(&conn->sconn, dev); /* Notify the device driver that new TX data is available. */ netdev_txnotify_dev(dev); + conn_dev_unlock(&conn->sconn, dev); } return len; diff --git a/net/pkt/pkt_sendmsg_unbuffered.c b/net/pkt/pkt_sendmsg_unbuffered.c index 6715b4d5e58..ab38974464b 100644 --- a/net/pkt/pkt_sendmsg_unbuffered.c +++ b/net/pkt/pkt_sendmsg_unbuffered.c @@ -237,8 +237,6 @@ ssize_t pkt_sendmsg(FAR struct socket *psock, FAR struct msghdr *msg, state.snd_cb->priv = (FAR void *)&state; state.snd_cb->event = psock_send_eventhandler; - conn_dev_unlock(&conn->sconn, dev); - /* Notify the device driver that new TX data is available. */ netdev_txnotify_dev(dev); @@ -247,6 +245,7 @@ ssize_t pkt_sendmsg(FAR struct socket *psock, FAR struct msghdr *msg, * net_sem_wait will also terminate if a signal is received. */ + conn_dev_unlock(&conn->sconn, dev); ret = net_sem_wait(&state.snd_sem); conn_dev_lock(&conn->sconn, dev); diff --git a/net/tcp/tcp_connect.c b/net/tcp/tcp_connect.c index 1c3a705c497..3bba8132481 100644 --- a/net/tcp/tcp_connect.c +++ b/net/tcp/tcp_connect.c @@ -376,8 +376,6 @@ int psock_tcp_connect(FAR struct socket *psock, info.tc_conn = conn; info.tc_cb = &state.tc_cb; info.tc_sem = &state.tc_sem; - conn_dev_unlock(&conn->sconn, conn->dev); - tls_cleanup_push(tls_get_info(), tcp_callback_cleanup, &info); /* Notify the device driver that new connection is available. */ @@ -389,6 +387,8 @@ int psock_tcp_connect(FAR struct socket *psock, * signal is received. */ + conn_dev_unlock(&conn->sconn, conn->dev); + tls_cleanup_push(tls_get_info(), tcp_callback_cleanup, &info); ret = net_sem_wait(&state.tc_sem); tls_cleanup_pop(tls_get_info(), 0); diff --git a/net/tcp/tcp_recvfrom.c b/net/tcp/tcp_recvfrom.c index 010d3c753a9..45ab7c6594c 100644 --- a/net/tcp/tcp_recvfrom.c +++ b/net/tcp/tcp_recvfrom.c @@ -838,7 +838,9 @@ static ssize_t tcp_recvfrom_one(FAR struct tcp_conn_s *conn, FAR void *buf, if (tcp_should_send_recvwindow(conn)) { conn_unlock(&conn->sconn); + netdev_lock(conn->dev); netdev_txnotify_dev(conn->dev); + netdev_unlock(conn->dev); conn_lock(&conn->sconn); } diff --git a/net/tcp/tcp_send_buffered.c b/net/tcp/tcp_send_buffered.c index 0c87dc287fe..bec10ee2681 100644 --- a/net/tcp/tcp_send_buffered.c +++ b/net/tcp/tcp_send_buffered.c @@ -1665,8 +1665,8 @@ ssize_t psock_tcp_send(FAR struct socket *psock, FAR const void *buf, /* Notify the device driver of the availability of TX data */ - conn_dev_unlock(&conn->sconn, conn->dev); tcp_send_txnotify(psock, conn); + conn_dev_unlock(&conn->sconn, conn->dev); if (chunk_result == 0) { diff --git a/net/tcp/tcp_sendfile.c b/net/tcp/tcp_sendfile.c index 5c1ff7ee7d9..6b1a33776ec 100644 --- a/net/tcp/tcp_sendfile.c +++ b/net/tcp/tcp_sendfile.c @@ -515,12 +515,12 @@ ssize_t tcp_sendfile(FAR struct socket *psock, FAR struct file *infile, TCP_DISCONN_EVENTS); state.snd_cb->priv = (FAR void *)&state; state.snd_cb->event = sendfile_eventhandler; - conn_dev_unlock(&conn->sconn, conn->dev); /* Notify the device driver of the availability of TX data */ tcp_send_txnotify(psock, conn); + conn_dev_unlock(&conn->sconn, conn->dev); for (; ; ) { uint32_t acked = state.snd_acked; diff --git a/net/tcp/tcp_shutdown.c b/net/tcp/tcp_shutdown.c index cf649509607..f29d57b4ae6 100644 --- a/net/tcp/tcp_shutdown.c +++ b/net/tcp/tcp_shutdown.c @@ -137,9 +137,7 @@ static inline int tcp_send_fin(FAR struct socket *psock) /* Notify the device driver of the availability of TX data */ - conn_dev_unlock(&conn->sconn, conn->dev); tcp_send_txnotify(psock, conn); - return ret; } out: diff --git a/net/tcp/tcp_timer.c b/net/tcp/tcp_timer.c index c59360c4d1f..b86a1b38b86 100644 --- a/net/tcp/tcp_timer.c +++ b/net/tcp/tcp_timer.c @@ -154,7 +154,9 @@ static void tcp_timer_expiry(FAR void *arg) { tcp_conn_list_unlock(); conn->timeout = true; + netdev_lock(conn->dev); netdev_txnotify_dev(conn->dev); + netdev_unlock(conn->dev); return; } } diff --git a/net/udp/udp_sendto_buffered.c b/net/udp/udp_sendto_buffered.c index e4cbef8cfaf..cfb28c6f0dc 100644 --- a/net/udp/udp_sendto_buffered.c +++ b/net/udp/udp_sendto_buffered.c @@ -248,6 +248,7 @@ static int sendto_next_transfer(FAR struct udp_conn_s *conn) { FAR struct udp_wrbuffer_s *wrb; FAR struct net_driver_s *dev; + int ret = OK; /* Set the UDP "connection" to the destination address of the write buffer * at the head of the queue. @@ -329,11 +330,10 @@ static int sendto_next_transfer(FAR struct udp_conn_s *conn) * callback is not already in place. */ + conn_dev_lock(&conn->sconn, dev); if (conn->sndcb == NULL) { - conn_dev_lock(&conn->sconn, dev); conn->sndcb = udp_callback_alloc(dev, conn); - conn_dev_unlock(&conn->sconn, dev); } /* Test if the callback has been allocated */ @@ -343,8 +343,8 @@ static int sendto_next_transfer(FAR struct udp_conn_s *conn) /* A buffer allocation error occurred */ nerr("ERROR: Failed to allocate callback\n"); - conn_lock(&conn->sconn); - return -ENOMEM; + ret = -ENOMEM; + goto out; } conn->dev = dev; @@ -359,9 +359,11 @@ static int sendto_next_transfer(FAR struct udp_conn_s *conn) netdev_txnotify_dev(dev); +out: + conn_dev_unlock(&conn->sconn, dev); conn_lock(&conn->sconn); - return OK; + return ret; } /**************************************************************************** diff --git a/net/udp/udp_sendto_unbuffered.c b/net/udp/udp_sendto_unbuffered.c index f80aa1e9f48..6e402a8064d 100644 --- a/net/udp/udp_sendto_unbuffered.c +++ b/net/udp/udp_sendto_unbuffered.c @@ -475,8 +475,6 @@ ssize_t psock_udp_sendto(FAR struct socket *psock, FAR const void *buf, state.st_cb->priv = (FAR void *)&state; state.st_cb->event = sendto_eventhandler; - conn_dev_unlock(&conn->sconn, state.st_dev); - /* Notify the device driver of the availability of TX data */ netdev_txnotify_dev(state.st_dev); @@ -486,6 +484,7 @@ ssize_t psock_udp_sendto(FAR struct socket *psock, FAR const void *buf, * is received. */ + conn_dev_unlock(&conn->sconn, state.st_dev); ret = net_sem_timedwait(&state.st_sem, _SO_TIMEOUT(conn->sconn.s_sndtimeo)); if (ret >= 0)
