Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 15 Oct 2019 12:08:09 +0000 (UTC)
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r353550 - head/sys/net
Message-ID:  <201910151208.x9FC89b8023090@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: hselasky
Date: Tue Oct 15 12:08:09 2019
New Revision: 353550
URL: https://svnweb.freebsd.org/changeset/base/353550

Log:
  The two functions ifnet_byindex() and ifnet_byindex_locked() are exactly the
  same after the network stack was epochified. Merge the two into one function
  and cleanup all uses of ifnet_byindex_locked().
  
  While at it:
  - Add branch prediction macros.
  - Make sure the ifnet pointer is only deferred once,
    also when code optimisation is disabled.
  
  Sponsored by:	Mellanox Technologies

Modified:
  head/sys/net/if.c
  head/sys/net/if_var.h
  head/sys/net/route.c

Modified: head/sys/net/if.c
==============================================================================
--- head/sys/net/if.c	Tue Oct 15 11:20:16 2019	(r353549)
+++ head/sys/net/if.c	Tue Oct 15 12:08:09 2019	(r353550)
@@ -329,23 +329,15 @@ MALLOC_DEFINE(M_IFADDR, "ifaddr", "interface address")
 MALLOC_DEFINE(M_IFMADDR, "ether_multi", "link-level multicast address");
 
 struct ifnet *
-ifnet_byindex_locked(u_short idx)
-{
-
-	if (idx > V_if_index)
-		return (NULL);
-	if (V_ifindex_table[idx] == IFNET_HOLD)
-		return (NULL);
-	return (V_ifindex_table[idx]);
-}
-
-struct ifnet *
 ifnet_byindex(u_short idx)
 {
 	struct ifnet *ifp;
 
-	ifp = ifnet_byindex_locked(idx);
-	return (ifp);
+	if (__predict_false(idx > V_if_index))
+		return (NULL);
+
+	ifp = *(struct ifnet * const volatile *)(V_ifindex_table + idx);
+	return (__predict_false(ifp == IFNET_HOLD) ? NULL : ifp);
 }
 
 struct ifnet *
@@ -355,7 +347,7 @@ ifnet_byindex_ref(u_short idx)
 
 	NET_EPOCH_ASSERT();
 
-	ifp = ifnet_byindex_locked(idx);
+	ifp = ifnet_byindex(idx);
 	if (ifp == NULL || (ifp->if_flags & IFF_DYING))
 		return (NULL);
 	if_ref(ifp);
@@ -427,7 +419,7 @@ ifaddr_byindex(u_short idx)
 
 	NET_EPOCH_ASSERT();
 
-	ifp = ifnet_byindex_locked(idx);
+	ifp = ifnet_byindex(idx);
 	if (ifp != NULL && (ifa = ifp->if_addr) != NULL)
 		ifa_ref(ifa);
 	return (ifa);
@@ -653,7 +645,7 @@ if_free(struct ifnet *ifp)
 
 	CURVNET_SET_QUIET(ifp->if_vnet);
 	IFNET_WLOCK();
-	KASSERT(ifp == ifnet_byindex_locked(ifp->if_index),
+	KASSERT(ifp == ifnet_byindex(ifp->if_index),
 	    ("%s: freeing unallocated ifnet", ifp->if_xname));
 
 	ifindex_free_locked(ifp->if_index);

Modified: head/sys/net/if_var.h
==============================================================================
--- head/sys/net/if_var.h	Tue Oct 15 11:20:16 2019	(r353549)
+++ head/sys/net/if_var.h	Tue Oct 15 12:08:09 2019	(r353550)
@@ -629,7 +629,6 @@ extern	struct sx ifnet_sxlock;
  * to call ifnet_byindex() instead of ifnet_byindex_ref().
  */
 struct ifnet	*ifnet_byindex(u_short idx);
-struct ifnet	*ifnet_byindex_locked(u_short idx);
 struct ifnet	*ifnet_byindex_ref(u_short idx);
 
 /*

Modified: head/sys/net/route.c
==============================================================================
--- head/sys/net/route.c	Tue Oct 15 11:20:16 2019	(r353549)
+++ head/sys/net/route.c	Tue Oct 15 12:08:09 2019	(r353550)
@@ -1293,7 +1293,7 @@ rt_getifa_fib(struct rt_addrinfo *info, u_int fibnum)
 	    ifpaddr->sa_family == AF_LINK) {
 	    const struct sockaddr_dl *sdl = (const struct sockaddr_dl *)ifpaddr;
 	    if (sdl->sdl_index != 0)
-		    info->rti_ifp = ifnet_byindex_locked(sdl->sdl_index);
+		    info->rti_ifp = ifnet_byindex(sdl->sdl_index);
 	}
 	/*
 	 * If we have source address specified, try to find it



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201910151208.x9FC89b8023090>