s16 table[] __counted_by(size);
};
-struct netem_sched_data {
- /* internal t(ime)fifo qdisc uses t_root and sch->limit */
- struct rb_root t_root;
-
- /* a linear queue; reduces rbtree rebalancing when jitter is low */
- struct sk_buff *t_head;
- struct sk_buff *t_tail;
-
- u32 t_len;
-
- /* optional qdisc for classful handling (NULL at netem init) */
- struct Qdisc *qdisc;
-
- struct qdisc_watchdog watchdog;
+/* Loss models */
+enum {
+ CLG_RANDOM,
+ CLG_4_STATES,
+ CLG_GILB_ELL,
+};
- s64 latency;
- s64 jitter;
+/* States in GE model */
+enum {
+ GOOD_STATE = 1,
+ BAD_STATE,
+};
- u32 loss;
- u32 ecn;
- u32 limit;
- u32 counter;
- u32 gap;
- u32 duplicate;
- u32 reorder;
- u32 corrupt;
- u64 rate;
- s32 packet_overhead;
- u32 cell_size;
- struct reciprocal_value cell_size_reciprocal;
- s32 cell_overhead;
+/* States in 4 state model */
+enum {
+ TX_IN_GAP_PERIOD = 1,
+ TX_IN_BURST_PERIOD,
+ LOST_IN_GAP_PERIOD,
+ LOST_IN_BURST_PERIOD,
+};
+struct netem_sched_data {
+ /* Cacheline 0: tfifo state and per-packet enqueue/dequeue scalars. */
+ struct rb_root t_root;
+ struct sk_buff *t_head;
+ struct sk_buff *t_tail;
+ u32 t_len;
+ u32 counter;
+ s64 latency;
+ s64 jitter;
+ u64 rate;
+ u32 gap;
+ u32 loss;
+
+ /* Cacheline 1: zero-check scalars and correlation states. */
+ u32 duplicate;
+ u32 reorder;
+ u32 corrupt;
+ u32 ecn;
struct crndstate {
u32 last;
u32 rho;
} delay_cor, loss_cor, dup_cor, reorder_cor, corrupt_cor;
+ u8 loss_model;
- struct prng {
+ /* Cacheline 2: PRNG, distribution tables, slot dequeue state etc. */
+ struct prng {
u64 seed;
struct rnd_state prng_state;
} prng;
+ struct disttable *delay_dist;
+ struct slotstate {
+ u64 slot_next;
+ s32 packets_left;
+ s32 bytes_left;
+ } slot;
+ struct disttable *slot_dist;
+ struct Qdisc *qdisc;
- struct disttable *delay_dist;
-
- enum {
- CLG_RANDOM,
- CLG_4_STATES,
- CLG_GILB_ELL,
- } loss_model;
-
- enum {
- TX_IN_GAP_PERIOD = 1,
- TX_IN_BURST_PERIOD,
- LOST_IN_GAP_PERIOD,
- LOST_IN_BURST_PERIOD,
- } _4_state_model;
-
- enum {
- GOOD_STATE = 1,
- BAD_STATE,
- } GE_state_model;
+ /*
+ * Warm: rate-shaping parameters (only read when rate != 0) and
+ * configuration-only fields. The fast path reads sch->limit, not
+ * q->limit.
+ */
+ s32 packet_overhead;
+ u32 cell_size;
+ struct reciprocal_value cell_size_reciprocal;
+ s32 cell_overhead;
+ u32 limit;
/* Correlated Loss Generation models */
struct clgstate {
- /* state of the Markov chain */
- u8 state;
-
/* 4-states and Gilbert-Elliot models */
u32 a1; /* p13 for 4-states or p for GE */
u32 a2; /* p31 for 4-states or r for GE */
u32 a3; /* p32 for 4-states or h for GE */
u32 a4; /* p14 for 4-states or 1-k for GE */
u32 a5; /* p23 used only in 4-states */
- } clg;
- struct tc_netem_slot slot_config;
- struct slotstate {
- u64 slot_next;
- s32 packets_left;
- s32 bytes_left;
- } slot;
+ /* state of the Markov chain */
+ u8 state;
+ } clg;
- struct disttable *slot_dist;
+ /* Cold tail: slot reschedule config and the watchdog timer. */
+ struct tc_netem_slot slot_config;
+ struct qdisc_watchdog watchdog;
};
/* Time stamp put into socket buffer control block