On Aug 27, Ales Musil wrote:
> On Wed, Aug 20, 2025 at 6:56 PM Lorenzo Bianconi via dev <
> ovs-dev@openvswitch.org> 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>
> > ---
> >
> 
> Hi Lorenzo,
> before proceeding with the series I think this newly introduced
> helper should have at least basic API around the most common
> operations. The code of the series is accessing members of the
> struct directly which is very error prone. At least the most basic
> operations like adding allocation/reallocation/set1/set0 should be
> wrapped in some way because it operates on multiple struct members.
> 
> For a good measure there could also be DYNAMIC_BITMAP_FOR_EACH_1
> wrapper macro.

ack, I will fix in v5.

Regards,
Lorenzo

> 
> 
> >  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
> >
> >
> Thanks,
> Ales
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to