On Thu, Dec 08, 2022 at 01:28:50PM -0800, Dan Williams wrote:
> In preparation for cxl_filter_walk() to be used to collect and publish cxl
> objects for other utilities, return the resulting json_object directly.
> Move the responsibility of freeing and optionally printing the object to
> the caller.

Tested-by: Alison Schofield <alison.schofi...@intel.com>

> 
> Signed-off-by: Dan Williams <dan.j.willi...@intel.com>
> ---
>  cxl/filter.c |   30 ++++++------------------------
>  cxl/filter.h |   22 +++++++++++++++++++++-
>  cxl/list.c   |    7 ++++++-
>  3 files changed, 33 insertions(+), 26 deletions(-)
> 
> diff --git a/cxl/filter.c b/cxl/filter.c
> index 040e7deefb3e..8499450ded01 100644
> --- a/cxl/filter.c
> +++ b/cxl/filter.c
> @@ -672,23 +672,6 @@ util_cxl_decoder_filter_by_region(struct cxl_decoder 
> *decoder,
>       return decoder;
>  }
>  
> -static unsigned long params_to_flags(struct cxl_filter_params *param)
> -{
> -     unsigned long flags = 0;
> -
> -     if (param->idle)
> -             flags |= UTIL_JSON_IDLE;
> -     if (param->human)
> -             flags |= UTIL_JSON_HUMAN;
> -     if (param->health)
> -             flags |= UTIL_JSON_HEALTH;
> -     if (param->targets)
> -             flags |= UTIL_JSON_TARGETS;
> -     if (param->partition)
> -             flags |= UTIL_JSON_PARTITION;
> -     return flags;
> -}
> -
>  static void splice_array(struct cxl_filter_params *p, struct json_object 
> *jobjs,
>                        struct json_object *platform,
>                        const char *container_name, bool do_container)
> @@ -1027,11 +1010,12 @@ walk_children:
>       }
>  }
>  
> -int cxl_filter_walk(struct cxl_ctx *ctx, struct cxl_filter_params *p)
> +struct json_object *cxl_filter_walk(struct cxl_ctx *ctx,
> +                                 struct cxl_filter_params *p)
>  {
>       struct json_object *jdevs = NULL, *jbuses = NULL, *jports = NULL;
>       struct json_object *jplatform = json_object_new_array();
> -     unsigned long flags = params_to_flags(p);
> +     unsigned long flags = cxl_filter_to_flags(p);
>       struct json_object *jportdecoders = NULL;
>       struct json_object *jbusdecoders = NULL;
>       struct json_object *jepdecoders = NULL;
> @@ -1044,7 +1028,7 @@ int cxl_filter_walk(struct cxl_ctx *ctx, struct 
> cxl_filter_params *p)
>  
>       if (!jplatform) {
>               dbg(p, "platform object allocation failure\n");
> -             return -ENOMEM;
> +             return NULL;
>       }
>  
>       janondevs = json_object_new_array();
> @@ -1232,9 +1216,7 @@ walk_children:
>                    top_level_objs > 1);
>       splice_array(p, jregions, jplatform, "regions", top_level_objs > 1);
>  
> -     util_display_json_array(stdout, jplatform, flags);
> -
> -     return 0;
> +     return jplatform;
>  err:
>       json_object_put(janondevs);
>       json_object_put(jbuses);
> @@ -1246,5 +1228,5 @@ err:
>       json_object_put(jepdecoders);
>       json_object_put(jregions);
>       json_object_put(jplatform);
> -     return -ENOMEM;
> +     return NULL;
>  }
> diff --git a/cxl/filter.h b/cxl/filter.h
> index 256df49c3d0c..2bda6ddd77ca 100644
> --- a/cxl/filter.h
> +++ b/cxl/filter.h
> @@ -5,6 +5,7 @@
>  
>  #include <stdbool.h>
>  #include <util/log.h>
> +#include <util/json.h>
>  
>  struct cxl_filter_params {
>       const char *memdev_filter;
> @@ -59,6 +60,25 @@ struct cxl_dport *util_cxl_dport_filter_by_memdev(struct 
> cxl_dport *dport,
>                                                 const char *serial);
>  struct cxl_decoder *util_cxl_decoder_filter(struct cxl_decoder *decoder,
>                                           const char *__ident);
> -int cxl_filter_walk(struct cxl_ctx *ctx, struct cxl_filter_params *param);
> +struct json_object *cxl_filter_walk(struct cxl_ctx *ctx,
> +                                 struct cxl_filter_params *param);
> +
> +static inline unsigned long cxl_filter_to_flags(struct cxl_filter_params 
> *param)
> +{
> +     unsigned long flags = 0;
> +
> +     if (param->idle)
> +             flags |= UTIL_JSON_IDLE;
> +     if (param->human)
> +             flags |= UTIL_JSON_HUMAN;
> +     if (param->health)
> +             flags |= UTIL_JSON_HEALTH;
> +     if (param->targets)
> +             flags |= UTIL_JSON_TARGETS;
> +     if (param->partition)
> +             flags |= UTIL_JSON_PARTITION;
> +     return flags;
> +}
> +
>  bool cxl_filter_has(const char *needle, const char *__filter);
>  #endif /* _CXL_UTIL_FILTER_H_ */
> diff --git a/cxl/list.c b/cxl/list.c
> index 8c48fbbaaec3..2026de2b548b 100644
> --- a/cxl/list.c
> +++ b/cxl/list.c
> @@ -72,6 +72,7 @@ int cmd_list(int argc, const char **argv, struct cxl_ctx 
> *ctx)
>               "cxl list [<options>]",
>               NULL
>       };
> +     struct json_object *jtopology;
>       int i;
>  
>       argc = parse_options(argc, argv, options, u, 0);
> @@ -140,5 +141,9 @@ int cmd_list(int argc, const char **argv, struct cxl_ctx 
> *ctx)
>               param.endpoints = true;
>  
>       dbg(&param, "walk topology\n");
> -     return cxl_filter_walk(ctx, &param);
> +     jtopology = cxl_filter_walk(ctx, &param);
> +     if (!jtopology)
> +             return -ENOMEM;
> +     util_display_json_array(stdout, jtopology, cxl_filter_to_flags(&param));
> +     return 0;
>  }
> 

Reply via email to