2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-31 06:15:47 +00:00

netdev-linux: Use speed as max rate in tc classes.

Instead of relying on feature bits, use the speed value directly as
maximum rate for htb and hfsc classes.

There is still a limitation with the maximum rate that we can express
with a 32-bit number in bytes/s (~ 34.3Gbps), but using the actual link speed
instead of the feature bits, we can at least use an accurate maximum for
some link speeds (such as 25Gbps) which are not supported by netdev's feature
bits.

Acked-by: Eelco Chaudron <echaudro@redhat.com>
Signed-off-by: Adrian Moreno <amorenoz@redhat.com>
Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
This commit is contained in:
Adrian Moreno
2023-07-17 10:08:12 +02:00
committed by Ilya Maximets
parent 6240c0b4c8
commit b8f8fad864

View File

@@ -4781,18 +4781,16 @@ htb_parse_tcmsg__(struct ofpbuf *tcmsg, unsigned int *queue_id,
}
static void
htb_parse_qdisc_details__(struct netdev *netdev_,
const struct smap *details, struct htb_class *hc)
htb_parse_qdisc_details__(struct netdev *netdev, const struct smap *details,
struct htb_class *hc)
{
struct netdev_linux *netdev = netdev_linux_cast(netdev_);
hc->max_rate = smap_get_ullong(details, "max-rate", 0) / 8;
if (!hc->max_rate) {
enum netdev_features current;
uint32_t current_speed;
netdev_linux_read_features(netdev);
current = !netdev->get_features_error ? netdev->current : 0;
hc->max_rate = netdev_features_to_bps(current, NETDEV_DEFAULT_BPS) / 8;
netdev_get_speed(netdev, &current_speed, NULL);
hc->max_rate = current_speed ? current_speed / 8 * 1000000ULL
: NETDEV_DEFAULT_BPS / 8;
}
hc->min_rate = hc->max_rate;
hc->burst = 0;
@@ -5253,18 +5251,16 @@ hfsc_query_class__(const struct netdev *netdev, unsigned int handle,
}
static void
hfsc_parse_qdisc_details__(struct netdev *netdev_, const struct smap *details,
hfsc_parse_qdisc_details__(struct netdev *netdev, const struct smap *details,
struct hfsc_class *class)
{
struct netdev_linux *netdev = netdev_linux_cast(netdev_);
uint32_t max_rate = smap_get_ullong(details, "max-rate", 0) / 8;
if (!max_rate) {
enum netdev_features current;
uint32_t current_speed;
netdev_linux_read_features(netdev);
current = !netdev->get_features_error ? netdev->current : 0;
max_rate = netdev_features_to_bps(current, NETDEV_DEFAULT_BPS) / 8;
netdev_get_speed(netdev, &current_speed, NULL);
max_rate = current_speed ? current_speed / 8 * 1000000ULL
: NETDEV_DEFAULT_BPS / 8;
}
class->min_rate = max_rate;