diff mbox series

[ovs-dev,v4,2/7] netdev-linux: use speed as max rate in tc classes

Message ID 20230717080836.1456756-3-amorenoz@redhat.com
State Accepted
Commit b8f8fad8643518551cf742056ae8728c936674c6
Headers show
Series Improve linux QoS for exotic and fast links | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_Build_and_Test success github build: passed
ovsrobot/intel-ovs-compilation success test: success

Commit Message

Adrián Moreno July 17, 2023, 8:08 a.m. UTC
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.

Signed-off-by: Adrian Moreno <amorenoz@redhat.com>
---
 lib/netdev-linux.c | 26 +++++++++++---------------
 1 file changed, 11 insertions(+), 15 deletions(-)

Comments

Eelco Chaudron July 17, 2023, 1:59 p.m. UTC | #1
On 17 Jul 2023, at 10:08, Adrian Moreno wrote:

> 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.
>
> Signed-off-by: Adrian Moreno <amorenoz@redhat.com>

Thanks for also fixing this patch!! This will conclude the reviews as all patches should now have my ack!

Cheers,

Eelco

Acked-by: Eelco Chaudron <echaudro@redhat.com>
diff mbox series

Patch

diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c
index b5fd99874..6a0ae7d45 100644
--- a/lib/netdev-linux.c
+++ b/lib/netdev-linux.c
@@ -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;