mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	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: Yamin Friedman <yaminf@mellanox.com> Reviewed-by: Max Gurtovoy <maxg@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
This commit is contained in:
		
							parent
							
								
									4f75da3666
								
							
						
					
					
						commit
						398c2b05bb
					
				
					 2 changed files with 34 additions and 3 deletions
				
			
		| 
						 | 
					@ -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 {
 | 
				
			||||||
	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 {
 | 
				
			||||||
 * @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 {
 | 
				
			||||||
	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)
 | 
				
			||||||
	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,
 | 
				
			||||||
	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,
 | 
				
			||||||
	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);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue