aboutsummaryrefslogtreecommitdiff
path: root/sys/net/if_ethersubr.c
diff options
context:
space:
mode:
authorBjoern A. Zeeb <bz@FreeBSD.org>2016-06-03 13:57:10 +0000
committerBjoern A. Zeeb <bz@FreeBSD.org>2016-06-03 13:57:10 +0000
commit484149def80975bda4e583a1d77c4c6ee2baf074 (patch)
treeb9bad282d3f1a106a25f2d6b11e1232e2b57223b /sys/net/if_ethersubr.c
parent3e0522bc8f9a1b4011d7223100f0b85e7c97bb41 (diff)
downloadsrc-484149def80975bda4e583a1d77c4c6ee2baf074.tar.gz
src-484149def80975bda4e583a1d77c4c6ee2baf074.zip
Introduce a per-VNET flag to enable/disable netisr prcessing on that VNET.
Add accessor functions to toggle the state per VNET. The base system (vnet0) will always enable itself with the normal registration. We will share the registered protocol handlers in all VNETs minimising duplication and management. Upon disabling netisr processing for a VNET drain the netisr queue from packets for that VNET. Update netisr consumers to (de)register on a per-VNET start/teardown using VNET_SYS(UN)INIT functionality. The change should be transparent for non-VIMAGE kernels. Reviewed by: gnn (, hiren) Obtained from: projects/vnet MFC after: 2 weeks Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D6691
Notes
Notes: svn path=/head/; revision=301270
Diffstat (limited to 'sys/net/if_ethersubr.c')
-rw-r--r--sys/net/if_ethersubr.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/sys/net/if_ethersubr.c b/sys/net/if_ethersubr.c
index 9346aecb9f82..2542ab68afd4 100644
--- a/sys/net/if_ethersubr.c
+++ b/sys/net/if_ethersubr.c
@@ -702,12 +702,16 @@ vnet_ether_init(__unused void *arg)
if ((i = pfil_head_register(&V_link_pfil_hook)) != 0)
printf("%s: WARNING: unable to register pfil link hook, "
"error %d\n", __func__, i);
+#ifdef VIMAGE
+ netisr_register_vnet(&ether_nh);
+#endif
}
VNET_SYSINIT(vnet_ether_init, SI_SUB_PROTO_IF, SI_ORDER_ANY,
vnet_ether_init, NULL);
+#ifdef VIMAGE
static void
-vnet_ether_destroy(__unused void *arg)
+vnet_ether_pfil_destroy(__unused void *arg)
{
int i;
@@ -715,8 +719,18 @@ vnet_ether_destroy(__unused void *arg)
printf("%s: WARNING: unable to unregister pfil link hook, "
"error %d\n", __func__, i);
}
+VNET_SYSUNINIT(vnet_ether_pfil_uninit, SI_SUB_PROTO_PFIL, SI_ORDER_ANY,
+ vnet_ether_pfil_destroy, NULL);
+
+static void
+vnet_ether_destroy(__unused void *arg)
+{
+
+ netisr_unregister_vnet(&ether_nh);
+}
VNET_SYSUNINIT(vnet_ether_uninit, SI_SUB_PROTO_IF, SI_ORDER_ANY,
vnet_ether_destroy, NULL);
+#endif
@@ -740,7 +754,9 @@ ether_input(struct ifnet *ifp, struct mbuf *m)
* so assert it is correct here.
*/
KASSERT(m->m_pkthdr.rcvif == ifp, ("%s: ifnet mismatch", __func__));
+ CURVNET_SET_QUIET(ifp->if_vnet);
netisr_dispatch(NETISR_ETHER, m);
+ CURVNET_RESTORE();
m = mn;
}
}