Page MenuHomeFreeBSD

Address two incorrect calculations and enhance readability of PRR code
AcceptedPublic

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

Details

Reviewers
kbowling
tuexen
jtl
rgrimes
Group Reviewers
transport
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
rS FreeBSD src repository - subversion
Lint
Lint OK
Unit
No Unit Test Coverage
Build Status
Buildable 37211
Build 34100: arc lint + arc unit