> 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

Reply via email to