From owner-svn-src-head@freebsd.org  Sun Apr 12 16:09:22 2020
Return-Path: <owner-svn-src-head@freebsd.org>
Delivered-To: svn-src-head@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 1F4A12C16E0;
 Sun, 12 Apr 2020 16:09:22 +0000 (UTC) (envelope-from kp@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 490cBp01clz4HxQ;
 Sun, 12 Apr 2020 16:09:22 +0000 (UTC) (envelope-from kp@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 F026D4316;
 Sun, 12 Apr 2020 16:09:21 +0000 (UTC) (envelope-from kp@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 03CG9LXW074597;
 Sun, 12 Apr 2020 16:09:21 GMT (envelope-from kp@FreeBSD.org)
Received: (from kp@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id 03CG9L5A074596;
 Sun, 12 Apr 2020 16:09:21 GMT (envelope-from kp@FreeBSD.org)
Message-Id: <202004121609.03CG9L5A074596@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: kp set sender to kp@FreeBSD.org
 using -f
From: Kristof Provost <kp@FreeBSD.org>
Date: Sun, 12 Apr 2020 16:09:21 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-all@freebsd.org,
 svn-src-head@freebsd.org
Subject: svn commit: r359827 - head/sys/netinet
X-SVN-Group: head
X-SVN-Commit-Author: kp
X-SVN-Commit-Paths: head/sys/netinet
X-SVN-Commit-Revision: 359827
X-SVN-Commit-Repository: base
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-head@freebsd.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: SVN commit messages for the src tree for head/-current
 <svn-src-head.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-head>,
 <mailto:svn-src-head-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-head/>
List-Post: <mailto:svn-src-head@freebsd.org>
List-Help: <mailto:svn-src-head-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-head>,
 <mailto:svn-src-head-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Sun, 12 Apr 2020 16:09:22 -0000

Author: kp
Date: Sun Apr 12 16:09:21 2020
New Revision: 359827
URL: https://svnweb.freebsd.org/changeset/base/359827

Log:
  carp: Widen epoch coverage
  
  Fix panics related to calling code which expects to be running inside
  the NET_EPOCH from outside that epoch.
  
  This leads to panics (with INVARIANTS) such as this one:
  
      panic: Assertion in_epoch(net_epoch_preempt) failed at /usr/src/sys/netinet/if_ether.c:373
      cpuid = 7
      time = 1586095719
      KDB: stack backtrace:
      db_trace_self_wrapper() at db_trace_self_wrapper+0x2b/frame 0xfffffe0090819700
      vpanic() at vpanic+0x182/frame 0xfffffe0090819750
      panic() at panic+0x43/frame 0xfffffe00908197b0
      arprequest_internal() at arprequest_internal+0x59e/frame 0xfffffe00908198c0
      arp_announce_ifaddr() at arp_announce_ifaddr+0x20/frame 0xfffffe00908198e0
      carp_master_down_locked() at carp_master_down_locked+0x10d/frame 0xfffffe0090819910
      carp_master_down() at carp_master_down+0x79/frame 0xfffffe0090819940
      softclock_call_cc() at softclock_call_cc+0x13f/frame 0xfffffe00908199f0
      softclock() at softclock+0x7c/frame 0xfffffe0090819a20
      ithread_loop() at ithread_loop+0x279/frame 0xfffffe0090819ab0
      fork_exit() at fork_exit+0x80/frame 0xfffffe0090819af0
      fork_trampoline() at fork_trampoline+0xe/frame 0xfffffe0090819af0
      --- trap 0, rip = 0, rsp = 0, rbp = 0 ---
  
  Widen the NET_EPOCH to cover the relevant (callback / task) code.
  
  Differential Revision:	https://reviews.freebsd.org/D24302

Modified:
  head/sys/netinet/ip_carp.c

Modified: head/sys/netinet/ip_carp.c
==============================================================================
--- head/sys/netinet/ip_carp.c	Sun Apr 12 16:06:59 2020	(r359826)
+++ head/sys/netinet/ip_carp.c	Sun Apr 12 16:09:21 2020	(r359827)
@@ -817,7 +817,9 @@ static void
 carp_send_ad_all(void *ctx __unused, int pending __unused)
 {
 	struct carp_softc *sc;
+	struct epoch_tracker et;
 
+	NET_EPOCH_ENTER(et);
 	mtx_lock(&carp_mtx);
 	LIST_FOREACH(sc, &carp_list, sc_next)
 		if (sc->sc_state == MASTER) {
@@ -828,6 +830,7 @@ carp_send_ad_all(void *ctx __unused, int pending __unu
 			CARP_UNLOCK(sc);
 		}
 	mtx_unlock(&carp_mtx);
+	NET_EPOCH_EXIT(et);
 }
 
 /* Send a periodic advertisement, executed in callout context. */
@@ -835,12 +838,15 @@ static void
 carp_send_ad(void *v)
 {
 	struct carp_softc *sc = v;
+	struct epoch_tracker et;
 
+	NET_EPOCH_ENTER(et);
 	CARP_LOCK_ASSERT(sc);
 	CURVNET_SET(sc->sc_carpdev->if_vnet);
 	carp_send_ad_locked(sc);
 	CURVNET_RESTORE();
 	CARP_UNLOCK(sc);
+	NET_EPOCH_EXIT(et);
 }
 
 static void
@@ -907,12 +913,12 @@ 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;
 	int len, advskew;
 
+	NET_EPOCH_ASSERT();
 	CARP_LOCK_ASSERT(sc);
 
 	advskew = DEMOTE_ADVSKEW(sc);
@@ -976,10 +982,8 @@ 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
@@ -1037,10 +1041,8 @@ 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 */
 
@@ -1130,6 +1132,8 @@ carp_send_arp(struct carp_softc *sc)
 	struct ifaddr *ifa;
 	struct in_addr addr;
 
+	NET_EPOCH_ASSERT();
+
 	CARP_FOREACH_IFA(sc, ifa) {
 		if (ifa->ifa_addr->sa_family != AF_INET)
 			continue;
@@ -1258,7 +1262,9 @@ static void
 carp_master_down(void *v)
 {
 	struct carp_softc *sc = v;
+	struct epoch_tracker et;
 
+	NET_EPOCH_ENTER(et);
 	CARP_LOCK_ASSERT(sc);
 
 	CURVNET_SET(sc->sc_carpdev->if_vnet);
@@ -1268,12 +1274,14 @@ carp_master_down(void *v)
 	CURVNET_RESTORE();
 
 	CARP_UNLOCK(sc);
+	NET_EPOCH_EXIT(et);
 }
 
 static void
 carp_master_down_locked(struct carp_softc *sc, const char *reason)
 {
 
+	NET_EPOCH_ASSERT();
 	CARP_LOCK_ASSERT(sc);
 
 	switch (sc->sc_state) {