aboutsummaryrefslogtreecommitdiff
path: root/sys/netinet/tcp_hpts.h
diff options
context:
space:
mode:
Diffstat (limited to 'sys/netinet/tcp_hpts.h')
-rw-r--r--sys/netinet/tcp_hpts.h116
1 files changed, 9 insertions, 107 deletions
diff --git a/sys/netinet/tcp_hpts.h b/sys/netinet/tcp_hpts.h
index bfbd34e65ff5..ac99296e34f3 100644
--- a/sys/netinet/tcp_hpts.h
+++ b/sys/netinet/tcp_hpts.h
@@ -28,21 +28,6 @@
#ifndef __tcp_hpts_h__
#define __tcp_hpts_h__
-/*
- * The hpts uses a 102400 wheel. The wheel
- * defines the time in 10 usec increments (102400 x 10).
- * This gives a range of 10usec - 1024ms to place
- * an entry within. If the user requests more than
- * 1.024 second, a remaineder is attached and the hpts
- * when seeing the remainder will re-insert the
- * inpcb forward in time from where it is until
- * the remainder is zero.
- */
-
-#define NUM_OF_HPTSI_SLOTS 102400
-
-TAILQ_HEAD(hptsh, inpcb);
-
/* Number of useconds in a hpts tick */
#define HPTS_TICKS_PER_SLOT 10
#define HPTS_MS_TO_SLOTS(x) ((x * 100) + 1)
@@ -85,68 +70,6 @@ struct hpts_diag {
#define DEFAULT_CONNECTION_THESHOLD 100
-#ifdef _KERNEL
-/* Each hpts has its own p_mtx which is used for locking */
-struct tcp_hpts_entry {
- /* Cache line 0x00 */
- struct mtx p_mtx; /* Mutex for hpts */
- struct timeval p_mysleep; /* Our min sleep time */
- uint64_t syscall_cnt;
- uint64_t sleeping; /* What the actual sleep was (if sleeping) */
- uint16_t p_hpts_active; /* Flag that says hpts is awake */
- uint8_t p_wheel_complete; /* have we completed the wheel arc walk? */
- uint32_t p_curtick; /* Tick in 10 us the hpts is going to */
- uint32_t p_runningslot; /* Current tick we are at if we are running */
- uint32_t p_prev_slot; /* Previous slot we were on */
- uint32_t p_cur_slot; /* Current slot in wheel hpts is draining */
- uint32_t p_nxt_slot; /* The next slot outside the current range of
- * slots that the hpts is running on. */
- int32_t p_on_queue_cnt; /* Count on queue in this hpts */
- uint32_t p_lasttick; /* Last tick before the current one */
- uint8_t p_direct_wake :1, /* boolean */
- p_on_min_sleep:1, /* boolean */
- p_hpts_wake_scheduled:1, /* boolean */
- p_avail:5;
- uint8_t p_fill[3]; /* Fill to 32 bits */
- /* Cache line 0x40 */
- void *p_inp;
- struct hptsh p_input; /* For the tcp-input runner */
- /* Hptsi wheel */
- struct hptsh *p_hptss;
- int32_t p_on_inqueue_cnt; /* Count on input queue in this hpts */
- uint32_t p_hpts_sleep_time; /* Current sleep interval having a max
- * of 255ms */
- uint32_t overidden_sleep; /* what was overrided by min-sleep for logging */
- uint32_t saved_lasttick; /* for logging */
- uint32_t saved_curtick; /* for logging */
- uint32_t saved_curslot; /* for logging */
- uint32_t saved_prev_slot; /* for logging */
- uint32_t p_delayed_by; /* How much were we delayed by */
- /* Cache line 0x80 */
- struct sysctl_ctx_list hpts_ctx;
- struct sysctl_oid *hpts_root;
- struct intr_event *ie;
- void *ie_cookie;
- uint16_t p_num; /* The hpts number one per cpu */
- uint16_t p_cpu; /* The hpts CPU */
- /* There is extra space in here */
- /* Cache line 0x100 */
- struct callout co __aligned(CACHE_LINE_SIZE);
-} __aligned(CACHE_LINE_SIZE);
-
-struct tcp_hptsi {
- struct proc *rp_proc; /* Process structure for hpts */
- struct tcp_hpts_entry **rp_ent; /* Array of hptss */
- uint32_t *cts_last_ran;
- uint32_t rp_num_hptss; /* Number of hpts threads */
-};
-
-#endif
-
-#define HPTS_REMOVE_INPUT 0x01
-#define HPTS_REMOVE_OUTPUT 0x02
-#define HPTS_REMOVE_ALL (HPTS_REMOVE_INPUT | HPTS_REMOVE_OUTPUT)
-
/*
* When using the hpts, a TCP stack must make sure
* that once a INP_DROPPED flag is applied to a INP
@@ -191,15 +114,12 @@ struct tcp_hptsi {
#ifdef _KERNEL
-#define HPTS_MTX_ASSERT(hpts) mtx_assert(&(hpts)->p_mtx, MA_OWNED)
-struct tcp_hpts_entry *tcp_hpts_lock(struct inpcb *inp);
-struct tcp_hpts_entry *tcp_input_lock(struct inpcb *inp);
-int __tcp_queue_to_hpts_immediate(struct inpcb *inp, int32_t line);
-#define tcp_queue_to_hpts_immediate(a)__tcp_queue_to_hpts_immediate(a, __LINE__)
-
-struct tcp_hpts_entry *tcp_cur_hpts(struct inpcb *inp);
#define tcp_hpts_remove(a, b) __tcp_hpts_remove(a, b, __LINE__)
void __tcp_hpts_remove(struct inpcb *inp, int32_t flags, int32_t line);
+#define HPTS_REMOVE_DROPQ 0x01
+#define HPTS_REMOVE_OUTPUT 0x02
+#define HPTS_REMOVE_ALL (HPTS_REMOVE_DROPQ | HPTS_REMOVE_OUTPUT)
+bool tcp_in_hpts(struct inpcb *);
/*
* To insert a TCB on the hpts you *must* be holding the
@@ -225,26 +145,15 @@ void __tcp_hpts_remove(struct inpcb *inp, int32_t flags, int32_t line);
* that INP_WLOCK() or from destroying your TCB where again
* you should already have the INP_WLOCK().
*/
-uint32_t __tcp_hpts_insert(struct inpcb *inp, uint32_t slot, int32_t line);
-#define tcp_hpts_insert(a, b) __tcp_hpts_insert(a, b, __LINE__)
-
-uint32_t
-tcp_hpts_insert_diag(struct inpcb *inp, uint32_t slot, int32_t line, struct hpts_diag *diag);
-
-int
- __tcp_queue_to_input_locked(struct inpcb *inp, struct tcp_hpts_entry *hpts, int32_t line);
-#define tcp_queue_to_input_locked(a, b) __tcp_queue_to_input_locked(a, b, __LINE__);
-int
-__tcp_queue_to_input(struct inpcb *inp, int32_t line);
-#define tcp_queue_to_input(a) __tcp_queue_to_input(a, __LINE__)
-
-uint16_t tcp_hpts_delayedby(struct inpcb *inp);
+uint32_t tcp_hpts_insert_diag(struct inpcb *inp, uint32_t slot, int32_t line,
+ struct hpts_diag *diag);
+#define tcp_hpts_insert(inp, slot) \
+ tcp_hpts_insert_diag((inp), (slot), __LINE__, NULL)
void __tcp_set_hpts(struct inpcb *inp, int32_t line);
#define tcp_set_hpts(a) __tcp_set_hpts(a, __LINE__)
-void __tcp_set_inp_to_drop(struct inpcb *inp, uint16_t reason, int32_t line);
-#define tcp_set_inp_to_drop(a, b) __tcp_set_inp_to_drop(a, b, __LINE__)
+void tcp_set_inp_to_drop(struct inpcb *inp, uint16_t reason);
void tcp_run_hpts(void);
@@ -283,13 +192,6 @@ tcp_tv_to_lusectick(const struct timeval *sv)
}
#ifdef _KERNEL
-
-static __inline void
-tcp_hpts_unlock(struct tcp_hpts_entry *hpts)
-{
- mtx_unlock(&hpts->p_mtx);
-}
-
static __inline uint32_t
tcp_gethptstick(struct timeval *sv)
{