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.

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