On Wed, Aug 20, 2025 at 06:55:22PM +0200, Lorenzo Bianconi via dev wrote: > Reduce duplicated code between nb_ls_map and nb_lr_map. > > Acked-by: Mark Michelson <mmich...@redhat.com> > Signed-off-by: Lorenzo Bianconi <lorenzo.bianc...@redhat.com> > --- > northd/en-lr-stateful.c | 2 +- > northd/en-sync-sb.c | 24 ++++++++++--------- > northd/lb.c | 20 ++++++++-------- > northd/lb.h | 13 +++++++---- > northd/northd.c | 52 +++++++++++++++++++++++------------------ > 5 files changed, 62 insertions(+), 49 deletions(-) > > diff --git a/northd/en-lr-stateful.c b/northd/en-lr-stateful.c > index 56e93f3c4..58e90f2f2 100644 > --- a/northd/en-lr-stateful.c > +++ b/northd/en-lr-stateful.c > @@ -252,7 +252,7 @@ lr_stateful_lb_data_handler(struct engine_node *node, > void *data_) > > size_t index; > BITMAP_FOR_EACH_1 (index, ods_size(input_data.lr_datapaths), > - lb_dps->nb_lr_map) { > + lb_dps->nb_lr_map.map) { > const struct ovn_datapath *od = > ovn_datapaths_find_by_index(input_data.lr_datapaths, index); > > diff --git a/northd/en-sync-sb.c b/northd/en-sync-sb.c > index a111f14fd..343c76b54 100644 > --- a/northd/en-sync-sb.c > +++ b/northd/en-sync-sb.c > @@ -676,7 +676,7 @@ sb_lb_table_build_and_sync( > struct sb_lb_record *sb_lb; > > HMAP_FOR_EACH (lb_dps, hmap_node, lb_dps_map) { > - if (!lb_dps->n_nb_ls && !lb_dps->n_nb_lr) { > + if (!lb_dps->nb_ls_map.n_elems && !lb_dps->nb_lr_map.n_elems) { > continue; > } > > @@ -754,10 +754,10 @@ sync_sb_lb_record(struct sb_lb_record *sb_lb, > sbrec_lr_dp_group = sbrec_lb->lr_datapath_group; > } > > - if (lb_dps->n_nb_ls) { > + if (lb_dps->nb_ls_map.n_elems) { > sb_lb->ls_dpg = ovn_dp_group_get(&sb_lbs->ls_dp_groups, > - lb_dps->n_nb_ls, > - lb_dps->nb_ls_map, > + lb_dps->nb_ls_map.n_elems, > + lb_dps->nb_ls_map.map, > ods_size(ls_datapaths)); > if (sb_lb->ls_dpg) { > /* Update the dpg's sb dp_group. */ > @@ -787,7 +787,7 @@ sync_sb_lb_record(struct sb_lb_record *sb_lb, > } else { > sb_lb->ls_dpg = ovn_dp_group_create( > ovnsb_txn, &sb_lbs->ls_dp_groups, sbrec_ls_dp_group, > - lb_dps->n_nb_ls, lb_dps->nb_ls_map, > + lb_dps->nb_ls_map.n_elems, lb_dps->nb_ls_map.map, > ods_size(ls_datapaths), true, > ls_datapaths, lr_datapaths); > } > @@ -809,10 +809,10 @@ sync_sb_lb_record(struct sb_lb_record *sb_lb, > } > > > - if (lb_dps->n_nb_lr) { > + if (lb_dps->nb_lr_map.n_elems) { > sb_lb->lr_dpg = ovn_dp_group_get(&sb_lbs->lr_dp_groups, > - lb_dps->n_nb_lr, > - lb_dps->nb_lr_map, > + lb_dps->nb_lr_map.n_elems, > + lb_dps->nb_lr_map.map, > ods_size(lr_datapaths)); > if (sb_lb->lr_dpg) { > /* Update the dpg's sb dp_group. */ > @@ -842,7 +842,7 @@ sync_sb_lb_record(struct sb_lb_record *sb_lb, > } else { > sb_lb->lr_dpg = ovn_dp_group_create( > ovnsb_txn, &sb_lbs->lr_dp_groups, sbrec_lr_dp_group, > - lb_dps->n_nb_lr, lb_dps->nb_lr_map, > + lb_dps->nb_lr_map.n_elems, lb_dps->nb_lr_map.map, > ods_size(lr_datapaths), false, > ls_datapaths, lr_datapaths); > } > @@ -919,7 +919,8 @@ sync_changed_lbs(struct sb_lb_table *sb_lbs, > > sb_lb = sb_lb_table_find(&sb_lbs->entries, nb_uuid); > > - if (!sb_lb && !lb_dps->n_nb_ls && !lb_dps->n_nb_lr) { > + if (!sb_lb && !lb_dps->nb_ls_map.n_elems && > + !lb_dps->nb_lr_map.n_elems) { > continue; > } > > @@ -933,7 +934,8 @@ sync_changed_lbs(struct sb_lb_table *sb_lbs, > sbrec_load_balancer_table_get_for_uuid(sb_lb_table, nb_uuid); > } > > - if (sb_lb && !lb_dps->n_nb_ls && !lb_dps->n_nb_lr) { > + if (sb_lb && !lb_dps->nb_ls_map.n_elems && > + !lb_dps->nb_lr_map.n_elems) { > const struct sbrec_load_balancer *sbrec_lb = > sbrec_load_balancer_table_get_for_uuid(sb_lb_table, nb_uuid); > if (sbrec_lb) { > diff --git a/northd/lb.c b/northd/lb.c > index 30726cd27..9ce9f7bc9 100644 > --- a/northd/lb.c > +++ b/northd/lb.c > @@ -631,8 +631,8 @@ ovn_lb_datapaths_create(const struct ovn_northd_lb *lb, > size_t n_ls_datapaths, > { > struct ovn_lb_datapaths *lb_dps = xzalloc(sizeof *lb_dps); > lb_dps->lb = lb; > - lb_dps->nb_ls_map = bitmap_allocate(n_ls_datapaths); > - lb_dps->nb_lr_map = bitmap_allocate(n_lr_datapaths); > + lb_dps->nb_ls_map.map = bitmap_allocate(n_ls_datapaths); > + lb_dps->nb_lr_map.map = bitmap_allocate(n_lr_datapaths); > lb_dps->lflow_ref = lflow_ref_create(); > hmapx_init(&lb_dps->ls_lb_with_stateless_mode); > return lb_dps; > @@ -641,8 +641,8 @@ ovn_lb_datapaths_create(const struct ovn_northd_lb *lb, > size_t n_ls_datapaths, > void > ovn_lb_datapaths_destroy(struct ovn_lb_datapaths *lb_dps) > { > - bitmap_free(lb_dps->nb_lr_map); > - bitmap_free(lb_dps->nb_ls_map); > + bitmap_free(lb_dps->nb_lr_map.map); > + bitmap_free(lb_dps->nb_ls_map.map); > lflow_ref_destroy(lb_dps->lflow_ref); > hmapx_destroy(&lb_dps->ls_lb_with_stateless_mode); > free(lb_dps); > @@ -653,9 +653,9 @@ ovn_lb_datapaths_add_lr(struct ovn_lb_datapaths *lb_dps, > size_t n, > struct ovn_datapath **ods) > { > for (size_t i = 0; i < n; i++) { > - if (!bitmap_is_set(lb_dps->nb_lr_map, ods[i]->index)) { > - bitmap_set1(lb_dps->nb_lr_map, ods[i]->index); > - lb_dps->n_nb_lr++; > + if (!bitmap_is_set(lb_dps->nb_lr_map.map, ods[i]->index)) { > + bitmap_set1(lb_dps->nb_lr_map.map, ods[i]->index); > + lb_dps->nb_lr_map.n_elems++; > } > } > } > @@ -665,9 +665,9 @@ ovn_lb_datapaths_add_ls(struct ovn_lb_datapaths *lb_dps, > size_t n, > struct ovn_datapath **ods) > { > for (size_t i = 0; i < n; i++) { > - if (!bitmap_is_set(lb_dps->nb_ls_map, ods[i]->index)) { > - bitmap_set1(lb_dps->nb_ls_map, ods[i]->index); > - lb_dps->n_nb_ls++; > + if (!bitmap_is_set(lb_dps->nb_ls_map.map, ods[i]->index)) { > + bitmap_set1(lb_dps->nb_ls_map.map, ods[i]->index); > + lb_dps->nb_ls_map.n_elems++; > } > } > } > diff --git a/northd/lb.h b/northd/lb.h > index a0e560204..1c03c3763 100644 > --- a/northd/lb.h > +++ b/northd/lb.h > @@ -138,15 +138,20 @@ void ovn_lb_group_reinit( > const struct hmap *lbs); > > struct lflow_ref; > + > +struct dynamic_bitmap { > + unsigned long *map; > + size_t n_elems; > + size_t capacity; > +}; > + > struct ovn_lb_datapaths { > struct hmap_node hmap_node; > > const struct ovn_northd_lb *lb; > - size_t n_nb_ls; > - unsigned long *nb_ls_map; > > - size_t n_nb_lr; > - unsigned long *nb_lr_map; > + struct dynamic_bitmap nb_ls_map; > + struct dynamic_bitmap nb_lr_map; > > struct hmapx ls_lb_with_stateless_mode; > > diff --git a/northd/northd.c b/northd/northd.c > index 015f30a35..2e1cce6d0 100644 > --- a/northd/northd.c > +++ b/northd/northd.c > @@ -3411,7 +3411,8 @@ build_lswitch_lbs_from_lrouter(struct ovn_datapaths > *lr_datapaths, > size_t index; > > HMAP_FOR_EACH (lb_dps, hmap_node, lb_dps_map) { > - BITMAP_FOR_EACH_1 (index, ods_size(lr_datapaths), lb_dps->nb_lr_map) > { > + BITMAP_FOR_EACH_1 (index, ods_size(lr_datapaths), > + lb_dps->nb_lr_map.map) { > struct ovn_datapath *od = lr_datapaths->array[index]; > ovn_lb_datapaths_add_ls(lb_dps, vector_len(&od->ls_peers), > vector_get_array(&od->ls_peers)); > @@ -3445,8 +3446,10 @@ 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->n_nb_lr = bitmap_count1(lb_dps->nb_lr_map, n_lr_datapaths); > - lb_dps->n_nb_ls = bitmap_count1(lb_dps->nb_ls_map, n_ls_datapaths); > + lb_dps->nb_lr_map.n_elems = bitmap_count1(lb_dps->nb_lr_map.map, > + n_lr_datapaths); > + lb_dps->nb_ls_map.n_elems = bitmap_count1(lb_dps->nb_ls_map.map, > + n_ls_datapaths); > } > } > > @@ -5007,7 +5010,7 @@ northd_handle_lb_data_changes(struct tracked_lb_data > *trk_lb_data, > > size_t index; > BITMAP_FOR_EACH_1 (index, ods_size(ls_datapaths), > - lb_dps->nb_ls_map) { > + lb_dps->nb_ls_map.map) { > od = ls_datapaths->array[index]; > > /* Add the ls datapath to the northd tracked data. */ > @@ -5141,7 +5144,7 @@ northd_handle_lb_data_changes(struct tracked_lb_data > *trk_lb_data, > ovs_assert(lb_dps); > size_t index; > BITMAP_FOR_EACH_1 (index, ods_size(ls_datapaths), > - lb_dps->nb_ls_map) { > + lb_dps->nb_ls_map.map) { > od = ls_datapaths->array[index]; > > /* Add the ls datapath to the northd tracked data. */ > @@ -7589,7 +7592,7 @@ build_lb_rules_pre_stateful(struct lflow_table *lflows, > const struct ovn_datapaths *ls_datapaths, > struct ds *match, struct ds *action) > { > - if (!lb_dps->n_nb_ls) { > + if (!lb_dps->nb_ls_map.n_elems) { > return; > } > > @@ -7630,7 +7633,7 @@ build_lb_rules_pre_stateful(struct lflow_table *lflows, > } > > ovn_lflow_add_with_dp_group( > - lflows, lb_dps->nb_ls_map, ods_size(ls_datapaths), > + lflows, lb_dps->nb_ls_map.map, ods_size(ls_datapaths), > S_SWITCH_IN_PRE_STATEFUL, 120, ds_cstr(match), ds_cstr(action), > &lb->nlb->header_, lb_dps->lflow_ref); > > @@ -7887,7 +7890,7 @@ build_lb_affinity_ls_flows(struct lflow_table *lflows, > const struct ovn_datapaths *ls_datapaths, > struct lflow_ref *lflow_ref) > { > - if (!lb_dps->lb->affinity_timeout || !lb_dps->n_nb_ls) { > + if (!lb_dps->lb->affinity_timeout || !lb_dps->nb_ls_map.n_elems) { > return; > } > > @@ -7909,7 +7912,7 @@ build_lb_affinity_ls_flows(struct lflow_table *lflows, > static char *aff_check = REGBIT_KNOWN_LB_SESSION" = chk_lb_aff(); next;"; > > ovn_lflow_add_with_dp_group( > - lflows, lb_dps->nb_ls_map, ods_size(ls_datapaths), > + lflows, lb_dps->nb_ls_map.map, ods_size(ls_datapaths), > S_SWITCH_IN_LB_AFF_CHECK, 100, ds_cstr(&new_lb_match), aff_check, > &lb_dps->lb->nlb->header_, lflow_ref); > ds_destroy(&new_lb_match); > @@ -7991,14 +7994,14 @@ build_lb_affinity_ls_flows(struct lflow_table *lflows, > > /* Forward to OFTABLE_CHK_LB_AFFINITY table to store flow tuple. */ > ovn_lflow_add_with_dp_group( > - lflows, lb_dps->nb_ls_map, ods_size(ls_datapaths), > + lflows, lb_dps->nb_ls_map.map, ods_size(ls_datapaths), > S_SWITCH_IN_LB_AFF_LEARN, 100, ds_cstr(&aff_match_learn), > ds_cstr(&aff_action_learn), &lb->nlb->header_, > lflow_ref); > > /* Use already selected backend within affinity timeslot. */ > ovn_lflow_add_with_dp_group( > - lflows, lb_dps->nb_ls_map, ods_size(ls_datapaths), > + lflows, lb_dps->nb_ls_map.map, ods_size(ls_datapaths), > S_SWITCH_IN_LB, 150, ds_cstr(&aff_match), ds_cstr(&aff_action), > &lb->nlb->header_, lflow_ref); > > @@ -8082,10 +8085,10 @@ build_lb_rules(struct lflow_table *lflows, struct > ovn_lb_datapaths *lb_dps, > if (reject) { > size_t index; > > - dp_non_meter = bitmap_clone(lb_dps->nb_ls_map, > + dp_non_meter = bitmap_clone(lb_dps->nb_ls_map.map, > ods_size(ls_datapaths)); > BITMAP_FOR_EACH_1 (index, ods_size(ls_datapaths), > - lb_dps->nb_ls_map) { > + lb_dps->nb_ls_map.map) { > struct ovn_datapath *od = ls_datapaths->array[index]; > > meter = copp_meter_get(COPP_REJECT, od->nbs->copp, > @@ -8104,7 +8107,7 @@ build_lb_rules(struct lflow_table *lflows, struct > ovn_lb_datapaths *lb_dps, > } > if (!reject || build_non_meter) { > ovn_lflow_add_with_dp_group( > - lflows, dp_non_meter ? dp_non_meter : lb_dps->nb_ls_map, > + lflows, dp_non_meter ? dp_non_meter : lb_dps->nb_ls_map.map, > ods_size(ls_datapaths), S_SWITCH_IN_LB, priority, > ds_cstr(match), ds_cstr(action), &lb->nlb->header_, > lb_dps->lflow_ref); > @@ -12227,7 +12230,7 @@ build_lrouter_nat_flows_for_lb( > size_t index; > bool use_stateless_nat = smap_get_bool(&lb->nlb->options, > "use_stateless_nat", false); > - BITMAP_FOR_EACH_1 (index, bitmap_len, lb_dps->nb_lr_map) { > + BITMAP_FOR_EACH_1 (index, bitmap_len, lb_dps->nb_lr_map.map) { > struct ovn_datapath *od = lr_datapaths->array[index]; > enum lrouter_nat_lb_flow_type type; > > @@ -12312,7 +12315,7 @@ build_lswitch_flows_for_lb(struct ovn_lb_datapaths > *lb_dps, > const struct svc_monitors_map_data *svc_mons_data, > struct ds *match, struct ds *action) > { > - if (!lb_dps->n_nb_ls) { > + if (!lb_dps->nb_ls_map.n_elems) { > return; > } > > @@ -12326,7 +12329,8 @@ build_lswitch_flows_for_lb(struct ovn_lb_datapaths > *lb_dps, > } > > size_t index; > - BITMAP_FOR_EACH_1 (index, ods_size(ls_datapaths), lb_dps->nb_ls_map) > { > + BITMAP_FOR_EACH_1 (index, ods_size(ls_datapaths), > + lb_dps->nb_ls_map.map) { > struct ovn_datapath *od = ls_datapaths->array[index]; > > ovn_lflow_add_with_hint__(lflows, od, > @@ -12370,7 +12374,7 @@ build_lrouter_defrag_flows_for_lb(struct > ovn_lb_datapaths *lb_dps, > const struct ovn_datapaths *lr_datapaths, > struct ds *match) > { > - if (!lb_dps->n_nb_lr) { > + if (!lb_dps->nb_lr_map.n_elems) { > return; > } > > @@ -12384,7 +12388,7 @@ build_lrouter_defrag_flows_for_lb(struct > ovn_lb_datapaths *lb_dps, > lb_vip->vip_str); > > ovn_lflow_add_with_dp_group( > - lflows, lb_dps->nb_lr_map, ods_size(lr_datapaths), > + lflows, lb_dps->nb_lr_map.map, ods_size(lr_datapaths), > S_ROUTER_IN_DEFRAG, prio, ds_cstr(match), "ct_dnat;", > &lb_dps->lb->nlb->header_, lb_dps->lflow_ref); > } > @@ -12404,7 +12408,7 @@ build_lrouter_allow_vip_traffic_template(struct > lflow_table *lflows, > struct ds match = DS_EMPTY_INITIALIZER; > > size_t index; > - BITMAP_FOR_EACH_1 (index, ods_size(lr_dps), lb_dps->nb_lr_map) { > + BITMAP_FOR_EACH_1 (index, ods_size(lr_dps), lb_dps->nb_lr_map.map) { > struct ovn_datapath *od = lr_dps->array[index]; > /* Do not drop ip traffic with destination the template VIP. */ > ds_clear(&match); > @@ -12430,7 +12434,7 @@ build_lrouter_flows_for_lb(struct ovn_lb_datapaths > *lb_dps, > { > size_t index; > > - if (!lb_dps->n_nb_lr) { > + if (!lb_dps->nb_lr_map.n_elems) { > return; > } > > @@ -12450,7 +12454,8 @@ build_lrouter_flows_for_lb(struct ovn_lb_datapaths > *lb_dps, > continue; > } > > - BITMAP_FOR_EACH_1 (index, ods_size(lr_datapaths), lb_dps->nb_lr_map) > { > + BITMAP_FOR_EACH_1 (index, ods_size(lr_datapaths), > + lb_dps->nb_lr_map.map) { > struct ovn_datapath *od = lr_datapaths->array[index]; > > ovn_lflow_add_with_hint__(lflows, od, S_ROUTER_IN_DNAT, > @@ -12464,7 +12469,8 @@ build_lrouter_flows_for_lb(struct ovn_lb_datapaths > *lb_dps, > } > > if (lb->skip_snat) { > - BITMAP_FOR_EACH_1 (index, ods_size(lr_datapaths), lb_dps->nb_lr_map) > { > + BITMAP_FOR_EACH_1 (index, ods_size(lr_datapaths), > + lb_dps->nb_lr_map.map) { > struct ovn_datapath *od = lr_datapaths->array[index]; > > ovn_lflow_add(lflows, od, S_ROUTER_OUT_SNAT, 120, > -- > 2.50.1 > > _______________________________________________ > dev mailing list > d...@openvswitch.org > https://mail.openvswitch.org/mailman/listinfo/ovs-dev > Looks good to me.
Acked-by: Mairtin O'Loingsigh <moloi...@redhat.com> _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev