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(&notify, 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)

Reply via email to