carp(4), as a pseudo-interface, is always executed in the 'softnet' thread. Using splnet()/splx() might have been relevant when link-state handlers where directly executed from hardware interrupt handlers. But nowadays everything is run under the NET_LOCK() in a thread context, so let's get rid of these superfluous splnet()/splx() dances.
ok? Index: netinet/ip_carp.c =================================================================== RCS file: /cvs/src/sys/netinet/ip_carp.c,v retrieving revision 1.302 diff -u -p -r1.302 ip_carp.c --- netinet/ip_carp.c 20 Feb 2017 06:29:42 -0000 1.302 +++ netinet/ip_carp.c 7 Mar 2017 10:05:08 -0000 @@ -898,7 +898,6 @@ carpdetach(struct carp_softc *sc) { struct ifnet *ifp0; struct carp_if *cif; - int s; carp_del_all_timeouts(sc); @@ -926,7 +925,6 @@ carpdetach(struct carp_softc *sc) /* Restore previous input handler. */ if_ih_remove(ifp0, carp_input, cif); - s = splnet(); if (sc->lh_cookie != NULL) hook_disestablish(ifp0->if_linkstatehooks, sc->lh_cookie); @@ -938,7 +936,6 @@ carpdetach(struct carp_softc *sc) free(cif, M_IFADDR, sizeof(*cif)); } sc->sc_carpdev = NULL; - splx(s); } /* Detach an interface from the carp. */ @@ -1680,7 +1677,6 @@ carp_set_ifp(struct carp_softc *sc, stru struct carp_if *cif, *ncif = NULL; struct carp_softc *vr, *last = NULL, *after = NULL; int myself = 0, error = 0; - int s; KASSERT(ifp0 != sc->sc_carpdev); KERNEL_ASSERT_LOCKED(); /* touching vhif_vrs */ @@ -1754,9 +1750,7 @@ carp_set_ifp(struct carp_softc *sc, stru /* Change input handler of the physical interface. */ if_ih_insert(ifp0, carp_input, cif); - s = splnet(); carp_carpdev_state(ifp0); - splx(s); return (0); }