On Wed, Mar 12, 2025 at 5:39 PM Ales Musil <amu...@redhat.com> wrote:

> The objdep was adding "struct object_to_resources_list_node" to list
> that would be passed around and only used part would be the uuid.
> Create uuidset directly instead to avoid extra allocations of the
> intermediate struct.
>
> Signed-off-by: Ales Musil <amu...@redhat.com>
> ---
>  controller/lflow.c          | 21 ++++++---------------
>  controller/lflow.h          |  2 +-
>  controller/ovn-controller.c | 15 +++++++--------
>  lib/objdep.c                | 10 +++-------
>  lib/objdep.h                |  2 +-
>  5 files changed, 18 insertions(+), 32 deletions(-)
>
> diff --git a/controller/lflow.c b/controller/lflow.c
> index 860869f55..0c6203fa1 100644
> --- a/controller/lflow.c
> +++ b/controller/lflow.c
> @@ -748,7 +748,7 @@ done:
>
>  bool
>  lflow_handle_changed_ref(enum objdep_type type, const char *res_name,
> -                         struct ovs_list *objs_todo,
> +                         struct uuidset *objs_todo,
>                           const void *in_arg, void *out_arg)
>  {
>      struct lflow_ctx_in *l_ctx_in = CONST_CAST(struct lflow_ctx_in *,
> in_arg);
> @@ -756,22 +756,13 @@ lflow_handle_changed_ref(enum objdep_type type,
> const char *res_name,
>
>      /* Re-parse the related lflows. */
>      /* Firstly, flood remove the flows from desired flow table. */
> -    struct object_to_resources_list_node *resource_list_node_uuid;
> -    struct uuidset flood_remove_nodes =
> -        UUIDSET_INITIALIZER(&flood_remove_nodes);
> -    LIST_FOR_EACH_SAFE (resource_list_node_uuid, list_node, objs_todo) {
> -        const struct uuid *obj_uuid = &resource_list_node_uuid->obj_uuid;
> -        VLOG_DBG("Reprocess lflow "UUID_FMT" for resource type: %s,"
> -                 " name: %s.",
> -                 UUID_ARGS(obj_uuid), objdep_type_name(type), res_name);
> -        uuidset_insert(&flood_remove_nodes, obj_uuid);
> -        free(resource_list_node_uuid);
> -    }
> -    ofctrl_flood_remove_flows(l_ctx_out->flow_table, &flood_remove_nodes);
> +    ofctrl_flood_remove_flows(l_ctx_out->flow_table, objs_todo);
>
>      /* Secondly, for each lflow that is actually removed, reprocessing
> it. */
>      struct uuidset_node *ofrn;
> -    UUIDSET_FOR_EACH (ofrn, &flood_remove_nodes) {
> +    UUIDSET_FOR_EACH (ofrn, objs_todo) {
> +        VLOG_DBG("Reprocess lflow "UUID_FMT" for resource type: %s, name:
> %s.",
> +                 UUID_ARGS(&ofrn->uuid), objdep_type_name(type),
> res_name);
>          objdep_mgr_remove_obj(l_ctx_out->lflow_deps_mgr, &ofrn->uuid);
>          lflow_conj_ids_free(l_ctx_out->conj_ids, &ofrn->uuid);
>
> @@ -798,7 +789,7 @@ lflow_handle_changed_ref(enum objdep_type type, const
> char *res_name,
>
>          consider_logical_flow(lflow, false, l_ctx_in, l_ctx_out);
>      }
> -    uuidset_destroy(&flood_remove_nodes);
> +    uuidset_destroy(objs_todo);
>      return true;
>  }
>
> diff --git a/controller/lflow.h b/controller/lflow.h
> index ab026e3bd..fa99173e6 100644
> --- a/controller/lflow.h
> +++ b/controller/lflow.h
> @@ -169,7 +169,7 @@ bool lflow_handle_addr_set_update(const char *as_name,
> struct addr_set_diff *,
>                                    struct lflow_ctx_out *,
>                                    bool *changed);
>  bool lflow_handle_changed_ref(enum objdep_type, const char *res_name,
> -                              struct ovs_list *objs_todo,
> +                              struct uuidset *objs_todo,
>                                const void *in_arg, void *out_arg);
>
>  void lflow_handle_changed_mac_bindings(
> diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c
> index c0f167c54..8fa32635f 100644
> --- a/controller/ovn-controller.c
> +++ b/controller/ovn-controller.c
> @@ -2755,15 +2755,15 @@ lb_data_local_lb_remove(struct ed_type_lb_data
> *lb_data,
>
>  static bool
>  lb_data_handle_changed_ref(enum objdep_type type, const char *res_name,
> -                           struct ovs_list *objs_todo, const void *in_arg,
> +                           struct uuidset *objs_todo, const void *in_arg,
>                             void *out_arg)
>  {
>      const struct lb_data_ctx_in *ctx_in = in_arg;
>      struct ed_type_lb_data *lb_data = out_arg;
>
> -    struct object_to_resources_list_node *resource_lb_uuid;
> -    LIST_FOR_EACH_POP (resource_lb_uuid, list_node, objs_todo) {
> -        struct uuid *uuid = &resource_lb_uuid->obj_uuid;
> +    struct uuidset_node *ofrn;
> +    UUIDSET_FOR_EACH (ofrn, objs_todo) {
> +        struct uuid *uuid = &ofrn->uuid;
>
>          VLOG_DBG("Reprocess LB "UUID_FMT" for resource type: %s, name:
> %s",
>                   UUID_ARGS(uuid), objdep_type_name(type), res_name);
> @@ -2771,7 +2771,6 @@ lb_data_handle_changed_ref(enum objdep_type type,
> const char *res_name,
>          struct ovn_controller_lb *lb =
>              ovn_controller_lb_find(&lb_data->local_lbs, uuid);
>          if (!lb) {
> -            free(resource_lb_uuid);
>              continue;
>          }
>
> @@ -2780,14 +2779,14 @@ lb_data_handle_changed_ref(enum objdep_type type,
> const char *res_name,
>          const struct sbrec_load_balancer *sbrec_lb =
>              sbrec_load_balancer_table_get_for_uuid(ctx_in->lb_table,
> uuid);
>          if (!lb_is_local(sbrec_lb, ctx_in->local_datapaths)) {
> -            free(resource_lb_uuid);
>              continue;
>          }
>
>          lb_data_local_lb_add(lb_data, sbrec_lb, ctx_in->template_vars,
> true);
> -
> -        free(resource_lb_uuid);
>      }
> +
> +    uuidset_destroy(objs_todo);
> +
>      return true;
>  }
>
> diff --git a/lib/objdep.c b/lib/objdep.c
> index 06cf126f1..00f762b8e 100644
> --- a/lib/objdep.c
> +++ b/lib/objdep.c
> @@ -214,8 +214,7 @@ objdep_mgr_handle_change(struct objdep_mgr *mgr,
>               " name: %s.", objdep_type_name(type), res_name);
>      *changed = false;
>
> -    struct ovs_list objs_todo = OVS_LIST_INITIALIZER(&objs_todo);
> -
> +    struct uuidset objs_todo = UUIDSET_INITIALIZER(&objs_todo);
>      struct object_to_resources_list_node *resource_list_node;
>      HMAP_FOR_EACH (resource_list_node, hmap_node, &resource_node->objs) {
>          if (uuidset_find(objs_processed, &resource_list_node->obj_uuid)) {
> @@ -223,12 +222,9 @@ objdep_mgr_handle_change(struct objdep_mgr *mgr,
>          }
>          /* Use object_to_resources_list_node as list node to store the
> uuid.
>           * Other fields are not used here. */
> -        struct object_to_resources_list_node *resource_list_node_uuid =
> -            xmalloc(sizeof *resource_list_node_uuid);
> -        resource_list_node_uuid->obj_uuid = resource_list_node->obj_uuid;
> -        ovs_list_push_back(&objs_todo,
> &resource_list_node_uuid->list_node);
> +        uuidset_insert(&objs_todo, &resource_list_node->obj_uuid);
>      }
> -    if (ovs_list_is_empty(&objs_todo)) {
> +    if (uuidset_is_empty(&objs_todo)) {
>          return true;
>      }
>      *changed = true;
> diff --git a/lib/objdep.h b/lib/objdep.h
> index 1ea781947..e25ae7f31 100644
> --- a/lib/objdep.h
> +++ b/lib/objdep.h
> @@ -35,7 +35,7 @@ enum objdep_type {
>   * handled successfully. */
>  typedef bool (*objdep_change_handler)(enum objdep_type,
>                                        const char *res_name,
> -                                      struct ovs_list *ref_nodes,
> +                                      struct uuidset *ref_nodes,
>                                        const void *in_arg, void *out_arg);
>
>  /* A node pointing to all objects that refer to a given resource. */
> --
> 2.48.1
>
>

Recheck-request: github-robot-_Build_and_Test
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to