@@ -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;
}
@@ -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_ */
@@ -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(¶m, "walk topology\n");
- return cxl_filter_walk(ctx, ¶m);
+ jtopology = cxl_filter_walk(ctx, ¶m);
+ if (!jtopology)
+ return -ENOMEM;
+ util_display_json_array(stdout, jtopology, cxl_filter_to_flags(¶m));
+ return 0;
}
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.williams@intel.com> --- cxl/filter.c | 30 ++++++------------------------ cxl/filter.h | 22 +++++++++++++++++++++- cxl/list.c | 7 ++++++- 3 files changed, 33 insertions(+), 26 deletions(-)