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

Commit ea6a5d3b authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller
Browse files

sch_red: fix red_calc_qavg_from_idle_time



Since commit a4a710c4 (pkt_sched: Change PSCHED_SHIFT from 10 to
6) it seems RED/GRED are broken.

red_calc_qavg_from_idle_time() computes a delay in us units, but this
delay is now 16 times bigger than real delay, so the final qavg result
smaller than expected.

Use standard kernel time services since there is no need to obfuscate
them.

Signed-off-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 917fbdb3
Loading
Loading
Loading
Loading
+6 −9
Original line number Original line Diff line number Diff line
@@ -116,7 +116,7 @@ struct red_parms {
	u32		qR;		/* Cached random number */
	u32		qR;		/* Cached random number */


	unsigned long	qavg;		/* Average queue length: A scaled */
	unsigned long	qavg;		/* Average queue length: A scaled */
	psched_time_t	qidlestart;	/* Start of current idle period */
	ktime_t		qidlestart;	/* Start of current idle period */
};
};


static inline u32 red_rmask(u8 Plog)
static inline u32 red_rmask(u8 Plog)
@@ -148,17 +148,17 @@ static inline void red_set_parms(struct red_parms *p,


static inline int red_is_idling(struct red_parms *p)
static inline int red_is_idling(struct red_parms *p)
{
{
	return p->qidlestart != PSCHED_PASTPERFECT;
	return p->qidlestart.tv64 != 0;
}
}


static inline void red_start_of_idle_period(struct red_parms *p)
static inline void red_start_of_idle_period(struct red_parms *p)
{
{
	p->qidlestart = psched_get_time();
	p->qidlestart = ktime_get();
}
}


static inline void red_end_of_idle_period(struct red_parms *p)
static inline void red_end_of_idle_period(struct red_parms *p)
{
{
	p->qidlestart = PSCHED_PASTPERFECT;
	p->qidlestart.tv64 = 0;
}
}


static inline void red_restart(struct red_parms *p)
static inline void red_restart(struct red_parms *p)
@@ -170,13 +170,10 @@ static inline void red_restart(struct red_parms *p)


static inline unsigned long red_calc_qavg_from_idle_time(struct red_parms *p)
static inline unsigned long red_calc_qavg_from_idle_time(struct red_parms *p)
{
{
	psched_time_t now;
	s64 delta = ktime_us_delta(ktime_get(), p->qidlestart);
	long us_idle;
	long us_idle = min_t(s64, delta, p->Scell_max);
	int  shift;
	int  shift;


	now = psched_get_time();
	us_idle = psched_tdiff_bounded(now, p->qidlestart, p->Scell_max);

	/*
	/*
	 * The problem: ideally, average length queue recalcultion should
	 * The problem: ideally, average length queue recalcultion should
	 * be done over constant clock intervals. This is too expensive, so
	 * be done over constant clock intervals. This is too expensive, so