Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 398c2b05 authored by Yamin Friedman's avatar Yamin Friedman Committed by Saeed Mahameed
Browse files

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: default avatarYamin Friedman <yaminf@mellanox.com>
Reviewed-by: default avatarMax Gurtovoy <maxg@mellanox.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
parent 4f75da36
Loading
Loading
Loading
Loading
+25 −3
Original line number Diff line number Diff line
@@ -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 */

/*
+9 −0
Original line number Diff line number Diff line
@@ -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);