Introduce dps_index_map dynamic_bitmap in order to track unused datapath indexes. This is required to add I-P for logical switch and logical router inserts.
Acked-by: Mairtin O'Loingsigh <moloi...@redhat.com> Signed-off-by: Lorenzo Bianconi <lorenzo.bianc...@redhat.com> --- northd/lflow-mgr.c | 8 +++++--- northd/northd.c | 49 ++++++++++++++++++++++++++-------------------- northd/northd.h | 5 +++-- 3 files changed, 36 insertions(+), 26 deletions(-) diff --git a/northd/lflow-mgr.c b/northd/lflow-mgr.c index 31476286a..6a66a9718 100644 --- a/northd/lflow-mgr.c +++ b/northd/lflow-mgr.c @@ -1007,12 +1007,12 @@ sync_lflow_to_sb(struct ovn_lflow *lflow, if (ovn_stage_to_datapath_type(lflow->stage) == DP_SWITCH) { n_datapaths = ods_size(ls_datapaths); - datapaths_array = ls_datapaths->array; + datapaths_array = vector_get_array(&ls_datapaths->dps); dp_groups = &lflow_table->ls_dp_groups; is_switch = true; } else { n_datapaths = ods_size(lr_datapaths); - datapaths_array = lr_datapaths->array; + datapaths_array = vector_get_array(&lr_datapaths->dps); dp_groups = &lflow_table->lr_dp_groups; is_switch = false; } @@ -1226,7 +1226,9 @@ ovn_sb_insert_or_update_logical_dp_group( sb = xmalloc(bitmap_count1(dpg_bitmap, ods_size(datapaths)) * sizeof *sb); BITMAP_FOR_EACH_1 (index, ods_size(datapaths), dpg_bitmap) { - sb[n++] = datapaths->array[index]->sdp->sb_dp; + struct ovn_datapath *od = vector_get(&datapaths->dps, index, + struct ovn_datapath *); + sb[n++] = od->sdp->sb_dp; } if (!dp_group) { struct uuid dpg_uuid = uuid_random(); diff --git a/northd/northd.c b/northd/northd.c index bd30f5b9d..04be1c48b 100644 --- a/northd/northd.c +++ b/northd/northd.c @@ -839,18 +839,20 @@ parse_dynamic_routing_redistribute( static void ods_build_array_index(struct ovn_datapaths *datapaths) { + datapaths->dps = VECTOR_CAPACITY_INITIALIZER(struct ovn_datapath *, + ods_size(datapaths)); + dynamic_bitmap_alloc(&datapaths->dps_index_map, ods_size(datapaths)); + /* Assign unique sequential indexes to all datapaths. These are not * visible outside of the northd loop, so, unlike the tunnel keys, it * doesn't matter if they are different on every iteration. */ - size_t index = 0; - - datapaths->array = xrealloc(datapaths->array, - ods_size(datapaths) * sizeof *datapaths->array); - 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_set1(&datapaths->dps_index_map, index); od->index = index; - datapaths->array[index++] = od; + vector_push(&datapaths->dps, &od); od->datapaths = datapaths; } } @@ -3415,7 +3417,8 @@ build_lswitch_lbs_from_lrouter(struct ovn_datapaths *lr_datapaths, HMAP_FOR_EACH (lb_dps, hmap_node, lb_dps_map) { DYNAMIC_BITMAP_FOR_EACH_1 (index, &lb_dps->nb_lr_map) { - struct ovn_datapath *od = lr_datapaths->array[index]; + 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), vector_get_array(&od->ls_peers), ods_size(ls_datapaths)); @@ -5015,7 +5018,7 @@ northd_handle_lb_data_changes(struct tracked_lb_data *trk_lb_data, size_t index; DYNAMIC_BITMAP_FOR_EACH_1 (index, &lb_dps->nb_ls_map) { - od = ls_datapaths->array[index]; + od = vector_get(&ls_datapaths->dps, index, struct ovn_datapath *); /* Add the ls datapath to the northd tracked data. */ hmapx_add(&nd_changes->ls_with_changed_lbs, od); @@ -5151,7 +5154,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.map) { - od = ls_datapaths->array[index]; + od = vector_get(&ls_datapaths->dps, index, struct ovn_datapath *); /* Add the ls datapath to the northd tracked data. */ hmapx_add(&nd_changes->ls_with_changed_lbs, od); @@ -8094,7 +8097,8 @@ build_lb_rules(struct lflow_table *lflows, struct ovn_lb_datapaths *lb_dps, 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 = ls_datapaths->array[index]; + struct ovn_datapath *od = vector_get(&ls_datapaths->dps, index, + struct ovn_datapath *); meter = copp_meter_get(COPP_REJECT, od->nbs->copp, meter_groups); @@ -12099,7 +12103,8 @@ build_gw_lrouter_nat_flows_for_lb(struct lrouter_nat_lb_flows_ctx *ctx, if (ctx->reject) { dp_non_meter = bitmap_clone(dp_bitmap, bitmap_len); BITMAP_FOR_EACH_1 (index, bitmap_len, dp_bitmap) { - struct ovn_datapath *od = lr_datapaths->array[index]; + struct ovn_datapath *od = vector_get(&lr_datapaths->dps, index, + struct ovn_datapath *); const char *meter; meter = copp_meter_get(COPP_REJECT, od->nbr->copp, @@ -12236,7 +12241,8 @@ build_lrouter_nat_flows_for_lb( bool use_stateless_nat = smap_get_bool(&lb->nlb->options, "use_stateless_nat", false); DYNAMIC_BITMAP_FOR_EACH_1 (index, &lb_dps->nb_lr_map) { - struct ovn_datapath *od = lr_datapaths->array[index]; + struct ovn_datapath *od = vector_get(&lr_datapaths->dps, index, + struct ovn_datapath *); enum lrouter_nat_lb_flow_type type; const struct lr_stateful_record *lr_stateful_rec = @@ -12335,7 +12341,8 @@ build_lswitch_flows_for_lb(struct ovn_lb_datapaths *lb_dps, size_t index; DYNAMIC_BITMAP_FOR_EACH_1 (index, &lb_dps->nb_ls_map) { - struct ovn_datapath *od = ls_datapaths->array[index]; + struct ovn_datapath *od = vector_get(&ls_datapaths->dps, index, + struct ovn_datapath *); ovn_lflow_add_with_hint__(lflows, od, S_SWITCH_IN_PRE_LB, 130, ds_cstr(match), @@ -12413,7 +12420,8 @@ build_lrouter_allow_vip_traffic_template(struct lflow_table *lflows, size_t index; DYNAMIC_BITMAP_FOR_EACH_1 (index, &lb_dps->nb_lr_map) { - struct ovn_datapath *od = lr_dps->array[index]; + struct ovn_datapath *od = vector_get(&lr_dps->dps, index, + struct ovn_datapath *); /* Do not drop ip traffic with destination the template VIP. */ ds_clear(&match); ds_put_format(&match, "ip%d.dst == %s", @@ -12459,8 +12467,8 @@ build_lrouter_flows_for_lb(struct ovn_lb_datapaths *lb_dps, } DYNAMIC_BITMAP_FOR_EACH_1 (index, &lb_dps->nb_lr_map) { - struct ovn_datapath *od = lr_datapaths->array[index]; - + struct ovn_datapath *od = vector_get(&lr_datapaths->dps, index, + struct ovn_datapath *); ovn_lflow_add_with_hint__(lflows, od, S_ROUTER_IN_DNAT, 130, ds_cstr(match), ds_cstr(action), NULL, @@ -12473,8 +12481,8 @@ build_lrouter_flows_for_lb(struct ovn_lb_datapaths *lb_dps, if (lb->skip_snat) { DYNAMIC_BITMAP_FOR_EACH_1 (index, &lb_dps->nb_lr_map) { - struct ovn_datapath *od = lr_datapaths->array[index]; - + struct ovn_datapath *od = vector_get(&lr_datapaths->dps, index, + struct ovn_datapath *); ovn_lflow_add(lflows, od, S_ROUTER_OUT_SNAT, 120, "flags.skip_snat_for_lb == 1 && ip", "next;", lb_dps->lflow_ref); @@ -18923,7 +18931,6 @@ static void ovn_datapaths_init(struct ovn_datapaths *datapaths) { hmap_init(&datapaths->datapaths); - datapaths->array = NULL; } static void @@ -18935,8 +18942,8 @@ ovn_datapaths_destroy(struct ovn_datapaths *datapaths) } hmap_destroy(&datapaths->datapaths); - free(datapaths->array); - datapaths->array = NULL; + dynamic_bitmap_free(&datapaths->dps_index_map); + vector_destroy(&datapaths->dps); } static void diff --git a/northd/northd.h b/northd/northd.h index 8f865e8b3..bb12ec781 100644 --- a/northd/northd.h +++ b/northd/northd.h @@ -93,7 +93,8 @@ struct ovn_datapaths { struct hmap datapaths; /* The array index of each element in 'datapaths'. */ - struct ovn_datapath **array; + struct dynamic_bitmap dps_index_map; + struct vector dps; }; static inline size_t @@ -457,7 +458,7 @@ ovn_datapaths_find_by_index(const struct ovn_datapaths *ovn_datapaths, size_t od_index) { ovs_assert(od_index <= hmap_count(&ovn_datapaths->datapaths)); - return ovn_datapaths->array[od_index]; + return vector_get(&ovn_datapaths->dps, od_index, struct ovn_datapath *); } struct ovn_datapath *ovn_datapath_from_sbrec( -- 2.50.1 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev