Skip to content

Commit

Permalink
netdev-linux: Fix ingress policing burst rate configuration via tc
Browse files Browse the repository at this point in the history
The tc_police structure was filled with a value calculated in bits
instead of bytes while bytes were expected. This led the setting
of an x8 higher burst value.

Documentation and defaults have been corrected accordingly to minimize
nuisances on users sticking to the defaults.

The suggested burst value is now 80% of policing rate to make sure
TCP works correctly.

Signed-off-by: Miguel Angel Ajo <majopela@redhat.com>
Tested-by: Miguel Angel Ajo <majopela@redhat.com>
Signed-off-by: Ben Pfaff <blp@ovn.org>
  • Loading branch information
mangelajo authored and blp committed Apr 21, 2016
1 parent f0ae4e6 commit 79abacc
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 13 deletions.
2 changes: 1 addition & 1 deletion FAQ.md
Original file line number Diff line number Diff line change
Expand Up @@ -1124,7 +1124,7 @@ A: A policing policy can be configured on an interface to drop packets
generate to 10Mbps:

ovs-vsctl set interface vif1.0 ingress_policing_rate=10000
ovs-vsctl set interface vif1.0 ingress_policing_burst=1000
ovs-vsctl set interface vif1.0 ingress_policing_burst=8000

Traffic policing can interact poorly with some network protocols and
can have surprising results. The "Ingress Policing" section of
Expand Down
14 changes: 4 additions & 10 deletions lib/netdev-linux.c
Original file line number Diff line number Diff line change
Expand Up @@ -2045,7 +2045,7 @@ netdev_linux_set_policing(struct netdev *netdev_,
int error;

kbits_burst = (!kbits_rate ? 0 /* Force to 0 if no rate specified. */
: !kbits_burst ? 1000 /* Default to 1000 kbits if 0. */
: !kbits_burst ? 8000 /* Default to 8000 kbits if 0. */
: kbits_burst); /* Stick with user-specified value. */

ovs_mutex_lock(&netdev->mutex);
Expand Down Expand Up @@ -4720,21 +4720,15 @@ tc_add_policer(struct netdev *netdev,
tc_police.mtu = mtu;
tc_fill_rate(&tc_police.rate, ((uint64_t) kbits_rate * 1000)/8, mtu);

/* The following appears wrong in two ways:
*
* - tc_bytes_to_ticks() should take "bytes" as quantity for both of its
* arguments (or at least consistently "bytes" as both or "bits" as
* both), but this supplies bytes for the first argument and bits for the
* second.
*
* - In networking a kilobit is usually 1000 bits but this uses 1024 bits.
/* The following appears wrong in one way: In networking a kilobit is
* usually 1000 bits but this uses 1024 bits.
*
* However if you "fix" those problems then "tc filter show ..." shows
* "125000b", meaning 125,000 bits, when OVS configures it for 1000 kbit ==
* 1,000,000 bits, whereas this actually ends up doing the right thing from
* tc's point of view. Whatever. */
tc_police.burst = tc_bytes_to_ticks(
tc_police.rate.rate, MIN(UINT32_MAX / 1024, kbits_burst) * 1024);
tc_police.rate.rate, MIN(UINT32_MAX / 1024, kbits_burst) * 1024 / 8);

tcmsg = tc_make_request(netdev, RTM_NEWTFILTER,
NLM_F_EXCL | NLM_F_CREATE, &request);
Expand Down
4 changes: 2 additions & 2 deletions vswitchd/vswitch.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2427,15 +2427,15 @@

<column name="ingress_policing_burst">
<p>Maximum burst size for data received on this interface, in kb. The
default burst size if set to <code>0</code> is 1000 kb. This value
default burst size if set to <code>0</code> is 8000 kbit. This value
has no effect if <ref column="ingress_policing_rate"/>
is <code>0</code>.</p>
<p>
Specifying a larger burst size lets the algorithm be more forgiving,
which is important for protocols like TCP that react severely to
dropped packets. The burst size should be at least the size of the
interface's MTU. Specifying a value that is numerically at least as
large as 10% of <ref column="ingress_policing_rate"/> helps TCP come
large as 80% of <ref column="ingress_policing_rate"/> helps TCP come
closer to achieving the full rate.
</p>
</column>
Expand Down

0 comments on commit 79abacc

Please sign in to comment.