On Tue, 2019-09-10 at 09:34 -0700, Jeff Kirsher wrote: > From: Alexander Duyck <alexander.h.du...@linux.intel.com> > > There were a couple cases where the ITR value generated via the adaptive > ITR scheme could exceed 126. This resulted in the value becoming either 0 > or something less than 10. Switching back and forth between a value less > than 10 and a value greater than 10 can cause issues as certain hardware > features such as RSC to not function well when the ITR value has dropped > that low.
One quick thing we can add on here is: Fixes: b4ded8327fea ("ixgbe: Update adaptive ITR algorithm") This is likely something that we may want to backport to stable. > Reported-by: Gregg Leventhal <glevent...@janestreet.com> > Signed-off-by: Alexander Duyck <alexander.h.du...@linux.intel.com> > Tested-by: Andrew Bowers <andrewx.bow...@intel.com> > Signed-off-by: Jeff Kirsher <jeffrey.t.kirs...@intel.com> > --- > drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c > b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c > index dc034f4e8cf6..a5398b691aa8 100644 > --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c > +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c > @@ -2623,7 +2623,7 @@ static void ixgbe_update_itr(struct ixgbe_q_vector > *q_vector, > /* 16K ints/sec to 9.2K ints/sec */ > avg_wire_size *= 15; > avg_wire_size += 11452; > - } else if (avg_wire_size <= 1980) { > + } else if (avg_wire_size < 1968) { > /* 9.2K ints/sec to 8K ints/sec */ > avg_wire_size *= 5; > avg_wire_size += 22420; > @@ -2656,6 +2656,8 @@ static void ixgbe_update_itr(struct ixgbe_q_vector > *q_vector, > case IXGBE_LINK_SPEED_2_5GB_FULL: > case IXGBE_LINK_SPEED_1GB_FULL: > case IXGBE_LINK_SPEED_10_FULL: > + if (avg_wire_size > 8064) > + avg_wire_size = 8064; > itr += DIV_ROUND_UP(avg_wire_size, > IXGBE_ITR_ADAPTIVE_MIN_INC * 64) * > IXGBE_ITR_ADAPTIVE_MIN_INC;