Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F166888523
D5924.id15101.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
8 KB
Referenced Files
None
Subscribers
None
D5924.id15101.diff
View Options
Index: netinet/tcp_stacks/fastpath.c
===================================================================
--- netinet/tcp_stacks/fastpath.c
+++ netinet/tcp_stacks/fastpath.c
@@ -2386,7 +2386,6 @@
NULL,
NULL,
NULL,
- NULL,
0,
0
@@ -2403,7 +2402,6 @@
NULL,
NULL,
NULL,
- NULL,
0,
0
};
Index: netinet/tcp_subr.c
===================================================================
--- netinet/tcp_subr.c
+++ netinet/tcp_subr.c
@@ -244,7 +244,6 @@
static void tcp_mtudisc(struct inpcb *, int);
static char * tcp_log_addr(struct in_conninfo *inc, struct tcphdr *th,
void *ip4hdr, const void *ip6hdr);
-static void tcp_timer_discard(struct tcpcb *, uint32_t);
static struct tcp_function_block tcp_def_funcblk = {
@@ -258,7 +257,6 @@
NULL,
NULL,
NULL,
- NULL,
0,
0
};
@@ -528,7 +526,6 @@
return (EINVAL);
}
if (blk->tfb_tcp_timer_stop_all ||
- blk->tfb_tcp_timers_left ||
blk->tfb_tcp_timer_activate ||
blk->tfb_tcp_timer_active ||
blk->tfb_tcp_timer_stop) {
@@ -537,7 +534,6 @@
* must have them all.
*/
if ((blk->tfb_tcp_timer_stop_all == NULL) ||
- (blk->tfb_tcp_timers_left == NULL) ||
(blk->tfb_tcp_timer_activate == NULL) ||
(blk->tfb_tcp_timer_active == NULL) ||
(blk->tfb_tcp_timer_stop == NULL)) {
@@ -1343,6 +1339,7 @@
* callout, and the last discard function called will take care of
* deleting the tcpcb.
*/
+ tp->t_timers->tt_draincnt = 0;
tcp_timer_stop(tp, TT_REXMT);
tcp_timer_stop(tp, TT_PERSIST);
tcp_timer_stop(tp, TT_KEEP);
@@ -1349,7 +1346,14 @@
tcp_timer_stop(tp, TT_2MSL);
tcp_timer_stop(tp, TT_DELACK);
if (tp->t_fb->tfb_tcp_timer_stop_all) {
- /* Call the stop-all function of the methods */
+ /*
+ * Call the stop-all function of the methods,
+ * this function should call the tcp_timer_stop()
+ * method with each of the function specific timeouts.
+ * That stop will be called via the tfb_tcp_timer_stop()
+ * which should use the async drain function of the
+ * callout system (see tcp_var.h).
+ */
tp->t_fb->tfb_tcp_timer_stop_all(tp);
}
@@ -1434,13 +1438,8 @@
CC_ALGO(tp) = NULL;
inp->inp_ppcb = NULL;
- if ((tp->t_timers->tt_flags & TT_MASK) == 0) {
+ if (tp->t_timers->tt_draincnt == 0) {
/* We own the last reference on tcpcb, let's free it. */
- if ((tp->t_fb->tfb_tcp_timers_left) &&
- (tp->t_fb->tfb_tcp_timers_left(tp))) {
- /* Some fb timers left running! */
- return;
- }
if (tp->t_fb->tfb_tcp_fb_fini)
(*tp->t_fb->tfb_tcp_fb_fini)(tp);
refcount_release(&tp->t_fb->tfb_refcnt);
@@ -1453,45 +1452,12 @@
}
void
-tcp_timer_2msl_discard(void *xtp)
+tcp_timer_discard(void *ptp)
{
-
- tcp_timer_discard((struct tcpcb *)xtp, TT_2MSL);
-}
-
-void
-tcp_timer_keep_discard(void *xtp)
-{
-
- tcp_timer_discard((struct tcpcb *)xtp, TT_KEEP);
-}
-
-void
-tcp_timer_persist_discard(void *xtp)
-{
-
- tcp_timer_discard((struct tcpcb *)xtp, TT_PERSIST);
-}
-
-void
-tcp_timer_rexmt_discard(void *xtp)
-{
-
- tcp_timer_discard((struct tcpcb *)xtp, TT_REXMT);
-}
-
-void
-tcp_timer_delack_discard(void *xtp)
-{
-
- tcp_timer_discard((struct tcpcb *)xtp, TT_DELACK);
-}
-
-void
-tcp_timer_discard(struct tcpcb *tp, uint32_t timer_type)
-{
struct inpcb *inp;
-
+ struct tcpcb *tp;
+
+ tp = (struct tcpcb *)ptp;
CURVNET_SET(tp->t_vnet);
INP_INFO_RLOCK(&V_tcbinfo);
inp = tp->t_inpcb;
@@ -1500,16 +1466,9 @@
INP_WLOCK(inp);
KASSERT((tp->t_timers->tt_flags & TT_STOPPED) != 0,
("%s: tcpcb has to be stopped here", __func__));
- KASSERT((tp->t_timers->tt_flags & timer_type) != 0,
- ("%s: discard callout should be running", __func__));
- tp->t_timers->tt_flags &= ~timer_type;
- if ((tp->t_timers->tt_flags & TT_MASK) == 0) {
+ tp->t_timers->tt_draincnt--;
+ if (tp->t_timers->tt_draincnt == 0) {
/* We own the last reference on this tcpcb, let's free it. */
- if ((tp->t_fb->tfb_tcp_timers_left) &&
- (tp->t_fb->tfb_tcp_timers_left(tp))) {
- /* Some fb timers left running! */
- goto leave;
- }
if (tp->t_fb->tfb_tcp_fb_fini)
(*tp->t_fb->tfb_tcp_fb_fini)(tp);
refcount_release(&tp->t_fb->tfb_refcnt);
@@ -1521,7 +1480,6 @@
return;
}
}
-leave:
INP_WUNLOCK(inp);
INP_INFO_RUNLOCK(&V_tcbinfo);
CURVNET_RESTORE();
Index: netinet/tcp_timer.h
===================================================================
--- netinet/tcp_timer.h
+++ netinet/tcp_timer.h
@@ -146,7 +146,7 @@
struct callout tt_2msl; /* 2*msl TIME_WAIT timer */
struct callout tt_delack; /* delayed ACK timer */
uint32_t tt_flags; /* Timers flags */
- uint32_t tt_spare; /* TDB */
+ uint32_t tt_draincnt; /* Count being drained */
};
/*
@@ -193,6 +193,7 @@
void tcp_timer_init(void);
void tcp_timer_2msl(void *xtp);
+void tcp_timer_discard(void *);
struct tcptw *
tcp_tw_2msl_scan(int reuse); /* XXX temporary? */
void tcp_timer_keep(void *xtp);
@@ -199,11 +200,6 @@
void tcp_timer_persist(void *xtp);
void tcp_timer_rexmt(void *xtp);
void tcp_timer_delack(void *xtp);
-void tcp_timer_2msl_discard(void *xtp);
-void tcp_timer_keep_discard(void *xtp);
-void tcp_timer_persist_discard(void *xtp);
-void tcp_timer_rexmt_discard(void *xtp);
-void tcp_timer_delack_discard(void *xtp);
void tcp_timer_to_xtimer(struct tcpcb *tp, struct tcp_timer *timer,
struct xtcp_timer *xtimer);
Index: netinet/tcp_timer.c
===================================================================
--- netinet/tcp_timer.c
+++ netinet/tcp_timer.c
@@ -927,7 +927,6 @@
tcp_timer_stop(struct tcpcb *tp, uint32_t timer_type)
{
struct callout *t_callout;
- timeout_t *f_callout;
uint32_t f_reset;
tp->t_timers->tt_flags |= TT_STOPPED;
@@ -935,27 +934,22 @@
switch (timer_type) {
case TT_DELACK:
t_callout = &tp->t_timers->tt_delack;
- f_callout = tcp_timer_delack_discard;
f_reset = TT_DELACK_RST;
break;
case TT_REXMT:
t_callout = &tp->t_timers->tt_rexmt;
- f_callout = tcp_timer_rexmt_discard;
f_reset = TT_REXMT_RST;
break;
case TT_PERSIST:
t_callout = &tp->t_timers->tt_persist;
- f_callout = tcp_timer_persist_discard;
f_reset = TT_PERSIST_RST;
break;
case TT_KEEP:
t_callout = &tp->t_timers->tt_keep;
- f_callout = tcp_timer_keep_discard;
f_reset = TT_KEEP_RST;
break;
case TT_2MSL:
t_callout = &tp->t_timers->tt_2msl;
- f_callout = tcp_timer_2msl_discard;
f_reset = TT_2MSL_RST;
break;
default:
@@ -971,21 +965,13 @@
}
if (tp->t_timers->tt_flags & timer_type) {
- if ((callout_stop(t_callout) > 0) &&
- (tp->t_timers->tt_flags & f_reset)) {
- tp->t_timers->tt_flags &= ~(timer_type | f_reset);
- } else {
+ if (callout_async_drain(t_callout, tcp_timer_discard) == 0) {
/*
* Can't stop the callout, defer tcpcb actual deletion
- * to the last tcp timer discard callout.
- * The TT_STOPPED flag will ensure that no tcp timer
- * callouts can be restarted on our behalf, and
- * past this point currently running callouts waiting
- * on inp lock will return right away after the
- * classical check for callout reset/stop events:
- * callout_pending() || !callout_active()
+ * to the last one. We do this using the async drain
+ * function and incrementing the count in
*/
- callout_reset(t_callout, 1, f_callout, tp);
+ tp->t_timers->tt_draincnt++;
}
}
}
Index: netinet/tcp_var.h
===================================================================
--- netinet/tcp_var.h
+++ netinet/tcp_var.h
@@ -106,6 +106,17 @@
struct sockopt;
struct socket;
+/*
+ * If defining the optional tcp_timers, in the
+ * tfb_tcp_timer_stop call you must use the
+ * callout_async_drain() function with the
+ * tcp_timer_discard callback. You should check
+ * the return of callout_async_drain() and if 0
+ * increment tt_draincnt. Since the timer sub-system
+ * does not know your callbacks you must provide a
+ * stop_all function that loops through and calls
+ * tcp_timer_stop() with each of your defined timers.
+ */
struct tcp_function_block {
char tfb_tcp_block_name[TCP_FUNCTION_NAME_LEN_MAX];
int (*tfb_tcp_output)(struct tcpcb *);
@@ -120,7 +131,6 @@
void (*tfb_tcp_fb_fini)(struct tcpcb *);
/* Optional timers, must define all if you define one */
int (*tfb_tcp_timer_stop_all)(struct tcpcb *);
- int (*tfb_tcp_timers_left)(struct tcpcb *);
void (*tfb_tcp_timer_activate)(struct tcpcb *,
uint32_t, u_int);
int (*tfb_tcp_timer_active)(struct tcpcb *, uint32_t);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Aug 18, 1:24 PM (1 h, 53 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
36874445
Default Alt Text
D5924.id15101.diff (8 KB)
Attached To
Mode
D5924: TCP Timer cleanup.
Attached
Detach File
Event Timeline
Log In to Comment