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 eb5c8f4e9c5e02622b8db2305d70701ce005c53c Author: zhanghongyu <[email protected]> AuthorDate: Fri Nov 7 17:01:04 2025 +0800 net/netlink: replace net_lock with netlink_lock remove the use of net_lock in the netlink module and decouple it from other network modules. Signed-off-by: zhanghongyu <[email protected]> --- net/netlink/netlink.h | 20 ++++++++++++++++++ net/netlink/netlink_conn.c | 50 +++++++++++++++++++++++++++++++++++++------- net/netlink/netlink_route.c | 32 +++++++++------------------- net/netlink/netlink_sockif.c | 12 +++++------ 4 files changed, 78 insertions(+), 36 deletions(-) diff --git a/net/netlink/netlink.h b/net/netlink/netlink.h index cd7c5a68f30..03286275ab6 100644 --- a/net/netlink/netlink.h +++ b/net/netlink/netlink.h @@ -631,6 +631,26 @@ void netlink_conntrack_notify(uint8_t type, uint8_t domain, #endif /* CONFIG_NETLINK_NETFILTER */ +/**************************************************************************** + * Name: netlink_lock + * + * Description: + * Take the global netlink lock + * + ****************************************************************************/ + +void netlink_lock(void); + +/**************************************************************************** + * Name: netlink_unlock + * + * Description: + * Release the global netlink lock + * + ****************************************************************************/ + +void netlink_unlock(void); + #undef EXTERN #ifdef __cplusplus } diff --git a/net/netlink/netlink_conn.c b/net/netlink/netlink_conn.c index 895490b6913..9295297ee1d 100644 --- a/net/netlink/netlink_conn.c +++ b/net/netlink/netlink_conn.c @@ -70,6 +70,10 @@ NET_BUFPOOL_DECLARE(g_netlink_connections, sizeof(struct netlink_conn_s), static dq_queue_t g_active_netlink_connections; +/* Global protection lock for netlink */ + +static rmutex_t g_netlink_lock = NXRMUTEX_INITIALIZER; + /**************************************************************************** * Private Functions ****************************************************************************/ @@ -256,13 +260,13 @@ void netlink_add_response(NETLINK_HANDLE handle, /* Add the response to the end of the FIFO list */ - net_lock(); + netlink_lock(); sq_addlast(&resp->flink, &conn->resplist); /* Notify any waiters that a response is available */ netlink_notifier_signal(conn); - net_unlock(); + netlink_unlock(); } /**************************************************************************** @@ -332,7 +336,7 @@ void netlink_add_broadcast(int group, FAR struct netlink_response_s *data) DEBUGASSERT(data != NULL); - net_lock(); + netlink_lock(); while ((conn = netlink_nextconn(conn)) != NULL) { @@ -370,7 +374,7 @@ void netlink_add_broadcast(int group, FAR struct netlink_response_s *data) netlink_notifier_signal(conn); } - net_unlock(); + netlink_unlock(); /* Drop the package if nobody is interested in */ @@ -408,9 +412,9 @@ netlink_tryget_response(FAR struct netlink_conn_s *conn) * NULL). */ - net_lock(); + netlink_lock(); resp = (FAR struct netlink_response_s *)sq_remfirst(&conn->resplist); - net_unlock(); + netlink_unlock(); return resp; } @@ -450,7 +454,7 @@ int netlink_get_response(FAR struct netlink_conn_s *conn, * priority waiter will get the response. */ - net_lock(); + netlink_lock(); while ((*response = netlink_tryget_response(conn)) == NULL) { sem_t waitsem; @@ -471,10 +475,14 @@ int netlink_get_response(FAR struct netlink_conn_s *conn, } else { + unsigned int count; + /* Wait for a response to be queued */ tls_cleanup_push(tls_get_info(), netlink_notifier_teardown, conn); + nxrmutex_breaklock(&g_netlink_lock, &count); ret = net_sem_wait(&waitsem); + nxrmutex_restorelock(&g_netlink_lock, count); tls_cleanup_pop(tls_get_info(), 0); } @@ -491,7 +499,7 @@ int netlink_get_response(FAR struct netlink_conn_s *conn, } } - net_unlock(); + netlink_unlock(); return ret; } @@ -517,4 +525,30 @@ bool netlink_check_response(FAR struct netlink_conn_s *conn) return (sq_peek(&conn->resplist) != NULL); } +/**************************************************************************** + * Name: netlink_lock + * + * Description: + * Take the global netlink lock + * + ****************************************************************************/ + +void netlink_lock(void) +{ + nxrmutex_lock(&g_netlink_lock); +} + +/**************************************************************************** + * Name: netlink_unlock + * + * Description: + * Release the global netlink lock + * + ****************************************************************************/ + +void netlink_unlock(void) +{ + nxrmutex_unlock(&g_netlink_lock); +} + #endif /* CONFIG_NET_NETLINK */ diff --git a/net/netlink/netlink_route.c b/net/netlink/netlink_route.c index 697df182407..b8f3293a849 100644 --- a/net/netlink/netlink_route.c +++ b/net/netlink/netlink_route.c @@ -505,9 +505,7 @@ static int netlink_get_devlist(NETLINK_HANDLE handle, info.handle = handle; info.req = req; - net_lock(); ret = netdev_foreach(netlink_device_callback, &info); - net_unlock(); if (ret < 0) { return ret; @@ -538,10 +536,8 @@ static size_t netlink_fill_arptable( * the ARP table into the allocated memory. */ - net_lock(); ncopied = arp_snapshot((FAR struct arpreq *)(*entry)->payload.data, CONFIG_NET_ARPTAB_SIZE); - net_unlock(); /* Now we have the real number of valid entries in the ARP table and * we can trim the allocation. @@ -591,11 +587,9 @@ static size_t netlink_fill_nbtable( * copy the Neighbor table into the allocated memory. */ - net_lock(); ncopied = neighbor_snapshot( (FAR struct neighbor_entry_s *)(*entry)->payload.data, CONFIG_NET_IPv6_NCONF_ENTRIES); - net_unlock(); /* Now we have the real number of valid entries in the Neighbor table * and we can trim the allocation. @@ -1016,21 +1010,20 @@ static int netlink_new_ipv4addr(NETLINK_HANDLE handle, return -EINVAL; } - net_lock(); dev = netdev_findbyindex(ifm->ifa_index); if (dev == NULL) { - net_unlock(); return -ENODEV; } + netdev_lock(dev); dev->d_ipaddr = nla_get_in_addr(tb[IFA_LOCAL]); dev->d_netmask = make_mask(ifm->ifa_prefixlen); netlink_device_notify_ipaddr(dev, RTM_NEWADDR, AF_INET, &dev->d_ipaddr, ifm->ifa_prefixlen); - net_unlock(); + netdev_unlock(dev); return OK; } @@ -1066,15 +1059,14 @@ static int netlink_new_ipv6addr(NETLINK_HANDLE handle, return -EINVAL; } - net_lock(); dev = netdev_findbyindex(ifm->ifa_index); if (dev == NULL) { - net_unlock(); return -ENODEV; } + netdev_lock(dev); ret = netdev_ipv6_add(dev, nla_data(tb[IFA_LOCAL]), ifm->ifa_prefixlen); if (ret == OK) { @@ -1082,7 +1074,7 @@ static int netlink_new_ipv6addr(NETLINK_HANDLE handle, nla_data(tb[IFA_LOCAL]), ifm->ifa_prefixlen); } - net_unlock(); + netdev_unlock(dev); return ret; } @@ -1113,18 +1105,17 @@ static int netlink_del_ipv4addr(NETLINK_HANDLE handle, return ret; } - net_lock(); dev = netdev_findbyindex(ifm->ifa_index); if (dev == NULL) { - net_unlock(); return -ENODEV; } + netdev_lock(dev); if (tb[IFA_LOCAL] && dev->d_ipaddr != nla_get_in_addr(tb[IFA_LOCAL])) { - net_unlock(); + netdev_unlock(dev); return -EADDRNOTAVAIL; } @@ -1132,7 +1123,7 @@ static int netlink_del_ipv4addr(NETLINK_HANDLE handle, net_ipv4_mask2pref(dev->d_netmask)); dev->d_ipaddr = 0; - net_unlock(); + netdev_unlock(dev); return OK; } @@ -1168,18 +1159,17 @@ static int netlink_del_ipv6addr(NETLINK_HANDLE handle, return -EINVAL; } - net_lock(); dev = netdev_findbyindex(ifm->ifa_index); if (dev == NULL) { - net_unlock(); return -ENODEV; } + netdev_lock(dev); if (!NETDEV_IS_MY_V6ADDR(dev, nla_data(tb[IFA_LOCAL]))) { - net_unlock(); + netdev_unlock(dev); return -EADDRNOTAVAIL; } @@ -1190,7 +1180,7 @@ static int netlink_del_ipv6addr(NETLINK_HANDLE handle, nla_data(tb[IFA_LOCAL]), ifm->ifa_prefixlen); } - net_unlock(); + netdev_unlock(dev); return ret; } @@ -1266,9 +1256,7 @@ static int netlink_get_addr(NETLINK_HANDLE handle, info.handle = handle; info.req = req; - net_lock(); ret = netdev_foreach(netlink_addr_callback, &info); - net_unlock(); if (ret < 0) { return ret; diff --git a/net/netlink/netlink_sockif.c b/net/netlink/netlink_sockif.c index fc616281594..1366914a021 100644 --- a/net/netlink/netlink_sockif.c +++ b/net/netlink/netlink_sockif.c @@ -428,7 +428,7 @@ static void netlink_response_available(FAR void *arg) * condition? */ - net_lock(); + netlink_lock(); if (conn->fds != NULL) { @@ -445,7 +445,7 @@ static void netlink_response_available(FAR void *arg) conn->fds = NULL; - net_unlock(); + netlink_unlock(); } /**************************************************************************** @@ -491,7 +491,7 @@ static int netlink_poll(FAR struct socket *psock, FAR struct pollfd *fds, * immediately (maybe). */ - net_lock(); + netlink_lock(); if (netlink_check_response(conn)) { revents |= POLLIN; @@ -504,7 +504,7 @@ static int netlink_poll(FAR struct socket *psock, FAR struct pollfd *fds, poll_notify(&fds, 1, revents); if (fds->revents != 0) { - net_unlock(); + netlink_unlock(); return OK; } @@ -521,7 +521,7 @@ static int netlink_poll(FAR struct socket *psock, FAR struct pollfd *fds, if (conn->fds != NULL) { nerr("ERROR: Multiple polls() on socket not supported.\n"); - net_unlock(); + netlink_unlock(); return -EBUSY; } @@ -538,7 +538,7 @@ static int netlink_poll(FAR struct socket *psock, FAR struct pollfd *fds, } } - net_unlock(); + netlink_unlock(); } else {
