In order to avoid possible queue_id clash when we have a localnet and a
LSP ports on the same hv, make QoS queue_id allocation global for the
ovn cluster.

Acked-by: Numan Siddique <num...@ovn.org>
Signed-off-by: Lorenzo Bianconi <lorenzo.bianc...@redhat.com>
---
 northd/northd.c | 127 ++++++++----------------------------------------
 1 file changed, 20 insertions(+), 107 deletions(-)

diff --git a/northd/northd.c b/northd/northd.c
index 470f76809..c107fe33a 100644
--- a/northd/northd.c
+++ b/northd/northd.c
@@ -469,94 +469,20 @@ build_chassis_features(const struct sbrec_chassis_table 
*sbrec_chassis_table,
         }
     }
 }
-
-struct ovn_chassis_qdisc_queues {
-    struct hmap_node key_node;
-    uint32_t queue_id;
-    struct uuid chassis_uuid;
-};
 
 static uint32_t
-hash_chassis_queue(const struct uuid *chassis_uuid, uint32_t queue_id)
-{
-    return hash_2words(uuid_hash(chassis_uuid), queue_id);
-}
-
-static void
-destroy_chassis_queues(struct hmap *set)
-{
-    struct ovn_chassis_qdisc_queues *node;
-    HMAP_FOR_EACH_POP (node, key_node, set) {
-        free(node);
-    }
-    hmap_destroy(set);
-}
-
-static void
-add_chassis_queue(struct hmap *set, const struct uuid *chassis_uuid,
-                  uint32_t queue_id)
+allocate_queueid(unsigned long *queue_id_bitmap)
 {
-    struct ovn_chassis_qdisc_queues *node = xmalloc(sizeof *node);
-    node->queue_id = queue_id;
-    node->chassis_uuid = *chassis_uuid;
-    hmap_insert(set, &node->key_node,
-                hash_chassis_queue(chassis_uuid, queue_id));
-}
-
-static bool
-chassis_queueid_in_use(const struct hmap *set, const struct uuid *chassis_uuid,
-                       uint32_t queue_id)
-{
-    const struct ovn_chassis_qdisc_queues *node;
-    HMAP_FOR_EACH_WITH_HASH (node, key_node,
-                             hash_chassis_queue(chassis_uuid, queue_id), set) {
-        if (uuid_equals(chassis_uuid, &node->chassis_uuid)
-            && node->queue_id == queue_id) {
-            return true;
-        }
-    }
-    return false;
-}
-
-static uint32_t
-allocate_chassis_queueid(struct hmap *set, const struct uuid *uuid, char *name)
-{
-    if (!uuid) {
+    uint32_t queue_id = bitmap_scan(queue_id_bitmap, 0, 1,
+                                    QDISC_MAX_QUEUE_ID + 1);
+    if (queue_id == QDISC_MAX_QUEUE_ID + 1) {
+        static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
+        VLOG_WARN_RL(&rl, "all queue ids exhausted");
         return 0;
     }
+    bitmap_set1(queue_id_bitmap, queue_id);
 
-    for (uint32_t queue_id = QDISC_MIN_QUEUE_ID + 1;
-         queue_id <= QDISC_MAX_QUEUE_ID;
-         queue_id++) {
-        if (!chassis_queueid_in_use(set, uuid, queue_id)) {
-            add_chassis_queue(set, uuid, queue_id);
-            return queue_id;
-        }
-    }
-
-    static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 1);
-    VLOG_WARN_RL(&rl, "all %s queue ids exhausted", name);
-    return 0;
-}
-
-static void
-free_chassis_queueid(struct hmap *set, const struct uuid *uuid,
-                     uint32_t queue_id)
-{
-    if (!uuid) {
-        return;
-    }
-
-    struct ovn_chassis_qdisc_queues *node;
-    HMAP_FOR_EACH_WITH_HASH (node, key_node,
-                             hash_chassis_queue(uuid, queue_id), set) {
-        if (uuid_equals(uuid, &node->chassis_uuid)
-            && node->queue_id == queue_id) {
-            hmap_remove(set, &node->key_node);
-            free(node);
-            break;
-        }
-    }
+    return queue_id;
 }
 
 static inline bool
@@ -2472,7 +2398,7 @@ tag_alloc_create_new_tag(struct hmap *tag_alloc_table,
 static void
 join_logical_ports(const struct sbrec_port_binding_table *sbrec_pb_table,
                    struct hmap *ls_datapaths, struct hmap *lr_datapaths,
-                   struct hmap *ports, struct hmap *chassis_qdisc_queues,
+                   struct hmap *ports, unsigned long *queue_id_bitmap,
                    struct hmap *tag_alloc_table, struct ovs_list *sb_only,
                    struct ovs_list *nb_only, struct ovs_list *both)
 {
@@ -2537,11 +2463,8 @@ join_logical_ports(const struct sbrec_port_binding_table 
*sbrec_pb_table,
 
                     uint32_t queue_id = smap_get_int(&op->sb->options,
                                                      "qdisc_queue_id", 0);
-                    if (queue_id && op->sb->chassis) {
-                        add_chassis_queue(
-                             chassis_qdisc_queues,
-                             &op->sb->chassis->header_.uuid,
-                             queue_id);
+                    if (queue_id) {
+                        bitmap_set1(queue_id_bitmap, queue_id);
                     }
 
                     ovs_list_push_back(both, &op->list);
@@ -3359,7 +3282,7 @@ ovn_port_update_sbrec(struct ovsdb_idl_txn *ovnsb_txn,
                       struct ovsdb_idl_index *sbrec_ha_chassis_grp_by_name,
                       const struct sbrec_mirror_table *sbrec_mirror_table,
                       const struct ovn_port *op,
-                      struct hmap *chassis_qdisc_queues,
+                      unsigned long *queue_id_bitmap,
                       struct sset *active_ha_chassis_grps)
 {
     sbrec_port_binding_set_datapath(op->sb, op->od->sb);
@@ -3484,23 +3407,12 @@ ovn_port_update_sbrec(struct ovsdb_idl_txn *ovnsb_txn,
             uint32_t queue_id = smap_get_int(
                     &op->sb->options, "qdisc_queue_id", 0);
             bool has_qos = port_has_qos_params(&op->nbsp->options);
-            const struct uuid *uuid = NULL;
             struct smap options;
-            char *name = "";
-
-            if (lsp_is_localnet(op->nbsp)) {
-                uuid = &op->sb->header_.uuid;
-                name = "localnet";
-            } else if (op->sb->chassis) {
-                uuid = &op->sb->chassis->header_.uuid;
-                name = op->sb->chassis->name;
-            }
 
             if (has_qos && !queue_id) {
-                queue_id = allocate_chassis_queueid(chassis_qdisc_queues,
-                                                    uuid, name);
+                queue_id = allocate_queueid(queue_id_bitmap);
             } else if (!has_qos && queue_id) {
-                free_chassis_queueid(chassis_qdisc_queues, uuid, queue_id);
+                bitmap_set0(queue_id_bitmap, queue_id);
                 queue_id = 0;
             }
 
@@ -4678,7 +4590,8 @@ build_ports(struct ovsdb_idl_txn *ovnsb_txn,
 {
     struct ovs_list sb_only, nb_only, both;
     struct hmap tag_alloc_table = HMAP_INITIALIZER(&tag_alloc_table);
-    struct hmap chassis_qdisc_queues = HMAP_INITIALIZER(&chassis_qdisc_queues);
+    unsigned long *queue_id_bitmap = bitmap_allocate(QDISC_MAX_QUEUE_ID + 1);
+    bitmap_set1(queue_id_bitmap, 0);
 
     /* sset which stores the set of ha chassis group names used. */
     struct sset active_ha_chassis_grps =
@@ -4688,7 +4601,7 @@ build_ports(struct ovsdb_idl_txn *ovnsb_txn,
      * We will split them later. */
     struct hmap *ports = ls_ports;
     join_logical_ports(sbrec_port_binding_table, ls_datapaths, lr_datapaths,
-                       ports, &chassis_qdisc_queues,
+                       ports, queue_id_bitmap,
                        &tag_alloc_table, &sb_only, &nb_only, &both);
 
     /* Purge stale Mac_Bindings if ports are deleted. */
@@ -4736,7 +4649,7 @@ build_ports(struct ovsdb_idl_txn *ovnsb_txn,
                               sbrec_chassis_by_hostname,
                               sbrec_ha_chassis_grp_by_name,
                               sbrec_mirror_table,
-                              op, &chassis_qdisc_queues,
+                              op, queue_id_bitmap,
                               &active_ha_chassis_grps);
     }
 
@@ -4747,7 +4660,7 @@ build_ports(struct ovsdb_idl_txn *ovnsb_txn,
                               sbrec_chassis_by_hostname,
                               sbrec_ha_chassis_grp_by_name,
                               sbrec_mirror_table,
-                              op, &chassis_qdisc_queues,
+                              op, queue_id_bitmap,
                               &active_ha_chassis_grps);
         sbrec_port_binding_set_logical_port(op->sb, op->key);
     }
@@ -4776,7 +4689,7 @@ build_ports(struct ovsdb_idl_txn *ovnsb_txn,
     }
 
     tag_alloc_destroy(&tag_alloc_table);
-    destroy_chassis_queues(&chassis_qdisc_queues);
+    bitmap_free(queue_id_bitmap);
     cleanup_sb_ha_chassis_groups(sbrec_ha_chassis_group_table,
                                  &active_ha_chassis_grps);
     sset_destroy(&active_ha_chassis_grps);
-- 
2.40.1

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to