[ovs-dev,v4,1/3] dpif-netdev: Add port/queue tiebreaker to rxq_cycle_sort.

Message ID 1511466117-27191-1-git-send-email-ktraynor@redhat.com
State New
Delegated to: Ian Stokes
Headers show
Series
  • [ovs-dev,v4,1/3] dpif-netdev: Add port/queue tiebreaker to rxq_cycle_sort.
Related show

Commit Message

Kevin Traynor Nov. 23, 2017, 7:41 p.m.
rxq_cycle_sort is used to compare rx queues by their measured number
of cycles. In the event that they are equal, 0 could be returned.
However, it is observed that returning 0 results in a different sort
order on Windows/Linux. This is ok in practice but it causes a unit
test failure for
"1007: PMD - pmd-cpu-mask/distribution of rx queues" when running
on different OS's.

In order to have a consistent sort result across multiple OS's,
introduce a tiebreaker of port/queue.

Fixes: 655856ef39b9 ("dpif-netdev: Change rxq_scheduling to use rxq processing cycles.")
Reported-by: Alin Gabriel Serdean <aserdean@ovn.org>
Tested-by: Alin Gabriel Serdean <aserdean@ovn.org>
Co-authored-by: Ilya Maximets <i.maximets@samsung.com>
Signed-off-by: Ilya Maximets <i.maximets@samsung.com>
Signed-off-by: Kevin Traynor <ktraynor@redhat.com>
---

V4: Added patch into series after Alin tested it as RFC

 lib/dpif-netdev.c | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

Patch

diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index 0a62630..f5cdd92 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -3464,8 +3464,17 @@  rxq_cycle_sort(const void *a, const void *b)
     dp_netdev_rxq_set_cycles(qb, RXQ_CYCLES_PROC_HIST, total_qb);
 
-    if (total_qa >= total_qb) {
-        return -1;
+    if (total_qa != total_qb) {
+        return (total_qa < total_qb) ? 1 : -1;
+    } else {
+        /* Cycles are the same so tiebreak on port/queue id.
+         * Tiebreaking (as opposed to return 0) ensures consistent
+         * sort results across multiple OS's. */
+        if (qa->port->port_no != qb->port->port_no) {
+            return (qa->port->port_no > qb->port->port_no) ? 1 : -1;
+        } else {
+            return netdev_rxq_get_queue_id(qa->rx)
+                    - netdev_rxq_get_queue_id(qb->rx);
+        }
     }
-    return 1;
 }