commit 58af207f726b5250b3da3505cdb8174ef9133807 Author: Ryota Ozaki Date: Thu Jul 7 19:08:31 2016 +0900 workaround for workqueue of ipflow slowtimo diff --git a/sys/netinet/ip_flow.c b/sys/netinet/ip_flow.c index 00602af..791e83b 100644 --- a/sys/netinet/ip_flow.c +++ b/sys/netinet/ip_flow.c @@ -430,6 +430,8 @@ ipflow_reap(bool just_one) return NULL; } +static bool ipflow_work_enqueued = false; + static void ipflow_slowtimo_work(struct work *wk, void *arg) { @@ -456,6 +458,7 @@ ipflow_slowtimo_work(struct work *wk, void *arg) ipf->ipf_uses = 0; } } + ipflow_work_enqueued = false; KERNEL_UNLOCK_ONE(NULL); mutex_exit(&ipflow_lock); mutex_exit(softnet_lock); @@ -465,6 +468,15 @@ void ipflow_slowtimo(void) { + /* Avoid enqueuing another work when one is already enqueued */ + mutex_enter(&ipflow_lock); + if (ipflow_work_enqueued) { + mutex_exit(&ipflow_lock); + return; + } + ipflow_work_enqueued = true; + mutex_exit(&ipflow_lock); + workqueue_enqueue(ipflow_slowtimo_wq, &ipflow_slowtimo_wk, NULL); } diff --git a/sys/netinet6/ip6_flow.c b/sys/netinet6/ip6_flow.c index 23fddde..0a588f6 100644 --- a/sys/netinet6/ip6_flow.c +++ b/sys/netinet6/ip6_flow.c @@ -466,6 +466,8 @@ ip6flow_reap(int just_one) return ip6f; } +static bool ip6flow_work_enqueued = false; + void ip6flow_slowtimo_work(struct work *wk, void *arg) { @@ -488,6 +490,7 @@ ip6flow_slowtimo_work(struct work *wk, void *arg) ip6f->ip6f_forwarded = 0; } } + ip6flow_work_enqueued = false; KERNEL_UNLOCK_ONE(NULL); mutex_exit(&ip6flow_lock); @@ -498,6 +501,15 @@ void ip6flow_slowtimo(void) { + /* Avoid enqueuing another work when one is already enqueued */ + mutex_enter(&ip6flow_lock); + if (ip6flow_work_enqueued) { + mutex_exit(&ip6flow_lock); + return; + } + ip6flow_work_enqueued = true; + mutex_exit(&ip6flow_lock); + workqueue_enqueue(ip6flow_slowtimo_wq, &ip6flow_slowtimo_wk, NULL); }