From owner-svn-src-all@freebsd.org Wed Jan 22 05:51:25 2020 Return-Path: Delivered-To: svn-src-all@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 9C90922DA79; Wed, 22 Jan 2020 05:51:25 +0000 (UTC) (envelope-from glebius@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 482ZK93jylz4Zc7; Wed, 22 Jan 2020 05:51:25 +0000 (UTC) (envelope-from glebius@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 7A82220C41; Wed, 22 Jan 2020 05:51:25 +0000 (UTC) (envelope-from glebius@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 00M5pPRt018162; Wed, 22 Jan 2020 05:51:25 GMT (envelope-from glebius@FreeBSD.org) Received: (from glebius@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 00M5pMjC018150; Wed, 22 Jan 2020 05:51:22 GMT (envelope-from glebius@FreeBSD.org) Message-Id: <202001220551.00M5pMjC018150@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: glebius set sender to glebius@FreeBSD.org using -f From: Gleb Smirnoff Date: Wed, 22 Jan 2020 05:51:22 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r356974 - in head/sys: netinet netinet/tcp_stacks netinet6 X-SVN-Group: head X-SVN-Commit-Author: glebius X-SVN-Commit-Paths: in head/sys: netinet netinet/tcp_stacks netinet6 X-SVN-Commit-Revision: 356974 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 22 Jan 2020 05:51:25 -0000 Author: glebius Date: Wed Jan 22 05:51:22 2020 New Revision: 356974 URL: https://svnweb.freebsd.org/changeset/base/356974 Log: Make ip6_output() and ip_output() require network epoch. All callers that before may called into these functions without network epoch now must enter it. Modified: head/sys/netinet/ip_carp.c head/sys/netinet/ip_divert.c head/sys/netinet/ip_output.c head/sys/netinet/raw_ip.c head/sys/netinet/tcp_output.c head/sys/netinet/tcp_stacks/bbr.c head/sys/netinet/tcp_stacks/rack.c head/sys/netinet/tcp_syncache.c head/sys/netinet/tcp_timer.c head/sys/netinet6/ip6_mroute.c head/sys/netinet6/ip6_output.c head/sys/netinet6/raw_ip6.c Modified: head/sys/netinet/ip_carp.c ============================================================================== --- head/sys/netinet/ip_carp.c Wed Jan 22 05:47:59 2020 (r356973) +++ head/sys/netinet/ip_carp.c Wed Jan 22 05:51:22 2020 (r356974) @@ -904,6 +904,7 @@ carp_send_ad_locked(struct carp_softc *sc) { struct carp_header ch; struct timeval tv; + struct epoch_tracker et; struct ifaddr *ifa; struct carp_header *ch_ptr; struct mbuf *m; @@ -972,8 +973,10 @@ carp_send_ad_locked(struct carp_softc *sc) CARPSTATS_INC(carps_opackets); + NET_EPOCH_ENTER(et); carp_send_ad_error(sc, ip_output(m, NULL, NULL, IP_RAWOUTPUT, &sc->sc_carpdev->if_carp->cif_imo, NULL)); + NET_EPOCH_EXIT(et); } #endif /* INET */ #ifdef INET6 @@ -1031,8 +1034,10 @@ carp_send_ad_locked(struct carp_softc *sc) CARPSTATS_INC(carps_opackets6); + NET_EPOCH_ENTER(et); carp_send_ad_error(sc, ip6_output(m, NULL, NULL, 0, &sc->sc_carpdev->if_carp->cif_im6o, NULL, NULL)); + NET_EPOCH_EXIT(et); } #endif /* INET6 */ Modified: head/sys/netinet/ip_divert.c ============================================================================== --- head/sys/netinet/ip_divert.c Wed Jan 22 05:47:59 2020 (r356973) +++ head/sys/netinet/ip_divert.c Wed Jan 22 05:51:22 2020 (r356974) @@ -307,6 +307,7 @@ static int div_output(struct socket *so, struct mbuf *m, struct sockaddr_in *sin, struct mbuf *control) { + struct epoch_tracker et; struct ip *const ip = mtod(m, struct ip *); struct m_tag *mtag; struct ipfw_rule_ref *dt; @@ -440,6 +441,7 @@ div_output(struct socket *so, struct mbuf *m, struct s } INP_RUNLOCK(inp); + NET_EPOCH_ENTER(et); switch (ip->ip_v) { case IPVERSION: error = ip_output(m, options, NULL, @@ -452,6 +454,7 @@ div_output(struct socket *so, struct mbuf *m, struct s break; #endif } + NET_EPOCH_EXIT(et); if (options != NULL) m_freem(options); } else { Modified: head/sys/netinet/ip_output.c ============================================================================== --- head/sys/netinet/ip_output.c Wed Jan 22 05:47:59 2020 (r356973) +++ head/sys/netinet/ip_output.c Wed Jan 22 05:51:22 2020 (r356974) @@ -304,7 +304,6 @@ ip_output(struct mbuf *m, struct mbuf *opt, struct rou struct ip_moptions *imo, struct inpcb *inp) { struct rm_priotracker in_ifa_tracker; - struct epoch_tracker et; struct ip *ip; struct ifnet *ifp = NULL; /* keep compiler happy */ struct mbuf *m0; @@ -323,6 +322,7 @@ ip_output(struct mbuf *m, struct mbuf *opt, struct rou #endif M_ASSERTPKTHDR(m); + NET_EPOCH_ASSERT(); if (inp != NULL) { INP_LOCK_ASSERT(inp); @@ -375,7 +375,6 @@ ip_output(struct mbuf *m, struct mbuf *opt, struct rou dst->sin_addr = ip->ip_dst; } gw = dst; - NET_EPOCH_ENTER(et); again: /* * Validate route against routing table additions; @@ -837,7 +836,6 @@ sendit: IPSTAT_INC(ips_fragmented); done: - NET_EPOCH_EXIT(et); return (error); bad: m_freem(m); Modified: head/sys/netinet/raw_ip.c ============================================================================== --- head/sys/netinet/raw_ip.c Wed Jan 22 05:47:59 2020 (r356973) +++ head/sys/netinet/raw_ip.c Wed Jan 22 05:51:22 2020 (r356974) @@ -445,6 +445,7 @@ rip_input(struct mbuf **mp, int *offp, int proto) int rip_output(struct mbuf *m, struct socket *so, ...) { + struct epoch_tracker et; struct ip *ip; int error; struct inpcb *inp = sotoinpcb(so); @@ -584,8 +585,10 @@ rip_output(struct mbuf *m, struct socket *so, ...) mac_inpcb_create_mbuf(inp, m); #endif + NET_EPOCH_ENTER(et); error = ip_output(m, inp->inp_options, NULL, flags, inp->inp_moptions, inp); + NET_EPOCH_EXIT(et); INP_RUNLOCK(inp); return (error); } Modified: head/sys/netinet/tcp_output.c ============================================================================== --- head/sys/netinet/tcp_output.c Wed Jan 22 05:47:59 2020 (r356973) +++ head/sys/netinet/tcp_output.c Wed Jan 22 05:51:22 2020 (r356974) @@ -193,6 +193,7 @@ cc_after_idle(struct tcpcb *tp) int tcp_output(struct tcpcb *tp) { + struct epoch_tracker et; struct socket *so = tp->t_inpcb->inp_socket; int32_t len; uint32_t recwin, sendwin; @@ -1371,6 +1372,7 @@ send: * m->m_pkthdr.len should have been set before checksum calculation, * because in6_cksum() need it. */ + NET_EPOCH_ENTER(et); #ifdef INET6 if (isipv6) { /* @@ -1456,6 +1458,7 @@ send: mtu = tp->t_inpcb->inp_route.ro_rt->rt_mtu; } #endif /* INET */ + NET_EPOCH_EXIT(et); out: /* Modified: head/sys/netinet/tcp_stacks/bbr.c ============================================================================== --- head/sys/netinet/tcp_stacks/bbr.c Wed Jan 22 05:47:59 2020 (r356973) +++ head/sys/netinet/tcp_stacks/bbr.c Wed Jan 22 05:51:22 2020 (r356974) @@ -12091,6 +12091,7 @@ bbr_window_update_needed(struct tcpcb *tp, struct sock static int bbr_output_wtime(struct tcpcb *tp, const struct timeval *tv) { + struct epoch_tracker et; struct socket *so; int32_t len; uint32_t cts; @@ -13937,6 +13938,7 @@ send: * m->m_pkthdr.len should have been set before cksum calcuration, * because in6_cksum() need it. */ + NET_EPOCH_ENTER(et); #ifdef INET6 if (isipv6) { /* @@ -14014,6 +14016,7 @@ send: mtu = inp->inp_route.ro_rt->rt_mtu; } #endif /* INET */ + NET_EPOCH_EXIT(et); out: if (lgb) { Modified: head/sys/netinet/tcp_stacks/rack.c ============================================================================== --- head/sys/netinet/tcp_stacks/rack.c Wed Jan 22 05:47:59 2020 (r356973) +++ head/sys/netinet/tcp_stacks/rack.c Wed Jan 22 05:51:22 2020 (r356974) @@ -8091,6 +8091,7 @@ old_method: static int rack_output(struct tcpcb *tp) { + struct epoch_tracker et; struct socket *so; uint32_t recwin, sendwin; uint32_t sb_offset; @@ -9733,6 +9734,7 @@ send: * m->m_pkthdr.len should have been set before cksum calcuration, * because in6_cksum() need it. */ + NET_EPOCH_ENTER(et); #ifdef INET6 if (isipv6) { /* @@ -9810,6 +9812,7 @@ send: mtu = inp->inp_route.ro_rt->rt_mtu; } #endif /* INET */ + NET_EPOCH_EXIT(et); out: if (lgb) { Modified: head/sys/netinet/tcp_syncache.c ============================================================================== --- head/sys/netinet/tcp_syncache.c Wed Jan 22 05:47:59 2020 (r356973) +++ head/sys/netinet/tcp_syncache.c Wed Jan 22 05:51:22 2020 (r356974) @@ -467,6 +467,7 @@ syncache_timer(void *xsch) { struct syncache_head *sch = (struct syncache_head *)xsch; struct syncache *sc, *nsc; + struct epoch_tracker et; int tick = ticks; char *s; bool paused; @@ -526,7 +527,9 @@ syncache_timer(void *xsch) free(s, M_TCPLOG); } + NET_EPOCH_ENTER(et); syncache_respond(sc, NULL, TH_SYN|TH_ACK); + NET_EPOCH_EXIT(et); TCPSTAT_INC(tcps_sc_retransmitted); syncache_timeout(sc, sch, 0); } Modified: head/sys/netinet/tcp_timer.c ============================================================================== --- head/sys/netinet/tcp_timer.c Wed Jan 22 05:47:59 2020 (r356973) +++ head/sys/netinet/tcp_timer.c Wed Jan 22 05:51:22 2020 (r356974) @@ -452,9 +452,11 @@ tcp_timer_keep(void *xtp) TCPSTAT_INC(tcps_keepprobe); t_template = tcpip_maketemplate(inp); if (t_template) { + NET_EPOCH_ENTER(et); tcp_respond(tp, t_template->tt_ipgen, &t_template->tt_t, (struct mbuf *)NULL, tp->rcv_nxt, tp->snd_una - 1, 0); + NET_EPOCH_EXIT(et); free(t_template, M_TEMP); } callout_reset(&tp->t_timers->tt_keep, TP_KEEPINTVL(tp), Modified: head/sys/netinet6/ip6_mroute.c ============================================================================== --- head/sys/netinet6/ip6_mroute.c Wed Jan 22 05:47:59 2020 (r356973) +++ head/sys/netinet6/ip6_mroute.c Wed Jan 22 05:51:22 2020 (r356974) @@ -1559,13 +1559,16 @@ phyint_send(struct ip6_hdr *ip6, struct mif6 *mifp, st */ if (m->m_pkthdr.rcvif == NULL) { struct ip6_moptions im6o; + struct epoch_tracker et; im6o.im6o_multicast_ifp = ifp; /* XXX: ip6_output will override ip6->ip6_hlim */ im6o.im6o_multicast_hlim = ip6->ip6_hlim; im6o.im6o_multicast_loop = 1; + NET_EPOCH_ENTER(et); error = ip6_output(mb_copy, NULL, NULL, IPV6_FORWARDING, &im6o, NULL, NULL); + NET_EPOCH_EXIT(et); MRT6_DLOG(DEBUG_XMIT, "mif %u err %d", (uint16_t)(mifp - mif6table), error); Modified: head/sys/netinet6/ip6_output.c ============================================================================== --- head/sys/netinet6/ip6_output.c Wed Jan 22 05:47:59 2020 (r356973) +++ head/sys/netinet6/ip6_output.c Wed Jan 22 05:51:22 2020 (r356974) @@ -384,7 +384,6 @@ ip6_output(struct mbuf *m0, struct ip6_pktopts *opt, struct mbuf *m = m0; struct mbuf *mprev = NULL; int hlen, tlen, len; - struct epoch_tracker et; struct route_in6 ip6route; struct rtentry *rt = NULL; struct sockaddr_in6 *dst, src_sa, dst_sa; @@ -405,7 +404,7 @@ ip6_output(struct mbuf *m0, struct ip6_pktopts *opt, struct m_tag *fwd_tag = NULL; uint32_t id; - NET_EPOCH_ENTER(et); + NET_EPOCH_ASSERT(); if (inp != NULL) { INP_LOCK_ASSERT(inp); @@ -1189,7 +1188,6 @@ sendorfree: IP6STAT_INC(ip6s_fragmented); done: - NET_EPOCH_EXIT(et); if (ro == &ip6route) RO_RTFREE(ro); return (error); Modified: head/sys/netinet6/raw_ip6.c ============================================================================== --- head/sys/netinet6/raw_ip6.c Wed Jan 22 05:47:59 2020 (r356973) +++ head/sys/netinet6/raw_ip6.c Wed Jan 22 05:51:22 2020 (r356974) @@ -389,6 +389,7 @@ rip6_ctlinput(int cmd, struct sockaddr *sa, void *d) int rip6_output(struct mbuf *m, struct socket *so, ...) { + struct epoch_tracker et; struct mbuf *control; struct m_tag *mtag; struct sockaddr_in6 *dstsock; @@ -536,7 +537,9 @@ rip6_output(struct mbuf *m, struct socket *so, ...) } } + NET_EPOCH_ENTER(et); error = ip6_output(m, optp, NULL, 0, inp->in6p_moptions, &oifp, inp); + NET_EPOCH_EXIT(et); if (so->so_proto->pr_protocol == IPPROTO_ICMPV6) { if (oifp) icmp6_ifoutstat_inc(oifp, type, code);