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
This commit is contained in:
parent
c3ca3130e2
commit
1d126e9b94
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=359827
@ -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 __unused)
|
||||
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) {
|
||||
|
Loading…
Reference in New Issue
Block a user