Author: glebius
Date: Tue Oct 29 11:21:31 2013
New Revision: 257325
URL: http://svnweb.freebsd.org/changeset/base/257325

Log:
  Uninline inm_lookup_locked(). Now in_var.h doesn't dereference
  fields of struct ifnet.
  
  Sponsored by: Netflix
  Sponsored by: Nginx, Inc.

Modified:
  head/sys/netinet/in_mcast.c
  head/sys/netinet/in_var.h

Modified: head/sys/netinet/in_mcast.c
==============================================================================
--- head/sys/netinet/in_mcast.c Tue Oct 29 11:17:49 2013        (r257324)
+++ head/sys/netinet/in_mcast.c Tue Oct 29 11:21:31 2013        (r257325)
@@ -224,6 +224,49 @@ imf_init(struct in_mfilter *imf, const i
 }
 
 /*
+ * Function for looking up an in_multi record for an IPv4 multicast address
+ * on a given interface. ifp must be valid. If no record found, return NULL.
+ * The IN_MULTI_LOCK and IF_ADDR_LOCK on ifp must be held.
+ */
+struct in_multi *
+inm_lookup_locked(struct ifnet *ifp, const struct in_addr ina)
+{
+       struct ifmultiaddr *ifma;
+       struct in_multi *inm;
+
+       IN_MULTI_LOCK_ASSERT();
+       IF_ADDR_LOCK_ASSERT(ifp);
+
+       inm = NULL;
+       TAILQ_FOREACH(ifma, &((ifp)->if_multiaddrs), ifma_link) {
+               if (ifma->ifma_addr->sa_family == AF_INET) {
+                       inm = (struct in_multi *)ifma->ifma_protospec;
+                       if (inm->inm_addr.s_addr == ina.s_addr)
+                               break;
+                       inm = NULL;
+               }
+       }
+       return (inm);
+}
+
+/*
+ * Wrapper for inm_lookup_locked().
+ * The IF_ADDR_LOCK will be taken on ifp and released on return.
+ */
+struct in_multi *
+inm_lookup(struct ifnet *ifp, const struct in_addr ina)
+{
+       struct in_multi *inm;
+
+       IN_MULTI_LOCK_ASSERT();
+       IF_ADDR_RLOCK(ifp);
+       inm = inm_lookup_locked(ifp, ina);
+       IF_ADDR_RUNLOCK(ifp);
+
+       return (inm);
+}
+
+/*
  * Resize the ip_moptions vector to the next power-of-two minus 1.
  * May be called with locks held; do not sleep.
  */

Modified: head/sys/netinet/in_var.h
==============================================================================
--- head/sys/netinet/in_var.h   Tue Oct 29 11:17:49 2013        (r257324)
+++ head/sys/netinet/in_var.h   Tue Oct 29 11:21:31 2013        (r257325)
@@ -363,49 +363,6 @@ extern struct mtx in_multi_mtx;
 #define        IN_MULTI_LOCK_ASSERT()  mtx_assert(&in_multi_mtx, MA_OWNED)
 #define        IN_MULTI_UNLOCK_ASSERT() mtx_assert(&in_multi_mtx, MA_NOTOWNED)
 
-/*
- * Function for looking up an in_multi record for an IPv4 multicast address
- * on a given interface. ifp must be valid. If no record found, return NULL.
- * The IN_MULTI_LOCK and IF_ADDR_LOCK on ifp must be held.
- */
-static __inline struct in_multi *
-inm_lookup_locked(struct ifnet *ifp, const struct in_addr ina)
-{
-       struct ifmultiaddr *ifma;
-       struct in_multi *inm;
-
-       IN_MULTI_LOCK_ASSERT();
-       IF_ADDR_LOCK_ASSERT(ifp);
-
-       inm = NULL;
-       TAILQ_FOREACH(ifma, &((ifp)->if_multiaddrs), ifma_link) {
-               if (ifma->ifma_addr->sa_family == AF_INET) {
-                       inm = (struct in_multi *)ifma->ifma_protospec;
-                       if (inm->inm_addr.s_addr == ina.s_addr)
-                               break;
-                       inm = NULL;
-               }
-       }
-       return (inm);
-}
-
-/*
- * Wrapper for inm_lookup_locked().
- * The IF_ADDR_LOCK will be taken on ifp and released on return.
- */
-static __inline struct in_multi *
-inm_lookup(struct ifnet *ifp, const struct in_addr ina)
-{
-       struct in_multi *inm;
-
-       IN_MULTI_LOCK_ASSERT();
-       IF_ADDR_RLOCK(ifp);
-       inm = inm_lookup_locked(ifp, ina);
-       IF_ADDR_RUNLOCK(ifp);
-
-       return (inm);
-}
-
 /* Acquire an in_multi record. */
 static __inline void
 inm_acquire_locked(struct in_multi *inm)
@@ -428,6 +385,8 @@ struct      route;
 struct ip_moptions;
 struct radix_node_head;
 
+struct in_multi *inm_lookup_locked(struct ifnet *, const struct in_addr);
+struct in_multi *inm_lookup(struct ifnet *, const struct in_addr);
 int    imo_multi_filter(const struct ip_moptions *, const struct ifnet *,
            const struct sockaddr *, const struct sockaddr *);
 void   inm_commit(struct in_multi *);
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to