Page MenuHomeFreeBSD

D44420.diff
No OneTemporary

D44420.diff

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
+volatile uint32_t __read_frequently hpts_that_need_softclock = 0;
+
void (*tcp_hpts_softclock)(void);
/*
diff --git a/sys/netinet/tcp_hpts.c b/sys/netinet/tcp_hpts.c
--- a/sys/netinet/tcp_hpts.c
+++ b/sys/netinet/tcp_hpts.c
@@ -193,7 +193,8 @@
uint8_t p_direct_wake :1, /* boolean */
p_on_min_sleep:1, /* boolean */
p_hpts_wake_scheduled:1, /* boolean */
- p_avail:5;
+ hit_callout_thresh:1,
+ p_avail:4;
uint8_t p_fill[3]; /* Fill to 32 bits */
/* Cache line 0x40 */
struct hptsh {
@@ -1683,6 +1684,13 @@
ticks_ran = tcp_hptsi(hpts, 1);
tv.tv_sec = 0;
tv.tv_usec = hpts->p_hpts_sleep_time * HPTS_TICKS_PER_SLOT;
+ if ((hpts->p_on_queue_cnt > conn_cnt_thresh) && (hpts->hit_callout_thresh == 0)) {
+ hpts->hit_callout_thresh = 1;
+ atomic_add_int(&hpts_that_need_softclock, 1);
+ } else if ((hpts->p_on_queue_cnt <= conn_cnt_thresh) && (hpts->hit_callout_thresh == 1)) {
+ hpts->hit_callout_thresh = 0;
+ atomic_subtract_int(&hpts_that_need_softclock, 1);
+ }
if (hpts->p_on_queue_cnt >= conn_cnt_thresh) {
if(hpts->p_direct_wake == 0) {
/*
diff --git a/sys/sys/systm.h b/sys/sys/systm.h
--- a/sys/sys/systm.h
+++ b/sys/sys/systm.h
@@ -400,8 +400,10 @@
extern int cpu_disable_c3_sleep;
extern void (*tcp_hpts_softclock)(void);
+extern volatile uint32_t __read_frequently hpts_that_need_softclock;
+
#define tcp_hpts_softclock() do { \
- if (tcp_hpts_softclock != NULL) \
+ if (hpts_that_need_softclock > 0) \
tcp_hpts_softclock(); \
} while (0)

File Metadata

Mime Type
text/plain
Expires
Fri, Jan 10, 5:59 PM (3 h, 29 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
15744778
Default Alt Text
D44420.diff (1 KB)

Event Timeline