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