Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys Add rtcache_unref to release points of rtentry stemming ...



details:   https://anonhg.NetBSD.org/src/rev/a76806c6ddc8
branches:  trunk
changeset: 349346:a76806c6ddc8
user:      ozaki-r <ozaki-r%NetBSD.org@localhost>
date:      Thu Dec 08 05:16:33 2016 +0000

description:
Add rtcache_unref to release points of rtentry stemming from rtcache

In the MP-safe world, a rtentry stemming from a rtcache can be freed at any
points. So we need to protect rtentries somehow say by reference couting or
passive references. Regardless of the method, we need to call some release
function of a rtentry after using it.

The change adds a new function rtcache_unref to release a rtentry. At this
point, this function does nothing because for now we don't add a reference
to a rtentry when we get one from a rtcache. We will add something useful
in a further commit.

This change is a part of changes for MP-safe routing table. It is separated
to avoid one big change that makes difficult to debug by bisecting.

diffstat:

 sys/dist/pf/net/pf.c                         |  12 ++++-
 sys/external/bsd/ipf/netinet/ip_fil_netbsd.c |   7 ++-
 sys/net/if_stf.c                             |   6 ++-
 sys/net/route.h                              |   9 ++++-
 sys/netatalk/ddp_input.c                     |   6 ++-
 sys/netatalk/ddp_output.c                    |  20 +++++++---
 sys/netatalk/ddp_usrreq.c                    |   6 ++-
 sys/netinet/in.c                             |  13 ++++--
 sys/netinet/in_gif.c                         |   6 ++-
 sys/netinet/in_pcb.c                         |  31 ++++++++++++---
 sys/netinet/in_pcb.h                         |   3 +-
 sys/netinet/ip_etherip.c                     |   6 ++-
 sys/netinet/ip_flow.c                        |  35 +++++++++++------
 sys/netinet/ip_input.c                       |  22 +++++++----
 sys/netinet/ip_output.c                      |   6 ++-
 sys/netinet/ip_var.h                         |   4 +-
 sys/netinet/sctp_output.c                    |  56 ++++++++++++++++++++-------
 sys/netinet/sctp_pcb.c                       |  13 +++++-
 sys/netinet/sctp_timer.c                     |   7 ++-
 sys/netinet/tcp_input.c                      |  10 +++--
 sys/netinet/tcp_output.c                     |  28 ++++++++++++-
 sys/netinet/tcp_subr.c                       |  39 ++++++++++++++++++-
 sys/netinet6/frag6.c                         |   7 ++-
 sys/netinet6/in6_gif.c                       |   9 +++-
 sys/netinet6/in6_pcb.c                       |  37 ++++++++++++++----
 sys/netinet6/in6_pcb.h                       |   4 +-
 sys/netinet6/in6_src.c                       |  37 ++++++++++++------
 sys/netinet6/ip6_etherip.c                   |   6 ++-
 sys/netinet6/ip6_flow.c                      |  43 ++++++++++++++-------
 sys/netinet6/ip6_forward.c                   |  25 ++++++------
 sys/netinet6/ip6_input.c                     |  42 +++++++++++++++-----
 sys/netinet6/ip6_output.c                    |  15 +++++--
 sys/netinet6/ip6_var.h                       |   4 +-
 sys/netipsec/ipsec.c                         |   5 +-
 34 files changed, 414 insertions(+), 165 deletions(-)

diffs (truncated from 2087 to 300 lines):

diff -r 2ebfd9c2a013 -r a76806c6ddc8 sys/dist/pf/net/pf.c
--- a/sys/dist/pf/net/pf.c      Thu Dec 08 03:25:35 2016 +0000
+++ b/sys/dist/pf/net/pf.c      Thu Dec 08 05:16:33 2016 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: pf.c,v 1.74 2016/06/20 06:46:37 knakahara Exp $        */
+/*     $NetBSD: pf.c,v 1.75 2016/12/08 05:16:33 ozaki-r Exp $  */
 /*     $OpenBSD: pf.c,v 1.552.2.1 2007/11/27 16:37:57 henning Exp $ */
 
 /*
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pf.c,v 1.74 2016/06/20 06:46:37 knakahara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pf.c,v 1.75 2016/12/08 05:16:33 ozaki-r Exp $");
 
 #include "pflog.h"
 
@@ -2980,6 +2980,7 @@
        if ((rt = rtcache_init_noclone(rop)) != NULL) {
                mss = rt->rt_ifp->if_mtu - hlen - sizeof(struct tcphdr);
                mss = max(tcp_mssdflt, mss);
+               rtcache_unref(rt, rop);
        }
        rtcache_free(rop);
 #endif
@@ -5068,6 +5069,7 @@
        } u;
        struct route             ro;
        int                      ret = 1;
+       struct rtentry          *rt;
 
        bzero(&ro, sizeof(ro));
        switch (af) {
@@ -5084,7 +5086,10 @@
        }
        rtcache_setdst(&ro, &u.dst);
 
-       ret = rtcache_init(&ro) != NULL ? 1 : 0;
+       rt = rtcache_init(&ro);
+       ret = rt != NULL ? 1 : 0;
+       if (rt != NULL)
+               rtcache_unref(rt, &ro);
        rtcache_free(&ro);
 
        return (ret);
@@ -5300,6 +5305,7 @@
 
                if (rt->rt_flags & RTF_GATEWAY)
                        dst = rt->rt_gateway;
+               rtcache_unref(rt, ro); /* FIXME dst is NOMPSAFE */
        } else {
                if (TAILQ_EMPTY(&r->rpool.list)) {
                        DPFPRINTF(PF_DEBUG_URGENT,
diff -r 2ebfd9c2a013 -r a76806c6ddc8 sys/external/bsd/ipf/netinet/ip_fil_netbsd.c
--- a/sys/external/bsd/ipf/netinet/ip_fil_netbsd.c      Thu Dec 08 03:25:35 2016 +0000
+++ b/sys/external/bsd/ipf/netinet/ip_fil_netbsd.c      Thu Dec 08 05:16:33 2016 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: ip_fil_netbsd.c,v 1.18 2016/07/18 21:07:30 pgoyette Exp $      */
+/*     $NetBSD: ip_fil_netbsd.c,v 1.19 2016/12/08 05:16:33 ozaki-r Exp $       */
 
 /*
  * Copyright (C) 2012 by Darren Reed.
@@ -8,7 +8,7 @@
 #if !defined(lint)
 #if defined(__NetBSD__)
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip_fil_netbsd.c,v 1.18 2016/07/18 21:07:30 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip_fil_netbsd.c,v 1.19 2016/12/08 05:16:33 ozaki-r Exp $");
 #else
 static const char sccsid[] = "@(#)ip_fil.c     2.41 6/5/96 (C) 1993-2000 Darren Reed";
 static const char rcsid[] = "@(#)Id: ip_fil_netbsd.c,v 1.1.1.2 2012/07/22 13:45:17 darrenr Exp";
@@ -1330,6 +1330,7 @@
                softc->ipf_frouteok[1]++;
 
 # if __NetBSD_Version__ >= 499001100
+       rtcache_unref(rt, ro);
        rtcache_free(ro);
 # else
        if (rt) {
@@ -1467,6 +1468,7 @@
        }
 bad:
 # if __NetBSD_Version__ >= 499001100
+       rtcache_unref(rt, ro);
        rtcache_free(ro);
 # else
        if (ro->ro_rt != NULL) {
@@ -1501,6 +1503,7 @@
                rc = 0;
        else
                rc = (fin->fin_ifp == rt->rt_ifp);
+       rtcache_unref(rt, &iproute);
        rtcache_free(&iproute);
 #else
        dst = (struct sockaddr_in *)&iproute.ro_dst;
diff -r 2ebfd9c2a013 -r a76806c6ddc8 sys/net/if_stf.c
--- a/sys/net/if_stf.c  Thu Dec 08 03:25:35 2016 +0000
+++ b/sys/net/if_stf.c  Thu Dec 08 05:16:33 2016 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_stf.c,v 1.99 2016/08/18 11:38:58 knakahara Exp $    */
+/*     $NetBSD: if_stf.c,v 1.100 2016/12/08 05:16:33 ozaki-r Exp $     */
 /*     $KAME: if_stf.c,v 1.62 2001/06/07 22:32:16 itojun Exp $ */
 
 /*
@@ -75,7 +75,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_stf.c,v 1.99 2016/08/18 11:38:58 knakahara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_stf.c,v 1.100 2016/12/08 05:16:33 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -446,11 +446,13 @@
 
        /* If the route constitutes infinite encapsulation, punt. */
        if (rt->rt_ifp == ifp) {
+               rtcache_unref(rt, &sc->sc_ro);
                rtcache_free(&sc->sc_ro);
                m_freem(m);
                ifp->if_oerrors++;
                return ENETUNREACH;
        }
+       rtcache_unref(rt, &sc->sc_ro);
 
        ifp->if_opackets++;
        ifp->if_obytes += m->m_pkthdr.len - sizeof(struct ip);
diff -r 2ebfd9c2a013 -r a76806c6ddc8 sys/net/route.h
--- a/sys/net/route.h   Thu Dec 08 03:25:35 2016 +0000
+++ b/sys/net/route.h   Thu Dec 08 05:16:33 2016 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: route.h,v 1.107 2016/11/15 01:50:06 ozaki-r Exp $      */
+/*     $NetBSD: route.h,v 1.108 2016/12/08 05:16:33 ozaki-r Exp $      */
 
 /*
  * Copyright (c) 1980, 1986, 1993
@@ -480,6 +480,13 @@
 
 }
 
+static inline void
+rtcache_unref(struct rtentry *rt, struct route *ro)
+{
+
+       /* Will do something useful in the future. */
+}
+
 /* rtsock */
 void   rt_ieee80211msg(struct ifnet *, int, void *, size_t);
 void   rt_ifannouncemsg(struct ifnet *, int);
diff -r 2ebfd9c2a013 -r a76806c6ddc8 sys/netatalk/ddp_input.c
--- a/sys/netatalk/ddp_input.c  Thu Dec 08 03:25:35 2016 +0000
+++ b/sys/netatalk/ddp_input.c  Thu Dec 08 05:16:33 2016 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: ddp_input.c,v 1.28 2016/10/03 11:06:06 ozaki-r Exp $    */
+/*     $NetBSD: ddp_input.c,v 1.29 2016/12/08 05:16:33 ozaki-r Exp $    */
 
 /*
  * Copyright (c) 1990,1994 Regents of The University of Michigan.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ddp_input.c,v 1.28 2016/10/03 11:06:06 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ddp_input.c,v 1.29 2016/12/08 05:16:33 ozaki-r Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -279,9 +279,11 @@
                }
 #endif
                if (ddp_firewall && (rt == NULL || rt->rt_ifp != ifp)) {
+                       rtcache_unref(rt, &forwro);
                        m_freem(m);
                        return;
                }
+               rtcache_unref(rt, &forwro);
                ddpe.deh_hops++;
                ddpe.deh_bytes = htonl(ddpe.deh_bytes);
                memcpy((void *) deh, (void *) & ddpe, sizeof(u_short));/*XXX*/
diff -r 2ebfd9c2a013 -r a76806c6ddc8 sys/netatalk/ddp_output.c
--- a/sys/netatalk/ddp_output.c Thu Dec 08 03:25:35 2016 +0000
+++ b/sys/netatalk/ddp_output.c Thu Dec 08 05:16:33 2016 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: ddp_output.c,v 1.19 2016/06/20 06:46:38 knakahara Exp $         */
+/*     $NetBSD: ddp_output.c,v 1.20 2016/12/08 05:16:33 ozaki-r Exp $   */
 
 /*
  * Copyright (c) 1990,1991 Regents of The University of Michigan.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ddp_output.c,v 1.19 2016/06/20 06:46:38 knakahara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ddp_output.c,v 1.20 2016/12/08 05:16:33 ozaki-r Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -122,6 +122,7 @@
        struct ifnet   *ifp = NULL;
        uint16_t        net;
        uint8_t         loopback = 0;
+       int             error;
 
        if ((rt = rtcache_validate(ro)) != NULL && (ifp = rt->rt_ifp) != NULL) {
                const struct sockaddr_at *dst = satocsat(rtcache_getdst(ro));
@@ -153,7 +154,8 @@
                printf("%s: no address found\n", __func__);
 #endif
                m_freem(m);
-               return EINVAL;
+               error = EINVAL;
+               goto out;
        }
        /*
          * There are several places in the kernel where data is added to
@@ -163,8 +165,10 @@
          */
        if (!(aa->aa_flags & AFA_PHASE2)) {
                M_PREPEND(m, SZ_ELAPHDR, M_DONTWAIT);
-               if (m == NULL)
-                       return ENOBUFS;
+               if (m == NULL) {
+                       error = ENOBUFS;
+                       goto out;
+               }
 
                elh = mtod(m, struct elaphdr *);
                elh->el_snode = satosat(&aa->aa_addr)->sat_addr.s_node;
@@ -203,5 +207,9 @@
 #endif
                looutput(lo0ifp, copym, rtcache_getdst(ro), NULL);
        }
-       return if_output_lock(ifp, ifp, m, (struct sockaddr *)&gate, NULL);
+
+       error = if_output_lock(ifp, ifp, m, (struct sockaddr *)&gate, NULL);
+out:
+       rtcache_unref(rt, ro);
+       return error;
 }
diff -r 2ebfd9c2a013 -r a76806c6ddc8 sys/netatalk/ddp_usrreq.c
--- a/sys/netatalk/ddp_usrreq.c Thu Dec 08 03:25:35 2016 +0000
+++ b/sys/netatalk/ddp_usrreq.c Thu Dec 08 05:16:33 2016 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: ddp_usrreq.c,v 1.69 2016/10/03 11:06:06 ozaki-r Exp $   */
+/*     $NetBSD: ddp_usrreq.c,v 1.70 2016/12/08 05:16:33 ozaki-r Exp $   */
 
 /*
  * Copyright (c) 1990,1991 Regents of The University of Michigan.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ddp_usrreq.c,v 1.69 2016/10/03 11:06:06 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ddp_usrreq.c,v 1.70 2016/12/08 05:16:33 ozaki-r Exp $");
 
 #include "opt_mbuftrace.h"
 
@@ -226,6 +226,7 @@
                if (aa == NULL || (cdst->sat_addr.s_net !=
                    (hintnet ? hintnet : sat->sat_addr.s_net) ||
                    cdst->sat_addr.s_node != sat->sat_addr.s_node)) {
+                       rtcache_unref(rt, ro);
                        rtcache_free(ro);
                        rt = NULL;
                }
@@ -254,6 +255,7 @@
                }
        } else
                aa = NULL;
+       rtcache_unref(rt, ro);
        if (aa == NULL)
                return ENETUNREACH;
        ddp->ddp_fsat = *sat;
diff -r 2ebfd9c2a013 -r a76806c6ddc8 sys/netinet/in.c
--- a/sys/netinet/in.c  Thu Dec 08 03:25:35 2016 +0000
+++ b/sys/netinet/in.c  Thu Dec 08 05:16:33 2016 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: in.c,v 1.189 2016/12/06 07:01:47 knakahara Exp $       */
+/*     $NetBSD: in.c,v 1.190 2016/12/08 05:16:33 ozaki-r Exp $ */
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -91,7 +91,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in.c,v 1.189 2016/12/06 07:01:47 knakahara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in.c,v 1.190 2016/12/08 05:16:33 ozaki-r Exp $");
 
 #include "arp.h"
 
@@ -1790,7 +1790,7 @@
                }
                if (ia == NULL) {
                        *errorp = EADDRNOTAVAIL;
-                       return NULL;
+                       goto out;
                }



Home | Main Index | Thread Index | Old Index