> 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?
Hi Ales, sure I am fine with them. I will post v6 with these fixes. Regards, Lorenzo > > 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