diff options
Diffstat (limited to 'sys/netinet/tcp_hpts.h')
-rw-r--r-- | sys/netinet/tcp_hpts.h | 116 |
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) { |