Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F102620504
D42860.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D42860.diff
View Options
diff --git a/sys/kern/subr_trap.c b/sys/kern/subr_trap.c
--- a/sys/kern/subr_trap.c
+++ b/sys/kern/subr_trap.c
@@ -74,6 +74,8 @@
#include <sys/epoch.h>
#endif
+void (*tcp_hpts_softclock)(void);
+
/*
* Define the code needed before returning to user mode, for trap and
* syscall.
@@ -125,16 +127,18 @@
if (PMC_THREAD_HAS_SAMPLES(td))
PMC_CALL_HOOK(td, PMC_FN_THR_USERRET, NULL);
#endif
-#ifdef TCPHPTS
/*
- * @gallatin is adament that this needs to go here, I
- * am not so sure. Running hpts is a lot like
- * a lro_flush() that happens while a user process
- * is running. But he may know best so I will go
- * with his view of accounting. :-)
+ * Calling tcp_hpts_softclock() here allows us to avoid frequent,
+ * expensive callouts that trash the cache and lead to a much higher
+ * number of interrupts and context switches. Testing on busy web
+ * servers at Netflix has shown that this improves CPU use by 7% over
+ * relying only on callouts to drive HPTS, and also results in idle
+ * power savings on mostly idle servers.
+ * This was inspired by the paper "Soft Timers: Efficient Microsecond
+ * Software Timer Support for Network Processing"
+ * by Mohit Aron and Peter Druschel.
*/
- tcp_run_hpts();
-#endif
+ tcp_hpts_softclock();
/*
* Let the scheduler adjust our priority etc.
*/
diff --git a/sys/netinet/tcp_hpts.h b/sys/netinet/tcp_hpts.h
--- a/sys/netinet/tcp_hpts.h
+++ b/sys/netinet/tcp_hpts.h
@@ -152,7 +152,6 @@
void tcp_set_inp_to_drop(struct inpcb *inp, uint16_t reason);
-extern void (*tcp_hpts_softclock)(void);
void tcp_lro_hpts_init(void);
extern int32_t tcp_min_hptsi_time;
diff --git a/sys/netinet/tcp_lro.c b/sys/netinet/tcp_lro.c
--- a/sys/netinet/tcp_lro.c
+++ b/sys/netinet/tcp_lro.c
@@ -89,7 +89,6 @@
long tcplro_stacks_wanting_mbufq;
int (*tcp_lro_flush_tcphpts)(struct lro_ctrl *lc, struct lro_entry *le);
-void (*tcp_hpts_softclock)(void);
counter_u64_t tcp_inp_lro_direct_queue;
counter_u64_t tcp_inp_lro_wokeup_queue;
@@ -1262,8 +1261,7 @@
done:
/* flush active streams */
tcp_lro_rx_done(lc);
- if (tcp_hpts_softclock != NULL)
- tcp_hpts_softclock();
+ tcp_hpts_softclock();
lc->lro_mbuf_count = 0;
}
diff --git a/sys/sys/systm.h b/sys/sys/systm.h
--- a/sys/sys/systm.h
+++ b/sys/sys/systm.h
@@ -378,6 +378,12 @@
extern int cpu_disable_c2_sleep;
extern int cpu_disable_c3_sleep;
+extern void (*tcp_hpts_softclock)(void);
+#define tcp_hpts_softclock() do { \
+ if (tcp_hpts_softclock != NULL) \
+ tcp_hpts_softclock(); \
+} while (0)
+
char *kern_getenv(const char *name);
void freeenv(char *env);
int getenv_int(const char *name, int *data);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Nov 15, 10:14 PM (20 h, 39 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
14648779
Default Alt Text
D42860.diff (2 KB)
Attached To
Mode
D42860: kern/subr_trap.c: repair the HPTS performance hack in userret()
Attached
Detach File
Event Timeline
Log In to Comment