Page MenuHomeFreeBSD

Address two incorrect calculations and enhance readability of PRR code
ClosedPublic

Authored by rscheff on Feb 19 2021, 11:55 PM.

Details

Summary

While further investigating the reported performance degradations caused
by cwnd sometimes becoming zero during PRR loss recovery, found two subtle
bugs. One was due to an implicit typecast from int to uint by the
in-kernel max() macro. The other an oversight in the hand-coded
implementation of a CEILING() division, where a macro "howmany()" exists,
which is performing an integer-ceiling division.

Further enhanced the readability by using the appropriate, correct type
imax/imin functions, for the PRR calculation match the pseudocode.

Also changed the temporary variables from long to int, as TCP generally
only used 32 bit sequence space - and thus cwnd.

  • address second instance of cwnd potentially becoming zero
  • fix sublte bug due to implicit int to uint typecase in max()
  • fix bug due to typo in hand-coded CEILING() function by using howmany() macro
  • use int instead of long
  • replace if conditionals with easier to read imax/imin (as in pseudocode)...

Diff Detail

Repository
rG FreeBSD src repository
Lint
Automatic diff as part of commit; lint not applicable.
Unit
Automatic diff as part of commit; unit tests not applicable.