summaryrefslogtreecommitdiffstats
path: root/sys/netinet
diff options
context:
space:
mode:
authorrrs <rrs@FreeBSD.org>2008-06-15 12:31:23 +0000
committerrrs <rrs@FreeBSD.org>2008-06-15 12:31:23 +0000
commit257bc23f07a1cb68b85763c927a7e37c453fe682 (patch)
tree71cac4351754aa7eb6ca3c487904dee3e5b328af /sys/netinet
parentb431d5267e06713f81d6a7977d22ef411fef6127 (diff)
downloadFreeBSD-src-257bc23f07a1cb68b85763c927a7e37c453fe682.zip
FreeBSD-src-257bc23f07a1cb68b85763c927a7e37c453fe682.tar.gz
More prep for Vimage:
- only one functino to destroy an SCTP stack sctp_finish() - Make it so this function also arranges for any threads created by the image to do a kthread_exit()
Diffstat (limited to 'sys/netinet')
-rw-r--r--sys/netinet/sctp_pcb.c16
-rw-r--r--sys/netinet/sctp_pcb.h2
-rw-r--r--sys/netinet/sctp_usrreq.c17
-rw-r--r--sys/netinet/sctp_var.h1
4 files changed, 17 insertions, 19 deletions
diff --git a/sys/netinet/sctp_pcb.c b/sys/netinet/sctp_pcb.c
index 3383ae4..5cdc812 100644
--- a/sys/netinet/sctp_pcb.c
+++ b/sys/netinet/sctp_pcb.c
@@ -5330,6 +5330,7 @@ sctp_pcb_init()
#if defined(SCTP_USE_THREAD_BASED_ITERATOR)
SCTP_BASE_INFO(iterator_running) = 0;
+ SCTP_BASE_INFO(threads_must_exit) = 0;
sctp_startup_iterator();
#endif
@@ -5357,6 +5358,11 @@ sctp_pcb_finish(void)
int i;
/* FIXME MT */
+ SCTP_BASE_INFO(threads_must_exit) = 1;
+#if defined(SCTP_USE_THREAD_BASED_ITERATOR)
+ /* Wake the thread up so it will exit now */
+ sctp_wakeup_iterator();
+#endif
/*
* free the vrf/ifn/ifa lists and hashes (be sure address monitor is
* destroyed first).
@@ -5428,6 +5434,16 @@ sctp_pcb_finish(void)
SCTP_ZONE_DESTROY(SCTP_BASE_INFO(ipi_zone_strmoq));
SCTP_ZONE_DESTROY(SCTP_BASE_INFO(ipi_zone_asconf));
SCTP_ZONE_DESTROY(SCTP_BASE_INFO(ipi_zone_asconf_ack));
+ /* Get rid of other stuff to */
+ if (SCTP_BASE_INFO(sctp_asochash) != NULL)
+ SCTP_HASH_FREE(SCTP_BASE_INFO(sctp_asochash), SCTP_BASE_INFO(hashasocmark));
+ if (SCTP_BASE_INFO(sctp_ephash) != NULL)
+ SCTP_HASH_FREE(SCTP_BASE_INFO(sctp_ephash), SCTP_BASE_INFO(hashmark));
+ if (SCTP_BASE_INFO(sctp_tcpephash) != NULL)
+ SCTP_HASH_FREE(SCTP_BASE_INFO(sctp_tcpephash), SCTP_BASE_INFO(hashtcpmark));
+ if (SCTP_BASE_INFO(sctp_restarthash) != NULL)
+ SCTP_HASH_FREE(SCTP_BASE_INFO(sctp_restarthash), SCTP_BASE_INFO(hashrestartmark));
+
}
diff --git a/sys/netinet/sctp_pcb.h b/sys/netinet/sctp_pcb.h
index 0f75acc..ef0cdf9 100644
--- a/sys/netinet/sctp_pcb.h
+++ b/sys/netinet/sctp_pcb.h
@@ -177,7 +177,7 @@ struct sctp_epinfo {
struct sctpladdr addr_wq;
struct sctpiterators iteratorhead;
-
+ int threads_must_exit;
/* ep zone info */
sctp_zone_t ipi_zone_ep;
sctp_zone_t ipi_zone_asoc;
diff --git a/sys/netinet/sctp_usrreq.c b/sys/netinet/sctp_usrreq.c
index 1fb2b07..7d92968 100644
--- a/sys/netinet/sctp_usrreq.c
+++ b/sys/netinet/sctp_usrreq.c
@@ -98,23 +98,6 @@ sctp_finish(void)
sctp_pcb_finish();
}
-/*
- * cleanup of the SCTP_BASE_INFO() structure.
- * Assumes that the SCTP_BASE_INFO() lock is held.
- */
-void
-sctp_pcbinfo_cleanup(void)
-{
- /* free the hash tables */
- if (SCTP_BASE_INFO(sctp_asochash) != NULL)
- SCTP_HASH_FREE(SCTP_BASE_INFO(sctp_asochash), SCTP_BASE_INFO(hashasocmark));
- if (SCTP_BASE_INFO(sctp_ephash) != NULL)
- SCTP_HASH_FREE(SCTP_BASE_INFO(sctp_ephash), SCTP_BASE_INFO(hashmark));
- if (SCTP_BASE_INFO(sctp_tcpephash) != NULL)
- SCTP_HASH_FREE(SCTP_BASE_INFO(sctp_tcpephash), SCTP_BASE_INFO(hashtcpmark));
- if (SCTP_BASE_INFO(sctp_restarthash) != NULL)
- SCTP_HASH_FREE(SCTP_BASE_INFO(sctp_restarthash), SCTP_BASE_INFO(hashrestartmark));
-}
void
diff --git a/sys/netinet/sctp_var.h b/sys/netinet/sctp_var.h
index 38f476a..e66d74c 100644
--- a/sys/netinet/sctp_var.h
+++ b/sys/netinet/sctp_var.h
@@ -308,7 +308,6 @@ void sctp_init __P((void));
void sctp_finish(void);
-void sctp_pcbinfo_cleanup(void);
int sctp_flush(struct socket *, int);
int sctp_shutdown __P((struct socket *));
void sctp_notify
OpenPOWER on IntegriCloud