summaryrefslogtreecommitdiffstats
path: root/sys/net/flowtable.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/net/flowtable.c')
-rw-r--r--sys/net/flowtable.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/sys/net/flowtable.c b/sys/net/flowtable.c
index 4988670..198c4c3 100644
--- a/sys/net/flowtable.c
+++ b/sys/net/flowtable.c
@@ -195,7 +195,8 @@ static VNET_DEFINE(uma_zone_t, flow_ipv6_zone);
#define V_flow_ipv6_zone VNET(flow_ipv6_zone)
-static struct cv flowclean_cv;
+static struct cv flowclean_f_cv;
+static struct cv flowclean_c_cv;
static struct mtx flowclean_lock;
static uint32_t flowclean_cycles;
static uint32_t flowclean_freq;
@@ -951,7 +952,7 @@ flow_full(struct flowtable *ft)
if ((ft->ft_flags & FL_HASH_ALL) == 0)
ft->ft_udp_idle = ft->ft_fin_wait_idle =
ft->ft_syn_idle = ft->ft_tcp_idle = 5;
- cv_broadcast(&flowclean_cv);
+ cv_broadcast(&flowclean_c_cv);
} else if (!full && ft->ft_full) {
flowclean_freq = 20*hz;
if ((ft->ft_flags & FL_HASH_ALL) == 0)
@@ -1548,9 +1549,11 @@ static void
flowtable_cleaner(void)
{
VNET_ITERATOR_DECL(vnet_iter);
+ struct thread *td;
if (bootverbose)
log(LOG_INFO, "flowtable cleaner started\n");
+ td = curthread;
while (1) {
VNET_LIST_RLOCK();
VNET_FOREACH(vnet_iter) {
@@ -1560,14 +1563,17 @@ flowtable_cleaner(void)
}
VNET_LIST_RUNLOCK();
- flowclean_cycles++;
/*
* The 10 second interval between cleaning checks
* is arbitrary
*/
mtx_lock(&flowclean_lock);
- cv_broadcast(&flowclean_cv);
- cv_timedwait(&flowclean_cv, &flowclean_lock, flowclean_freq);
+ thread_lock(td);
+ sched_prio(td, PPAUSE);
+ thread_unlock(td);
+ flowclean_cycles++;
+ cv_broadcast(&flowclean_f_cv);
+ cv_timedwait(&flowclean_c_cv, &flowclean_lock, flowclean_freq);
mtx_unlock(&flowclean_lock);
}
}
@@ -1580,8 +1586,8 @@ flowtable_flush(void *unused __unused)
mtx_lock(&flowclean_lock);
start = flowclean_cycles;
while (start == flowclean_cycles) {
- cv_broadcast(&flowclean_cv);
- cv_wait(&flowclean_cv, &flowclean_lock);
+ cv_broadcast(&flowclean_c_cv);
+ cv_wait(&flowclean_f_cv, &flowclean_lock);
}
mtx_unlock(&flowclean_lock);
}
@@ -1613,7 +1619,8 @@ static void
flowtable_init(const void *unused __unused)
{
- cv_init(&flowclean_cv, "flowcleanwait");
+ cv_init(&flowclean_c_cv, "c_flowcleanwait");
+ cv_init(&flowclean_f_cv, "f_flowcleanwait");
mtx_init(&flowclean_lock, "flowclean lock", NULL, MTX_DEF);
EVENTHANDLER_REGISTER(ifnet_departure_event, flowtable_flush, NULL,
EVENTHANDLER_PRI_ANY);
@@ -1807,6 +1814,9 @@ DB_SHOW_COMMAND(flowtables, db_show_flowtables)
VNET_FOREACH(vnet_iter) {
CURVNET_SET(vnet_iter);
+#ifdef VIMAGE
+ db_printf("vnet %p\n", vnet_iter);
+#endif
flowtable_show_vnet();
CURVNET_RESTORE();
}
OpenPOWER on IntegriCloud