mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 09:36:22 +02:00
octeontx2-pf: tc: fix egress ratelimiting
The egress rate calculation computes an incorrect mantissa and exponent,
causing up to ~50% deviation from the configured rate at lower speeds.
Rework the computation to follow the hardware rate formula:
rate = 2 * (1 + mantissa/256) * 2^exp / (1 << div_exp)
Keep div_exp = 0 and derive exp and mantissa from half of the requested
rate. Rates below 2 Mbps are floored to the smallest encodable step
(exp = 0, mantissa = 0).
Fixes: e638a83f16 ("octeontx2-pf: TC_MATCHALL egress ratelimiting offload")
Signed-off-by: Hariprasad Kelam <hkelam@marvell.com>
Signed-off-by: Nitin Shetty J <nshettyj@marvell.com>
Link: https://patch.msgid.link/20260717084349.2227796-1-nshettyj@marvell.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
1087ba5497
commit
bb0d96ebe5
|
|
@ -30,6 +30,7 @@
|
|||
#define OTX2_UNSUPP_LSE_DEPTH GENMASK(6, 4)
|
||||
|
||||
#define MCAST_INVALID_GRP (-1U)
|
||||
#define RATE_MANTISSA_BITS 8
|
||||
|
||||
static void otx2_get_egress_burst_cfg(struct otx2_nic *nic, u32 burst,
|
||||
u32 *burst_exp, u32 *burst_mantissa)
|
||||
|
|
@ -66,28 +67,30 @@ static void otx2_get_egress_burst_cfg(struct otx2_nic *nic, u32 burst,
|
|||
static void otx2_get_egress_rate_cfg(u64 maxrate, u32 *exp,
|
||||
u32 *mantissa, u32 *div_exp)
|
||||
{
|
||||
u64 tmp;
|
||||
|
||||
/* Rate calculation by hardware
|
||||
*
|
||||
* PIR_ADD = ((256 + mantissa) << exp) / 256
|
||||
* rate = (2 * PIR_ADD) / ( 1 << div_exp)
|
||||
* The resultant rate is in Mbps.
|
||||
*
|
||||
* Use div_exp = 0 and compute exp/mantissa for maxrate / 2; the
|
||||
* leading factor of two yields the full rate. Rates below 2 Mbps
|
||||
* are floored to the smallest step (exp = 0, mantissa = 0).
|
||||
*/
|
||||
|
||||
/* 2Mbps to 100Gbps can be expressed with div_exp = 0.
|
||||
* Setting this to '0' will ease the calculation of
|
||||
* exponent and mantissa.
|
||||
*/
|
||||
*div_exp = 0;
|
||||
|
||||
if (maxrate) {
|
||||
*exp = ilog2(maxrate) ? ilog2(maxrate) - 1 : 0;
|
||||
tmp = maxrate - rounddown_pow_of_two(maxrate);
|
||||
if (maxrate < MAX_RATE_MANTISSA)
|
||||
*mantissa = tmp * 2;
|
||||
else
|
||||
*mantissa = tmp / (1ULL << (*exp - 7));
|
||||
maxrate = maxrate / 2;
|
||||
if (!maxrate) {
|
||||
/* Rates below 2 Mbps map to the smallest step */
|
||||
*exp = 0;
|
||||
*mantissa = 0;
|
||||
} else {
|
||||
*exp = ilog2(maxrate);
|
||||
/* Clear MSB and derive fractional bits */
|
||||
maxrate &= ~BIT(*exp);
|
||||
*mantissa = (maxrate << RATE_MANTISSA_BITS) >> *exp;
|
||||
}
|
||||
} else {
|
||||
/* Instead of disabling rate limiting, set all values to max */
|
||||
*exp = MAX_RATE_EXPONENT;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user