@@ -1029,7 +1029,7 @@ static int bcm_sysport_poll(struct napi_struct *napi, int budget)
if (priv->dim.use_dim) {
dim_create_sample(priv->dim.event_ctr, priv->dim.packets,
- priv->dim.bytes, &dim_sample);
+ priv->dim.bytes, 0, &dim_sample);
net_dim(&priv->dim.dim, dim_sample);
}
@@ -2130,6 +2130,7 @@ static int bnxt_poll(struct napi_struct *napi, int budget)
dim_create_sample(cpr->event_ctr,
cpr->rx_packets,
cpr->rx_bytes,
+ 0,
&dim_sample);
net_dim(&cpr->dim, dim_sample);
}
@@ -1910,7 +1910,7 @@ static int bcmgenet_rx_poll(struct napi_struct *napi, int budget)
if (ring->dim.use_dim) {
dim_create_sample(ring->dim.event_ctr, ring->dim.packets,
- ring->dim.bytes, &dim_sample);
+ ring->dim.bytes, 0, &dim_sample);
net_dim(&ring->dim.dim, dim_sample);
}
@@ -53,7 +53,8 @@ static void mlx5e_handle_tx_dim(struct mlx5e_txqsq *sq)
if (unlikely(!test_bit(MLX5E_SQ_STATE_AM, &sq->state)))
return;
- dim_create_sample(sq->cq.event_ctr, stats->packets, stats->bytes, &dim_sample);
+ dim_create_sample(sq->cq.event_ctr, stats->packets, stats->bytes, 0,
+ &dim_sample);
net_dim(&sq->dim, dim_sample);
}
@@ -65,7 +66,8 @@ static void mlx5e_handle_rx_dim(struct mlx5e_rq *rq)
if (unlikely(!test_bit(MLX5E_RQ_STATE_AM, &rq->state)))
return;
- dim_create_sample(rq->cq.event_ctr, stats->packets, stats->bytes, &dim_sample);
+ dim_create_sample(rq->cq.event_ctr, stats->packets, stats->bytes, 0,
+ &dim_sample);
net_dim(&rq->dim, dim_sample);
}
@@ -44,6 +44,7 @@
struct dim_cq_moder {
u16 usec;
u16 pkts;
+ u16 comps;
u8 cq_period_mode;
};
@@ -52,18 +53,22 @@ struct dim_sample {
u32 pkt_ctr;
u32 byte_ctr;
u16 event_ctr;
+ u32 comp_ctr;
};
struct dim_stats {
int ppms; /* packets per msec */
int bpms; /* bytes per msec */
int epms; /* events per msec */
+ int cpms; /* completions per msec */
+ int cpe_ratio; /* ratio of completions to events */
};
struct dim { /* Dynamic Interrupt Moderation */
u8 state;
struct dim_stats prev_stats;
struct dim_sample start_sample;
+ struct dim_sample measuring_sample;
struct work_struct work;
u8 profile_ix;
u8 mode;
@@ -112,7 +117,8 @@ enum {
void dim_park_tired(struct dim *dim);
-void dim_create_sample(u16 event_ctr, u64 packets, u64 bytes, struct dim_sample *s);
+void dim_create_sample(u16 event_ctr, u64 packets, u64 bytes, u64 comps,
+ struct dim_sample *s);
void dim_calc_stats(struct dim_sample *start, struct dim_sample *end,
struct dim_stats *curr_stats);
@@ -54,12 +54,14 @@ void dim_park_tired(struct dim *dim)
}
EXPORT_SYMBOL(dim_park_tired);
-void dim_create_sample(u16 event_ctr, u64 packets, u64 bytes, struct dim_sample *s)
+void dim_create_sample(u16 event_ctr, u64 packets, u64 bytes, u64 comps,
+ struct dim_sample *s)
{
s->time = ktime_get();
s->pkt_ctr = packets;
s->byte_ctr = bytes;
s->event_ctr = event_ctr;
+ s->comp_ctr = comps;
}
EXPORT_SYMBOL(dim_create_sample);
@@ -71,6 +73,8 @@ void dim_calc_stats(struct dim_sample *start, struct dim_sample *end,
u32 npkts = BIT_GAP(BITS_PER_TYPE(u32), end->pkt_ctr, start->pkt_ctr);
u32 nbytes = BIT_GAP(BITS_PER_TYPE(u32), end->byte_ctr,
start->byte_ctr);
+ u32 ncomps = BIT_GAP(BITS_PER_TYPE(u32), end->comp_ctr,
+ start->comp_ctr);
if (!delta_us)
return;
@@ -79,5 +83,12 @@ void dim_calc_stats(struct dim_sample *start, struct dim_sample *end,
curr_stats->bpms = DIV_ROUND_UP(nbytes * USEC_PER_MSEC, delta_us);
curr_stats->epms = DIV_ROUND_UP(DIM_NEVENTS * USEC_PER_MSEC,
delta_us);
+ curr_stats->cpms = DIV_ROUND_UP(ncomps * USEC_PER_MSEC, delta_us);
+ if (curr_stats->epms != 0)
+ curr_stats->cpe_ratio =
+ (curr_stats->cpms * 100) / curr_stats->epms;
+ else
+ curr_stats->cpe_ratio = 0;
+
}
EXPORT_SYMBOL(dim_calc_stats);
@@ -181,7 +181,7 @@ void net_dim(struct dim *dim, struct dim_sample end_sample)
/* fall through */
case DIM_START_MEASURE:
dim_create_sample(end_sample.event_ctr, end_sample.pkt_ctr,
- end_sample.byte_ctr, &dim->start_sample);
+ end_sample.byte_ctr, 0, &dim->start_sample);
dim->state = DIM_MEASURE_IN_PROGRESS;
break;
case DIM_APPLY_NEW_PROFILE: