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 | |
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')
-rw-r--r-- | sys/netpfil/ipfw/ip_dn_io.c | 2 | ||||
-rw-r--r-- | sys/netpfil/ipfw/ip_dummynet.c | 11 |
2 files changed, 10 insertions, 3 deletions
diff --git a/sys/netpfil/ipfw/ip_dn_io.c b/sys/netpfil/ipfw/ip_dn_io.c index c842ce0..a67cf0a 100644 --- a/sys/netpfil/ipfw/ip_dn_io.c +++ b/sys/netpfil/ipfw/ip_dn_io.c @@ -619,8 +619,8 @@ dummynet_task(void *context, int pending) dn_drain_queue(); } - DN_BH_WUNLOCK(); dn_reschedule(); + DN_BH_WUNLOCK(); if (q.head != NULL) dummynet_send(q.head); CURVNET_RESTORE(); 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); |