summaryrefslogtreecommitdiffstats
path: root/sys/net/rtsock.c
diff options
context:
space:
mode:
authorbz <bz@FreeBSD.org>2016-06-03 13:57:10 +0000
committerbz <bz@FreeBSD.org>2016-06-03 13:57:10 +0000
commit69cdb2137c13e36cbc467dd745ab15126fc22063 (patch)
treeb9bad282d3f1a106a25f2d6b11e1232e2b57223b /sys/net/rtsock.c
parent28ea44dac8d1daa2b1d50448cbbb48c2f51045fd (diff)
downloadFreeBSD-src-69cdb2137c13e36cbc467dd745ab15126fc22063.zip
FreeBSD-src-69cdb2137c13e36cbc467dd745ab15126fc22063.tar.gz
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
Diffstat (limited to 'sys/net/rtsock.c')
-rw-r--r--sys/net/rtsock.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c
index c074603..91158b0 100644
--- a/sys/net/rtsock.c
+++ b/sys/net/rtsock.c
@@ -191,15 +191,33 @@ SYSCTL_PROC(_net_route, OID_AUTO, netisr_maxqlen, CTLTYPE_INT|CTLFLAG_RW,
"maximum routing socket dispatch queue length");
static void
-rts_init(void)
+vnet_rts_init(void)
{
int tmp;
- if (TUNABLE_INT_FETCH("net.route.netisr_maxqlen", &tmp))
- rtsock_nh.nh_qlimit = tmp;
- netisr_register(&rtsock_nh);
+ if (IS_DEFAULT_VNET(curvnet)) {
+ if (TUNABLE_INT_FETCH("net.route.netisr_maxqlen", &tmp))
+ rtsock_nh.nh_qlimit = tmp;
+ netisr_register(&rtsock_nh);
+ }
+#ifdef VIMAGE
+ else
+ netisr_register_vnet(&rtsock_nh);
+#endif
+}
+VNET_SYSINIT(vnet_rtsock, SI_SUB_PROTO_DOMAIN, SI_ORDER_THIRD,
+ vnet_rts_init, 0);
+
+#ifdef VIMAGE
+static void
+vnet_rts_uninit(void)
+{
+
+ netisr_unregister_vnet(&rtsock_nh);
}
-SYSINIT(rtsock, SI_SUB_PROTO_DOMAIN, SI_ORDER_THIRD, rts_init, 0);
+VNET_SYSUNINIT(vnet_rts_uninit, SI_SUB_PROTO_DOMAIN, SI_ORDER_THIRD,
+ vnet_rts_uninit, 0);
+#endif
static int
raw_input_rts_cb(struct mbuf *m, struct sockproto *proto, struct sockaddr *src,
OpenPOWER on IntegriCloud