Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F100622463
D36236.id109483.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
D36236.id109483.diff
View Options
diff --git a/sys/netinet/in_proto.c b/sys/netinet/in_proto.c
--- a/sys/netinet/in_proto.c
+++ b/sys/netinet/in_proto.c
@@ -113,7 +113,6 @@
.pr_domain = &inetdomain,
.pr_protocol = IPPROTO_IP,
.pr_flags = PR_CAPATTACH,
- .pr_slowtimo = ip_slowtimo,
.pr_drain = ip_drain,
.pr_usrreqs = &nousrreqs
},
diff --git a/sys/netinet/ip_input.c b/sys/netinet/ip_input.c
--- a/sys/netinet/ip_input.c
+++ b/sys/netinet/ip_input.c
@@ -102,7 +102,6 @@
/* IP reassembly functions are defined in ip_reass.c. */
extern void ipreass_init(void);
extern void ipreass_drain(void);
-extern void ipreass_slowtimo(void);
#ifdef VIMAGE
extern void ipreass_destroy(void);
#endif
@@ -846,25 +845,6 @@
m_freem(m);
}
-/*
- * IP timer processing;
- * if a timer expires on a reassembly
- * queue, discard it.
- */
-void
-ip_slowtimo(void)
-{
- VNET_ITERATOR_DECL(vnet_iter);
-
- VNET_LIST_RLOCK_NOSLEEP();
- VNET_FOREACH(vnet_iter) {
- CURVNET_SET(vnet_iter);
- ipreass_slowtimo();
- CURVNET_RESTORE();
- }
- VNET_LIST_RUNLOCK_NOSLEEP();
-}
-
void
ip_drain(void)
{
diff --git a/sys/netinet/ip_reass.c b/sys/netinet/ip_reass.c
--- a/sys/netinet/ip_reass.c
+++ b/sys/netinet/ip_reass.c
@@ -93,7 +93,6 @@
void ipreass_init(void);
void ipreass_drain(void);
-void ipreass_slowtimo(void);
#ifdef VIMAGE
void ipreass_destroy(void);
#endif
@@ -556,6 +555,48 @@
#undef GETIP
}
+/*
+ * If a timer expires on a reassembly queue, discard it.
+ */
+static struct callout ipreass_callout;
+static void
+ipreass_slowtimo(void *arg __unused)
+{
+ VNET_ITERATOR_DECL(vnet_iter);
+ struct ipq *fp, *tmp;
+
+ if (atomic_load_int(&nfrags) == 0)
+ return;
+
+ VNET_FOREACH(vnet_iter) {
+ CURVNET_SET(vnet_iter);
+ for (int i = 0; i < IPREASS_NHASH; i++) {
+ if (TAILQ_EMPTY(&V_ipq[i].head))
+ continue;
+ IPQ_LOCK(i);
+ TAILQ_FOREACH_SAFE(fp, &V_ipq[i].head, ipq_list, tmp)
+ if (--fp->ipq_ttl == 0)
+ ipq_timeout(&V_ipq[i], fp);
+ IPQ_UNLOCK(i);
+ }
+ CURVNET_RESTORE();
+ }
+ VNET_LIST_RUNLOCK_NOSLEEP();
+
+ callout_reset_sbt(&ipreass_callout, SBT_1MS * 500, SBT_1MS * 10,
+ ipreass_slowtimo, NULL, 0);
+}
+
+static void
+ipreass_timer_init(void *arg __unused)
+{
+
+ callout_init(&ipreass_callout, 1);
+ callout_reset_sbt(&ipreass_callout, SBT_1MS * 500, SBT_1MS * 10,
+ ipreass_slowtimo, NULL, 0);
+}
+SYSINIT(ipreass, SI_SUB_VNET_DONE, SI_ORDER_ANY, ipreass_timer_init, NULL);
+
/*
* Initialize IP reassembly structures.
*/
@@ -585,28 +626,6 @@
}
}
-/*
- * If a timer expires on a reassembly queue, discard it.
- */
-void
-ipreass_slowtimo(void)
-{
- struct ipq *fp, *tmp;
-
- if (atomic_load_int(&nfrags) == 0)
- return;
-
- for (int i = 0; i < IPREASS_NHASH; i++) {
- if (TAILQ_EMPTY(&V_ipq[i].head))
- continue;
- IPQ_LOCK(i);
- TAILQ_FOREACH_SAFE(fp, &V_ipq[i].head, ipq_list, tmp)
- if (--fp->ipq_ttl == 0)
- ipq_timeout(&V_ipq[i], fp);
- IPQ_UNLOCK(i);
- }
-}
-
/*
* Drain off all datagram fragments.
*/
diff --git a/sys/netinet/ip_var.h b/sys/netinet/ip_var.h
--- a/sys/netinet/ip_var.h
+++ b/sys/netinet/ip_var.h
@@ -228,7 +228,6 @@
ip_reass(struct mbuf *);
void ip_savecontrol(struct inpcb *, struct mbuf **, struct ip *,
struct mbuf *);
-void ip_slowtimo(void);
void ip_fillid(struct ip *);
int rip_ctloutput(struct socket *, struct sockopt *);
void rip_ctlinput(int, struct sockaddr *, void *);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Oct 18, 12:45 PM (1 h, 16 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
14248480
Default Alt Text
D36236.id109483.diff (3 KB)
Attached To
Mode
D36236: ip_reass: use callout(9) directly instead of pr_slowtimo
Attached
Detach File
Event Timeline
Log In to Comment