提交 398c2b05 编写于 作者: Y Yamin Friedman 提交者: Saeed Mahameed

linux/dim: Add completions count to dim_sample

Added a measurement of completions per/msec to allow for completion based
dim algorithms.

In order to use dynamic interrupt moderation with RDMA we need to have a
different measurment than packets per second. This change is meant to
prepare for adding a new DIM method.

All drivers that use net_dim and thus do not need a completion count will
have the completions set to 0.
Signed-off-by: NYamin Friedman <yaminf@mellanox.com>
Reviewed-by: NMax Gurtovoy <maxg@mellanox.com>
Signed-off-by: NSaeed Mahameed <saeedm@mellanox.com>
上级 4f75da36
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
struct dim_cq_moder { struct dim_cq_moder {
u16 usec; u16 usec;
u16 pkts; u16 pkts;
u16 comps;
u8 cq_period_mode; u8 cq_period_mode;
}; };
...@@ -54,6 +55,7 @@ struct dim_sample { ...@@ -54,6 +55,7 @@ struct dim_sample {
u32 pkt_ctr; u32 pkt_ctr;
u32 byte_ctr; u32 byte_ctr;
u16 event_ctr; u16 event_ctr;
u32 comp_ctr;
}; };
/** /**
...@@ -65,9 +67,11 @@ struct dim_sample { ...@@ -65,9 +67,11 @@ struct dim_sample {
* @epms: Events per msec * @epms: Events per msec
*/ */
struct dim_stats { struct dim_stats {
int ppms; int ppms; /* packets per msec */
int bpms; int bpms; /* bytes per msec */
int epms; int epms; /* events per msec */
int cpms; /* completions per msec */
int cpe_ratio; /* ratio of completions to events */
}; };
/** /**
...@@ -89,6 +93,7 @@ struct dim { ...@@ -89,6 +93,7 @@ struct dim {
u8 state; u8 state;
struct dim_stats prev_stats; struct dim_stats prev_stats;
struct dim_sample start_sample; struct dim_sample start_sample;
struct dim_sample measuring_sample;
struct work_struct work; struct work_struct work;
u8 profile_ix; u8 profile_ix;
u8 mode; u8 mode;
...@@ -246,6 +251,23 @@ dim_update_sample(u16 event_ctr, u64 packets, u64 bytes, struct dim_sample *s) ...@@ -246,6 +251,23 @@ dim_update_sample(u16 event_ctr, u64 packets, u64 bytes, struct dim_sample *s)
s->event_ctr = event_ctr; s->event_ctr = event_ctr;
} }
/**
* dim_update_sample_with_comps - set a sample's fields with given
* values including the completion parameter
* @event_ctr: number of events to set
* @packets: number of packets to set
* @bytes: number of bytes to set
* @comps: number of completions to set
* @s: DIM sample
*/
static inline void
dim_update_sample_with_comps(u16 event_ctr, u64 packets, u64 bytes, u64 comps,
struct dim_sample *s)
{
dim_update_sample(event_ctr, packets, bytes, s);
s->comp_ctr = comps;
}
/* Net DIM */ /* Net DIM */
/* /*
......
...@@ -62,6 +62,8 @@ void dim_calc_stats(struct dim_sample *start, struct dim_sample *end, ...@@ -62,6 +62,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 npkts = BIT_GAP(BITS_PER_TYPE(u32), end->pkt_ctr, start->pkt_ctr);
u32 nbytes = BIT_GAP(BITS_PER_TYPE(u32), end->byte_ctr, u32 nbytes = BIT_GAP(BITS_PER_TYPE(u32), end->byte_ctr,
start->byte_ctr); start->byte_ctr);
u32 ncomps = BIT_GAP(BITS_PER_TYPE(u32), end->comp_ctr,
start->comp_ctr);
if (!delta_us) if (!delta_us)
return; return;
...@@ -70,5 +72,12 @@ void dim_calc_stats(struct dim_sample *start, struct dim_sample *end, ...@@ -70,5 +72,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->bpms = DIV_ROUND_UP(nbytes * USEC_PER_MSEC, delta_us);
curr_stats->epms = DIV_ROUND_UP(DIM_NEVENTS * USEC_PER_MSEC, curr_stats->epms = DIV_ROUND_UP(DIM_NEVENTS * USEC_PER_MSEC,
delta_us); 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); EXPORT_SYMBOL(dim_calc_stats);
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册