diff mbox series

[ndctl,v2,09/18] cxl/filter: Return json-c topology

Message ID 167053493095.582963.5155962994216061570.stgit@dwillia2-xfh.jf.intel.com (mailing list archive)
State Accepted
Commit 7ccbad26631e80fde258141dfc511141fc50ff97
Headers show
Series cxl-cli test and usability updates | expand

Commit Message

Dan Williams Dec. 8, 2022, 9:28 p.m. UTC
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(-)

Comments

Alison Schofield Dec. 9, 2022, 5:27 p.m. UTC | #1
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.schofield@intel.com>

> 
> 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(-)
> 
> 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;
>  }
>
diff mbox series

Patch

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;
 }