linux/dim: Add completions count to dim_sample
authorYamin Friedman <yaminf@mellanox.com>
Thu, 22 Nov 2018 07:51:17 +0000 (09:51 +0200)
committerSaeed Mahameed <saeedm@mellanox.com>
Tue, 25 Jun 2019 20:46:40 +0000 (13:46 -0700)
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: Yamin Friedman <yaminf@mellanox.com>
Reviewed-by: Max Gurtovoy <maxg@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
include/linux/dim.h
lib/dim/dim.c

index f48ede3e0322fdbe318331ba65bb8f665b4b1295..aa9bdd47a648590293fffee5e43371764ee2bc0b 100644 (file)
@@ -37,6 +37,7 @@
 struct dim_cq_moder {
        u16 usec;
        u16 pkts;
+       u16 comps;
        u8 cq_period_mode;
 };
 
@@ -54,6 +55,7 @@ struct dim_sample {
        u32 pkt_ctr;
        u32 byte_ctr;
        u16 event_ctr;
+       u32 comp_ctr;
 };
 
 /**
@@ -65,9 +67,11 @@ struct dim_sample {
  * @epms: Events per msec
  */
 struct dim_stats {
-       int ppms;
-       int bpms;
-       int epms;
+       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 */
 };
 
 /**
@@ -89,6 +93,7 @@ struct dim {
        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;
@@ -246,6 +251,23 @@ dim_update_sample(u16 event_ctr, u64 packets, u64 bytes, struct dim_sample *s)
        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 */
 
 /*
index 17d5236759bdc716faa2f341073f482f274f52a0..439d641ec79648439999bcb9a93a11cece9c4566 100644 (file)
@@ -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 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;
@@ -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->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);