On 2/28/25 10:40 PM, [email protected] wrote:
> From: Numan Siddique <[email protected]>
>
> A sset is maintained in the 'struct local_datapath' of the
> logical ports claimed for it. A later patch will make use
> of this to check if a local_datapath is still relevant to
> the chassis or not.
>
> Signed-off-by: Numan Siddique <[email protected]>
> ---
Hi Numan,
Sorry for the delay in reviewing this series. This patch looks OK, just
one question below.
> controller/binding.c | 84 ++++++++++++++++++++++++++---------------
> controller/local_data.c | 14 ++++---
> controller/local_data.h | 4 +-
> 3 files changed, 64 insertions(+), 38 deletions(-)
>
> diff --git a/controller/binding.c b/controller/binding.c
> index cbd7749494..c76a0c06c5 100644
> --- a/controller/binding.c
> +++ b/controller/binding.c
> @@ -1351,6 +1351,7 @@ is_postponed_port(const char *port_name)
> */
> static bool
> claim_lport(const struct sbrec_port_binding *pb,
> + struct local_datapath *ld,
> const struct sbrec_port_binding *parent_pb,
> const struct sbrec_chassis *chassis_rec,
> const struct ovsrec_interface *iface_rec,
> @@ -1362,6 +1363,10 @@ claim_lport(const struct sbrec_port_binding *pb,
> {
> bool update_tracked = false;
>
> + if (ld) {
> + sset_add(&ld->claimed_lports, pb->logical_port);
> + }
> +
> if (can_bind == CAN_BIND_AS_MAIN) {
> if (pb->chassis != chassis_rec) {
> long long int now = time_msec();
> @@ -1489,6 +1494,7 @@ release_lport_additional_chassis(const struct
> sbrec_port_binding *pb,
>
> static bool
> release_lport(const struct sbrec_port_binding *pb,
> + struct local_datapath *ld,
> const struct sbrec_chassis *chassis_rec, bool sb_readonly,
> struct hmap *tracked_datapaths, struct if_status_mgr *if_mgr)
> {
> @@ -1505,6 +1511,10 @@ release_lport(const struct sbrec_port_binding *pb,
> }
> update_lport_tracking(pb, tracked_datapaths, false);
> if_status_mgr_release_iface(if_mgr, pb->logical_port);
> +
> + if (ld) {
> + sset_find_and_delete(&ld->claimed_lports, pb->logical_port);
> + }
> return true;
> }
>
> @@ -1548,7 +1558,11 @@ release_binding_lport(const struct sbrec_chassis
> *chassis_rec,
> remove_related_lport(b_lport->pb, b_ctx_out);
> }
> if (is_binding_lport_this_chassis(b_lport, chassis_rec)) {
> - if (!release_lport(b_lport->pb, chassis_rec, sb_readonly,
> + struct local_datapath *ld =
> + get_local_datapath(b_ctx_out->local_datapaths,
> + b_lport->pb->datapath->tunnel_key);
> +
> + if (!release_lport(b_lport->pb, ld, chassis_rec, sb_readonly,
> b_ctx_out->tracked_dp_bindings,
> b_ctx_out->if_mgr)) {
> return false;
> @@ -1574,7 +1588,15 @@ consider_vif_lport_(const struct sbrec_port_binding
> *pb,
> const struct sbrec_port_binding *parent_pb =
> binding_lport_get_parent_pb(b_lport);
>
> - if (!claim_lport(pb, parent_pb, b_ctx_in->chassis_rec,
> + struct local_datapath *ld =
> + add_local_datapath(b_ctx_in->sbrec_datapath_binding_by_key,
> + b_ctx_in->sbrec_port_binding_by_datapath,
> + b_ctx_in->sbrec_port_binding_by_name,
> + pb->datapath, b_ctx_in->chassis_rec,
> + b_ctx_out->local_datapaths,
> + b_ctx_out->tracked_dp_bindings);
> +
> + if (!claim_lport(pb, ld, parent_pb, b_ctx_in->chassis_rec,
> b_lport->lbinding->iface,
> !b_ctx_in->ovnsb_idl_txn,
> !parent_pb, b_ctx_out->tracked_dp_bindings,
> @@ -1583,12 +1605,6 @@ consider_vif_lport_(const struct sbrec_port_binding
> *pb,
> return false;
If we failed to claim the port, do we need to remove the local datapath
here? Before your patch we were only adding to local datapaths if we
successfully claimed the port.
> }
>
> - add_local_datapath(b_ctx_in->sbrec_datapath_binding_by_key,
> - b_ctx_in->sbrec_port_binding_by_datapath,
> - b_ctx_in->sbrec_port_binding_by_name,
> - pb->datapath, b_ctx_in->chassis_rec,
> - b_ctx_out->local_datapaths,
> - b_ctx_out->tracked_dp_bindings);
> update_related_lport(pb, b_ctx_out);
> update_local_lports(pb->logical_port, b_ctx_out);
> if (binding_lport_update_port_sec(b_lport, pb) &&
> @@ -1625,7 +1641,10 @@ consider_vif_lport_(const struct sbrec_port_binding
> *pb,
>
> if (!lbinding_set || !can_bind) {
> remove_related_lport(pb, b_ctx_out);
> - return release_lport(pb, b_ctx_in->chassis_rec,
> + struct local_datapath *ld =
> + get_local_datapath(b_ctx_out->local_datapaths,
> + pb->datapath->tunnel_key);
> + return release_lport(pb, ld, b_ctx_in->chassis_rec,
> !b_ctx_in->ovnsb_idl_txn,
> b_ctx_out->tracked_dp_bindings,
> b_ctx_out->if_mgr);
> @@ -1761,7 +1780,10 @@ consider_container_lport(const struct
> sbrec_port_binding *pb,
> * if it was bound earlier. */
> if (is_binding_lport_this_chassis(container_b_lport,
> b_ctx_in->chassis_rec)) {
> - return release_lport(pb, b_ctx_in->chassis_rec,
> + struct local_datapath *ld =
> + get_local_datapath(b_ctx_out->local_datapaths,
> + pb->datapath->tunnel_key);
> + return release_lport(pb, ld, b_ctx_in->chassis_rec,
> !b_ctx_in->ovnsb_idl_txn,
> b_ctx_out->tracked_dp_bindings,
> b_ctx_out->if_mgr);
> @@ -1900,12 +1922,12 @@ consider_nonvif_lport_(const struct
> sbrec_port_binding *pb,
> if (our_chassis) {
> update_local_lports(pb->logical_port, b_ctx_out);
> if (!ld) {
> - add_local_datapath(b_ctx_in->sbrec_datapath_binding_by_key,
> - b_ctx_in->sbrec_port_binding_by_datapath,
> - b_ctx_in->sbrec_port_binding_by_name,
> - pb->datapath, b_ctx_in->chassis_rec,
> - b_ctx_out->local_datapaths,
> - b_ctx_out->tracked_dp_bindings);
> + ld = add_local_datapath(b_ctx_in->sbrec_datapath_binding_by_key,
> + b_ctx_in->sbrec_port_binding_by_datapath,
> + b_ctx_in->sbrec_port_binding_by_name,
> + pb->datapath, b_ctx_in->chassis_rec,
> + b_ctx_out->local_datapaths,
> + b_ctx_out->tracked_dp_bindings);
> } else {
> /* Add the peer datapath to the local datapaths if it's
> * not present yet.
> @@ -1926,7 +1948,7 @@ consider_nonvif_lport_(const struct sbrec_port_binding
> *pb,
> update_related_lport(pb, b_ctx_out);
> enum can_bind can_bind = lport_can_bind_on_this_chassis(
> b_ctx_in->chassis_rec, pb);
> - return claim_lport(pb, NULL, b_ctx_in->chassis_rec, NULL,
> + return claim_lport(pb, ld, NULL, b_ctx_in->chassis_rec, NULL,
> !b_ctx_in->ovnsb_idl_txn, false,
> b_ctx_out->tracked_dp_bindings,
> b_ctx_out->if_mgr,
> @@ -1940,10 +1962,10 @@ consider_nonvif_lport_(const struct
> sbrec_port_binding *pb,
> || is_additional_chassis(pb, b_ctx_in->chassis_rec)
> || if_status_is_port_claimed(b_ctx_out->if_mgr,
> pb->logical_port)) {
> - if (!release_lport(pb, b_ctx_in->chassis_rec,
> - !b_ctx_in->ovnsb_idl_txn,
> - b_ctx_out->tracked_dp_bindings,
> - b_ctx_out->if_mgr)) {
> + if (!release_lport(pb, ld, b_ctx_in->chassis_rec,
> + !b_ctx_in->ovnsb_idl_txn,
> + b_ctx_out->tracked_dp_bindings,
> + b_ctx_out->if_mgr)) {
> return false;
> }
>
> @@ -2839,9 +2861,9 @@ handle_deleted_vif_lport(const struct
> sbrec_port_binding *pb,
> struct binding_ctx_in *b_ctx_in,
> struct binding_ctx_out *b_ctx_out)
> {
> + struct shash *binding_lports = &b_ctx_out->lbinding_data->lports;
> struct local_binding *lbinding = NULL;
>
> - struct shash *binding_lports = &b_ctx_out->lbinding_data->lports;
> struct binding_lport *b_lport = binding_lport_find(binding_lports,
> pb->logical_port);
> if (b_lport) {
> lbinding = b_lport->lbinding;
> @@ -2966,13 +2988,13 @@ consider_patch_port_for_local_datapaths(const struct
> sbrec_port_binding *pb,
> if (peer_ld && need_add_peer_to_local(
> b_ctx_in->sbrec_port_binding_by_name, peer,
> b_ctx_in->chassis_rec)) {
> - add_local_datapath(
> - b_ctx_in->sbrec_datapath_binding_by_key,
> - b_ctx_in->sbrec_port_binding_by_datapath,
> - b_ctx_in->sbrec_port_binding_by_name,
> - pb->datapath, b_ctx_in->chassis_rec,
> - b_ctx_out->local_datapaths,
> - b_ctx_out->tracked_dp_bindings);
> + ld = add_local_datapath(
> + b_ctx_in->sbrec_datapath_binding_by_key,
> + b_ctx_in->sbrec_port_binding_by_datapath,
> + b_ctx_in->sbrec_port_binding_by_name,
> + pb->datapath, b_ctx_in->chassis_rec,
> + b_ctx_out->local_datapaths,
> + b_ctx_out->tracked_dp_bindings);
> }
> } else {
> /* Add the peer datapath to the local datapaths if it's
> @@ -2993,7 +3015,7 @@ consider_patch_port_for_local_datapaths(const struct
> sbrec_port_binding *pb,
>
> /* If this chassis is requested - try to claim. */
> if (pb->requested_chassis == b_ctx_in->chassis_rec) {
> - return claim_lport(pb, NULL, b_ctx_in->chassis_rec, NULL,
> + return claim_lport(pb, ld, NULL, b_ctx_in->chassis_rec, NULL,
> !b_ctx_in->ovnsb_idl_txn, false,
> b_ctx_out->tracked_dp_bindings,
> b_ctx_out->if_mgr,
> @@ -3007,7 +3029,7 @@ consider_patch_port_for_local_datapaths(const struct
> sbrec_port_binding *pb,
> || if_status_is_port_claimed(b_ctx_out->if_mgr, pb->logical_port)) {
>
> remove_local_lports(pb->logical_port, b_ctx_out);
> - if (!release_lport(pb, b_ctx_in->chassis_rec,
> + if (!release_lport(pb, ld, b_ctx_in->chassis_rec,
> !b_ctx_in->ovnsb_idl_txn,
> b_ctx_out->tracked_dp_bindings,
> b_ctx_out->if_mgr)) {
> diff --git a/controller/local_data.c b/controller/local_data.c
> index 4aee39d6b2..24e871f639 100644
> --- a/controller/local_data.c
> +++ b/controller/local_data.c
> @@ -88,6 +88,7 @@ local_datapath_alloc(const struct sbrec_datapath_binding
> *dp)
> ld->is_transit_switch = datapath_is_transit_switch(dp);
> shash_init(&ld->external_ports);
> shash_init(&ld->multichassis_ports);
> + sset_init(&ld->claimed_lports);
> /* memory accounting - common part. */
> local_datapath_usage += sizeof *ld;
>
> @@ -127,6 +128,7 @@ local_datapath_destroy(struct local_datapath *ld)
> free(ld->peer_ports);
> shash_destroy(&ld->external_ports);
> shash_destroy(&ld->multichassis_ports);
> + sset_destroy(&ld->claimed_lports);
> free(ld);
> }
>
> @@ -180,7 +182,7 @@ need_add_peer_to_local(
> return false;
> }
>
> -void
> +struct local_datapath *
> add_local_datapath(struct ovsdb_idl_index *sbrec_datapath_binding_by_key,
> struct ovsdb_idl_index *sbrec_port_binding_by_datapath,
> struct ovsdb_idl_index *sbrec_port_binding_by_name,
> @@ -189,11 +191,11 @@ add_local_datapath(struct ovsdb_idl_index
> *sbrec_datapath_binding_by_key,
> struct hmap *local_datapaths,
> struct hmap *tracked_datapaths)
> {
> - add_local_datapath__(sbrec_datapath_binding_by_key,
> - sbrec_port_binding_by_datapath,
> - sbrec_port_binding_by_name, 0,
> - dp, chassis, local_datapaths,
> - tracked_datapaths);
> + return add_local_datapath__(sbrec_datapath_binding_by_key,
> + sbrec_port_binding_by_datapath,
> + sbrec_port_binding_by_name, 0,
> + dp, chassis, local_datapaths,
> + tracked_datapaths);
> }
>
> void
> diff --git a/controller/local_data.h b/controller/local_data.h
> index 1d60dada86..d2eb33b1eb 100644
> --- a/controller/local_data.h
> +++ b/controller/local_data.h
> @@ -63,6 +63,8 @@ struct local_datapath {
>
> struct shash external_ports;
> struct shash multichassis_ports;
> +
> + struct sset claimed_lports;
> };
>
> struct local_datapath *local_datapath_alloc(
> @@ -78,7 +80,7 @@ need_add_peer_to_local(
> struct ovsdb_idl_index *sbrec_port_binding_by_name,
> const struct sbrec_port_binding *,
> const struct sbrec_chassis *);
> -void add_local_datapath(
> +struct local_datapath * add_local_datapath(
> struct ovsdb_idl_index *sbrec_datapath_binding_by_key,
> struct ovsdb_idl_index *sbrec_port_binding_by_datapath,
> struct ovsdb_idl_index *sbrec_port_binding_by_name,
Regards,
Dumitru
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev