diff options
author | Luiz Otavio O Souza <luiz@netgate.com> | 2016-03-30 12:50:25 -0500 |
---|---|---|
committer | Luiz Otavio O Souza <luiz@netgate.com> | 2016-03-30 12:50:25 -0500 |
commit | cda345b593ec84d7abbf45b2ce284a9d7f53307c (patch) | |
tree | 7ad875acd35d7cd5a18a7676761b35e5385b1b0c /sys/netpfil/ipfw/ip_dummynet.c | |
parent | c35924db4e1edd83f5a845760098fc8cbd7f7456 (diff) | |
parent | f08e8e5dd415880269fb4ce4cb2fd7bccefe336d (diff) | |
download | FreeBSD-src-cda345b593ec84d7abbf45b2ce284a9d7f53307c.zip FreeBSD-src-cda345b593ec84d7abbf45b2ce284a9d7f53307c.tar.gz |
Merge remote-tracking branch 'origin/stable/10' into devel
Diffstat (limited to 'sys/netpfil/ipfw/ip_dummynet.c')
-rw-r--r-- | sys/netpfil/ipfw/ip_dummynet.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/sys/netpfil/ipfw/ip_dummynet.c b/sys/netpfil/ipfw/ip_dummynet.c index 40b8e97..57216be 100644 --- a/sys/netpfil/ipfw/ip_dummynet.c +++ b/sys/netpfil/ipfw/ip_dummynet.c @@ -74,6 +74,7 @@ struct schk_new_arg { /*---- callout hooks. ----*/ static struct callout dn_timeout; +static int dn_gone; static struct task dn_task; static struct taskqueue *dn_tq = NULL; @@ -89,6 +90,8 @@ void dn_reschedule(void) { + if (dn_gone != 0) + return; callout_reset_sbt(&dn_timeout, tick_sbt, 0, dummynet, NULL, C_HARDCLOCK | C_DIRECT_EXEC); } @@ -2175,9 +2178,11 @@ ip_dn_init(void) static void ip_dn_destroy(int last) { - callout_drain(&dn_timeout); - DN_BH_WLOCK(); + /* ensure no more callouts are started */ + dn_gone = 1; + + /* check for last */ if (last) { ND("removing last instance\n"); ip_dn_ctl_ptr = NULL; @@ -2186,6 +2191,8 @@ ip_dn_destroy(int last) dummynet_flush(); DN_BH_WUNLOCK(); + + callout_drain(&dn_timeout); taskqueue_drain(dn_tq, &dn_task); taskqueue_free(dn_tq); |