On Wed, Aug 27, 2025 at 10:42 PM Lorenzo Bianconi <
lorenzo.bianc...@redhat.com> wrote:

> Introduce I-P for logical switch creation in en_northd node.
> This series is based on top of the following series:
>
> https://patchwork.ozlabs.org/project/ovn/cover/20250718161451.1764420-1-mmich...@redhat.com/
>
> Changes since in v5:
> - Fix commit logs
> - Improve dynamic_bitmap APIs
> - rebase on top of ovn main branch
>
> Changes since in v4:
> - Use dynamic_bitmap to track used ovn_datapath index
> - Convert codebase to vector lib
>
> Changes since in v3:
> - Introduce manage LS deletion incrementally
> - Reduce code duplication
>
> Lorenzo Bianconi (3):
>   northd: Introduce dynamic_bitmap struct.
>   northd: Convert datapath array into vector.
>   northd: I-P for logical switch creation/deletion in en_northd.
>
> Numan Siddique (2):
>   northd: Reallocate LB nb_lr_map/nb_ls_map if needed.
>   northd: I-P for logical switch creation/deletation in en_ls_stateful
>     engine node.
>
>  lib/ovn-util.h           |  79 +++++++++
>  northd/en-lflow.c        |   4 +
>  northd/en-lr-stateful.c  |   8 +-
>  northd/en-ls-stateful.c  |  45 +++++-
>  northd/en-ls-stateful.h  |   4 +-
>  northd/en-multicast.c    |   4 +
>  northd/en-sync-sb.c      |  27 ++--
>  northd/inc-proc-northd.c |   5 +-
>  northd/lb.c              |  36 ++---
>  northd/lb.h              |  27 ++--
>  northd/lflow-mgr.c       |   8 +-
>  northd/northd.c          | 334 +++++++++++++++++++++++++++++----------
>  northd/northd.h          |  24 ++-
>  tests/ovn-northd.at      |  61 +++++++
>  14 files changed, 524 insertions(+), 142 deletions(-)
>
> --
> 2.50.1
>
>
Hi Lorenzo,

the API could still use some changes, I would suggest the below
diff for v6. WDYT?

diff --git a/lib/ovn-util.h b/lib/ovn-util.h
index 3a43227d4..888fa6b32 100644
--- a/lib/ovn-util.h
+++ b/lib/ovn-util.h
@@ -537,13 +537,13 @@ dynamic_bitmap_is_empty(const struct dynamic_bitmap
*db)
 }

 static inline int
-dynamic_bitmap_get_n_elems(const struct dynamic_bitmap *db, size_t size)
+dynamic_bitmap_get_n_elems(const struct dynamic_bitmap *db)
 {
-    return bitmap_count1(db->map, size);
+    return db->n_elems;
 }

 static inline void
-dynamic_bitmap_set_elem(struct dynamic_bitmap *db, int index)
+dynamic_bitmap_set1(struct dynamic_bitmap *db, int index)
 {
     ovs_assert(index < db->capacity);
     if (!bitmap_is_set(db->map, index)) {
@@ -552,14 +552,30 @@ dynamic_bitmap_set_elem(struct dynamic_bitmap *db,
int index)
     }
 }

+static inline void
+dynamic_bitmap_set0(struct dynamic_bitmap *db, int index)
+{
+    ovs_assert(index < db->capacity);
+    if (bitmap_is_set(db->map, index)) {
+        bitmap_set0(db->map, index);
+        db->n_elems--;
+    }
+}
+
 static inline unsigned long *
-dynamic_bitmap_clone_map(struct dynamic_bitmap *db, size_t size)
+dynamic_bitmap_clone_map(struct dynamic_bitmap *db)
+{
+    return bitmap_clone(db->map, db->capacity);
+}
+
+static inline size_t
+dynamic_bitmap_scan(struct dynamic_bitmap *dp, bool target, size_t start)
 {
-    return bitmap_clone(db->map, size);
+    return bitmap_scan(dp->map, target, start, dp->capacity);
 }

-#define DYNAMIC_BITMAP_FOR_EACH_1(IDX, SIZE, MAP)   \
-        BITMAP_FOR_EACH_1(IDX, SIZE, (MAP)->map)
+#define DYNAMIC_BITMAP_FOR_EACH_1(IDX, MAP)   \
+    BITMAP_FOR_EACH_1 (IDX, (MAP)->capacity, (MAP)->map)

 /* Utilities around properly handling exit command. */
 struct ovn_exit_args {
diff --git a/northd/en-lr-stateful.c b/northd/en-lr-stateful.c
index 008852ae6..c80a49819 100644
--- a/northd/en-lr-stateful.c
+++ b/northd/en-lr-stateful.c
@@ -251,8 +251,7 @@ lr_stateful_lb_data_handler(struct engine_node *node,
void *data_)
         ovs_assert(lb_dps);

         size_t index;
-        DYNAMIC_BITMAP_FOR_EACH_1 (index,
ods_size(input_data.lr_datapaths),
-                                   &lb_dps->nb_lr_map) {
+        DYNAMIC_BITMAP_FOR_EACH_1 (index, &lb_dps->nb_lr_map) {
             const struct ovn_datapath *od =
                 ovn_datapaths_find_by_index(input_data.lr_datapaths,
index);

diff --git a/northd/lb.c b/northd/lb.c
index 0e4456098..d67131508 100644
--- a/northd/lb.c
+++ b/northd/lb.c
@@ -655,7 +655,7 @@ ovn_lb_datapaths_add_lr(struct ovn_lb_datapaths
*lb_dps, size_t n,
 {
     dynamic_bitmap_realloc(&lb_dps->nb_lr_map, n_lr_datapaths);
     for (size_t i = 0; i < n; i++) {
-        dynamic_bitmap_set_elem(&lb_dps->nb_lr_map, ods[i]->index);
+        dynamic_bitmap_set1(&lb_dps->nb_lr_map, ods[i]->index);
     }
 }

@@ -666,7 +666,7 @@ ovn_lb_datapaths_add_ls(struct ovn_lb_datapaths
*lb_dps, size_t n,
 {
     dynamic_bitmap_realloc(&lb_dps->nb_ls_map, n_ls_datapaths);
     for (size_t i = 0; i < n; i++) {
-        dynamic_bitmap_set_elem(&lb_dps->nb_ls_map, ods[i]->index);
+        dynamic_bitmap_set1(&lb_dps->nb_ls_map, ods[i]->index);
     }
 }

diff --git a/northd/northd.c b/northd/northd.c
index b8af59c75..236f57fc1 100644
--- a/northd/northd.c
+++ b/northd/northd.c
@@ -853,9 +853,9 @@ ods_build_array_index(struct ovn_datapaths *datapaths)
      * doesn't matter if they are different on every iteration. */
     struct ovn_datapath *od;
     HMAP_FOR_EACH (od, key_node, &datapaths->datapaths) {
-        size_t index = bitmap_scan(datapaths->dps_index_map.map, 0, 0,
-                                   datapaths->dps_index_map.capacity);
-        dynamic_bitmap_set_elem(&datapaths->dps_index_map, index);
+        size_t index =
+            dynamic_bitmap_scan(&datapaths->dps_index_map, false, 0);
+        dynamic_bitmap_set1(&datapaths->dps_index_map, index);
         od->index = index;
         vector_push(&datapaths->dps, &od);
         od->datapaths = datapaths;
@@ -868,16 +868,14 @@ ods_assign_array_index(struct ovn_datapaths
*datapaths,
 {
     dynamic_bitmap_realloc(&datapaths->dps_index_map,
                            vector_len(&datapaths->dps) + 1);
-    size_t index = bitmap_scan(datapaths->dps_index_map.map, 0, 0,
-                               datapaths->dps_index_map.capacity);
+    size_t index = dynamic_bitmap_scan(&datapaths->dps_index_map, false,
0);
     if (index < vector_len(&datapaths->dps)) {
         /* We can reuse stale vector entries. */
         vector_get(&datapaths->dps, index, struct ovn_datapath *) = od;
     } else {
         vector_insert(&datapaths->dps, index, &od);
     }
-    bitmap_set1(datapaths->dps_index_map.map, index);
-    datapaths->dps_index_map.n_elems++;
+    dynamic_bitmap_set1(&datapaths->dps_index_map, index);
     od->datapaths = datapaths;
     od->index = index;
 }
@@ -3441,8 +3449,7 @@ build_lswitch_lbs_from_lrouter(struct ovn_datapaths
*lr_datapaths,
     size_t index;

     HMAP_FOR_EACH (lb_dps, hmap_node, lb_dps_map) {
-        DYNAMIC_BITMAP_FOR_EACH_1 (index, ods_size(lr_datapaths),
-                                   &lb_dps->nb_lr_map) {
+        DYNAMIC_BITMAP_FOR_EACH_1 (index, &lb_dps->nb_lr_map) {
             struct ovn_datapath *od = vector_get(&lr_datapaths->dps, index,
                                                  struct ovn_datapath *);
             ovn_lb_datapaths_add_ls(lb_dps, vector_len(&od->ls_peers),
@@ -3472,17 +3479,15 @@ build_lswitch_lbs_from_lrouter(struct ovn_datapaths
*lr_datapaths,
 }

 static void
-build_lb_count_dps(struct hmap *lb_dps_map,
-                   size_t n_ls_datapaths,
-                   size_t n_lr_datapaths)
+build_lb_count_dps(struct hmap *lb_dps_map)
 {
     struct ovn_lb_datapaths *lb_dps;

     HMAP_FOR_EACH (lb_dps, hmap_node, lb_dps_map) {
-        lb_dps->nb_lr_map.n_elems = dynamic_bitmap_get_n_elems(
-                &lb_dps->nb_lr_map, n_lr_datapaths);
-        lb_dps->nb_ls_map.n_elems = dynamic_bitmap_get_n_elems(
-                &lb_dps->nb_ls_map, n_ls_datapaths);
+        lb_dps->nb_lr_map.n_elems =
+            dynamic_bitmap_get_n_elems(&lb_dps->nb_lr_map);
+        lb_dps->nb_ls_map.n_elems =
+            dynamic_bitmap_get_n_elems(&lb_dps->nb_ls_map);
     }
 }

@@ -4734,8 +4739,7 @@ northd_handle_ls_changes(struct ovsdb_idl_txn
*ovnsb_idl_txn,
         hmap_remove(&nd->ls_datapaths.datapaths, &od->key_node);
         vector_get(&nd->ls_datapaths.dps, od->index,
                    struct ovn_datapath *) = NULL;
-        bitmap_set0(nd->ls_datapaths.dps_index_map.map, od->index);
-        nd->ls_datapaths.dps_index_map.n_elems--;
+        dynamic_bitmap_set0(&nd->ls_datapaths.dps_index_map, od->index);

         const struct sbrec_ip_multicast *ip_mcast =
             ip_mcast_lookup(ni->sbrec_ip_mcast_by_dp, od->sdp->sb_dp);
@@ -5153,8 +5157,7 @@ northd_handle_lb_data_changes(struct tracked_lb_data
*trk_lb_data,
         ovs_assert(lb_dps);

         size_t index;
-        DYNAMIC_BITMAP_FOR_EACH_1 (index, ods_size(ls_datapaths),
-                                   &lb_dps->nb_ls_map) {
+        DYNAMIC_BITMAP_FOR_EACH_1 (index, &lb_dps->nb_ls_map) {
             od = vector_get(&ls_datapaths->dps, index, struct ovn_datapath
*);

             /* Add the ls datapath to the northd tracked data. */
@@ -8232,10 +8235,8 @@ build_lb_rules(struct lflow_table *lflows, struct
ovn_lb_datapaths *lb_dps,
         if (reject) {
             size_t index;

-            dp_non_meter = dynamic_bitmap_clone_map(&lb_dps->nb_ls_map,
-
 ods_size(ls_datapaths));
-            DYNAMIC_BITMAP_FOR_EACH_1 (index, ods_size(ls_datapaths),
-                                       &lb_dps->nb_ls_map) {
+            dp_non_meter = dynamic_bitmap_clone_map(&lb_dps->nb_ls_map);
+            DYNAMIC_BITMAP_FOR_EACH_1 (index, &lb_dps->nb_ls_map) {
                 struct ovn_datapath *od = vector_get(&ls_datapaths->dps,
index,
                                                      struct ovn_datapath
*);

@@ -12379,7 +12380,7 @@ build_lrouter_nat_flows_for_lb(
     size_t index;
     bool use_stateless_nat = smap_get_bool(&lb->nlb->options,
                                            "use_stateless_nat", false);
-    DYNAMIC_BITMAP_FOR_EACH_1 (index, bitmap_len, &lb_dps->nb_lr_map) {
+    DYNAMIC_BITMAP_FOR_EACH_1 (index, &lb_dps->nb_lr_map) {
         struct ovn_datapath *od = vector_get(&lr_datapaths->dps, index,
                                              struct ovn_datapath *);
         enum lrouter_nat_lb_flow_type type;
@@ -12479,8 +12480,7 @@ build_lswitch_flows_for_lb(struct ovn_lb_datapaths
*lb_dps,
         }

         size_t index;
-        DYNAMIC_BITMAP_FOR_EACH_1 (index, ods_size(ls_datapaths),
-                                   &lb_dps->nb_ls_map) {
+        DYNAMIC_BITMAP_FOR_EACH_1 (index, &lb_dps->nb_ls_map) {
             struct ovn_datapath *od = vector_get(&ls_datapaths->dps, index,
                                                  struct ovn_datapath *);

@@ -12559,7 +12559,7 @@ build_lrouter_allow_vip_traffic_template(struct
lflow_table *lflows,
     struct ds match = DS_EMPTY_INITIALIZER;

     size_t index;
-    DYNAMIC_BITMAP_FOR_EACH_1 (index, ods_size(lr_dps),
&lb_dps->nb_lr_map) {
+    DYNAMIC_BITMAP_FOR_EACH_1 (index, &lb_dps->nb_lr_map) {
         struct ovn_datapath *od = vector_get(&lr_dps->dps, index,
                                              struct ovn_datapath *);
         /* Do not drop ip traffic with destination the template VIP. */
@@ -12606,8 +12606,7 @@ build_lrouter_flows_for_lb(struct ovn_lb_datapaths
*lb_dps,
             continue;
         }

-        DYNAMIC_BITMAP_FOR_EACH_1 (index, ods_size(lr_datapaths),
-                                   &lb_dps->nb_lr_map) {
+        DYNAMIC_BITMAP_FOR_EACH_1 (index, &lb_dps->nb_lr_map) {
             struct ovn_datapath *od = vector_get(&lr_datapaths->dps, index,
                                                  struct ovn_datapath *);
             ovn_lflow_add_with_hint__(lflows, od, S_ROUTER_IN_DNAT,
@@ -12621,8 +12620,7 @@ build_lrouter_flows_for_lb(struct ovn_lb_datapaths
*lb_dps,
     }

     if (lb->skip_snat) {
-        DYNAMIC_BITMAP_FOR_EACH_1 (index, ods_size(lr_datapaths),
-                                   &lb_dps->nb_lr_map) {
+        DYNAMIC_BITMAP_FOR_EACH_1 (index, &lb_dps->nb_lr_map) {
             struct ovn_datapath *od = vector_get(&lr_datapaths->dps, index,
                                                  struct ovn_datapath *);
             ovn_lflow_add(lflows, od, S_ROUTER_OUT_SNAT, 120,
@@ -19344,9 +19354,7 @@ ovnnb_db_run(struct northd_input *input_data,
         &data->lb_datapaths_map, &data->lb_group_datapaths_map,
         &data->svc_monitor_lsps, &data->local_svc_monitors_map,
         input_data->ic_learned_svc_monitors_map);
-    build_lb_count_dps(&data->lb_datapaths_map,
-                       ods_size(&data->ls_datapaths),
-                       ods_size(&data->lr_datapaths));
+    build_lb_count_dps(&data->lb_datapaths_map);
     build_ipam(&data->ls_datapaths.datapaths);
     build_lrouter_groups(&data->lr_ports, &data->lr_datapaths);
     build_ip_mcast(ovnsb_txn, input_data->sbrec_ip_multicast_table,


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

Reply via email to