Module Name: src Committed By: ozaki-r Date: Tue Jul 26 05:53:30 UTC 2016
Modified Files: src/sys/netinet: ip_flow.c src/sys/netinet6: ip6_flow.c Log Message: Simplify by using atomic_swap instead of mutex Suggested by kefren@ To generate a diff of this commit: cvs rdiff -u -r1.73 -r1.74 src/sys/netinet/ip_flow.c cvs rdiff -u -r1.28 -r1.29 src/sys/netinet6/ip6_flow.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/netinet/ip_flow.c diff -u src/sys/netinet/ip_flow.c:1.73 src/sys/netinet/ip_flow.c:1.74 --- src/sys/netinet/ip_flow.c:1.73 Mon Jul 11 07:37:00 2016 +++ src/sys/netinet/ip_flow.c Tue Jul 26 05:53:30 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: ip_flow.c,v 1.73 2016/07/11 07:37:00 ozaki-r Exp $ */ +/* $NetBSD: ip_flow.c,v 1.74 2016/07/26 05:53:30 ozaki-r Exp $ */ /*- * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ip_flow.c,v 1.73 2016/07/11 07:37:00 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ip_flow.c,v 1.74 2016/07/26 05:53:30 ozaki-r Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -46,6 +46,7 @@ __KERNEL_RCSID(0, "$NetBSD: ip_flow.c,v #include <sys/pool.h> #include <sys/sysctl.h> #include <sys/workqueue.h> +#include <sys/atomic.h> #include <net/if.h> #include <net/if_dl.h> @@ -430,7 +431,7 @@ ipflow_reap(bool just_one) return NULL; } -static bool ipflow_work_enqueued = false; +static unsigned int ipflow_work_enqueued = 0; static void ipflow_slowtimo_work(struct work *wk, void *arg) @@ -439,6 +440,9 @@ ipflow_slowtimo_work(struct work *wk, vo struct ipflow *ipf, *next_ipf; uint64_t *ips; + /* We can allow enqueuing another work at this point */ + atomic_swap_uint(&ipflow_work_enqueued, 0); + mutex_enter(softnet_lock); mutex_enter(&ipflow_lock); KERNEL_LOCK(1, NULL); @@ -458,7 +462,6 @@ ipflow_slowtimo_work(struct work *wk, vo ipf->ipf_uses = 0; } } - ipflow_work_enqueued = false; KERNEL_UNLOCK_ONE(NULL); mutex_exit(&ipflow_lock); mutex_exit(softnet_lock); @@ -469,13 +472,8 @@ ipflow_slowtimo(void) { /* Avoid enqueuing another work when one is already enqueued */ - mutex_enter(&ipflow_lock); - if (ipflow_work_enqueued) { - mutex_exit(&ipflow_lock); + if (atomic_swap_uint(&ipflow_work_enqueued, 1) == 1) return; - } - ipflow_work_enqueued = true; - mutex_exit(&ipflow_lock); workqueue_enqueue(ipflow_slowtimo_wq, &ipflow_slowtimo_wk, NULL); } Index: src/sys/netinet6/ip6_flow.c diff -u src/sys/netinet6/ip6_flow.c:1.28 src/sys/netinet6/ip6_flow.c:1.29 --- src/sys/netinet6/ip6_flow.c:1.28 Mon Jul 11 07:37:00 2016 +++ src/sys/netinet6/ip6_flow.c Tue Jul 26 05:53:30 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: ip6_flow.c,v 1.28 2016/07/11 07:37:00 ozaki-r Exp $ */ +/* $NetBSD: ip6_flow.c,v 1.29 2016/07/26 05:53:30 ozaki-r Exp $ */ /*- * Copyright (c) 2007 The NetBSD Foundation, Inc. @@ -38,7 +38,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ip6_flow.c,v 1.28 2016/07/11 07:37:00 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ip6_flow.c,v 1.29 2016/07/26 05:53:30 ozaki-r Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -53,6 +53,7 @@ __KERNEL_RCSID(0, "$NetBSD: ip6_flow.c,v #include <sys/pool.h> #include <sys/sysctl.h> #include <sys/workqueue.h> +#include <sys/atomic.h> #include <net/if.h> #include <net/if_dl.h> @@ -466,13 +467,16 @@ ip6flow_reap(int just_one) return ip6f; } -static bool ip6flow_work_enqueued = false; +static unsigned int ip6flow_work_enqueued = 0; void ip6flow_slowtimo_work(struct work *wk, void *arg) { struct ip6flow *ip6f, *next_ip6f; + /* We can allow enqueuing another work at this point */ + atomic_swap_uint(&ip6flow_work_enqueued, 0); + mutex_enter(softnet_lock); mutex_enter(&ip6flow_lock); KERNEL_LOCK(1, NULL); @@ -490,7 +494,6 @@ ip6flow_slowtimo_work(struct work *wk, v ip6f->ip6f_forwarded = 0; } } - ip6flow_work_enqueued = false; KERNEL_UNLOCK_ONE(NULL); mutex_exit(&ip6flow_lock); @@ -502,13 +505,8 @@ ip6flow_slowtimo(void) { /* Avoid enqueuing another work when one is already enqueued */ - mutex_enter(&ip6flow_lock); - if (ip6flow_work_enqueued) { - mutex_exit(&ip6flow_lock); + if (atomic_swap_uint(&ip6flow_work_enqueued, 1) == 1) return; - } - ip6flow_work_enqueued = true; - mutex_exit(&ip6flow_lock); workqueue_enqueue(ip6flow_slowtimo_wq, &ip6flow_slowtimo_wk, NULL); }