[v10,14/16] graph: add stats for mcore dispatch model

Message ID 20230608095759.1800617-15-zhirun.yan@intel.com (mailing list archive)
State Changes Requested, archived
Delegated to: Thomas Monjalon
Headers
Series graph enhancement for multi-core dispatch |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Yan, Zhirun June 8, 2023, 9:57 a.m. UTC
  Add stats for mcore dispatch model if stats collection is
enabled.

Signed-off-by: Haiyue Wang <haiyue.wang@intel.com>
Signed-off-by: Cunming Liang <cunming.liang@intel.com>
Signed-off-by: Zhirun Yan <zhirun.yan@intel.com>
Acked-by: Jerin Jacob <jerinj@marvell.com>
---
 lib/graph/graph_debug.c                    |  6 ++
 lib/graph/graph_stats.c                    | 76 +++++++++++++++++++---
 lib/graph/rte_graph.h                      | 10 +++
 lib/graph/rte_graph_model_mcore_dispatch.c |  3 +
 lib/graph/rte_graph_worker_common.h        |  2 +
 5 files changed, 89 insertions(+), 8 deletions(-)
  

Comments

Pavan Nikhilesh Bhagavatula June 8, 2023, 1:11 p.m. UTC | #1
> Add stats for mcore dispatch model if stats collection is
> enabled.
> 
> Signed-off-by: Haiyue Wang <haiyue.wang@intel.com>
> Signed-off-by: Cunming Liang <cunming.liang@intel.com>
> Signed-off-by: Zhirun Yan <zhirun.yan@intel.com>
> Acked-by: Jerin Jacob <jerinj@marvell.com>

Acked-by: Pavan Nikhilesh <pbhagavatula@marvell.com>

> ---
>  lib/graph/graph_debug.c                    |  6 ++
>  lib/graph/graph_stats.c                    | 76 +++++++++++++++++++---
>  lib/graph/rte_graph.h                      | 10 +++
>  lib/graph/rte_graph_model_mcore_dispatch.c |  3 +
>  lib/graph/rte_graph_worker_common.h        |  2 +
>  5 files changed, 89 insertions(+), 8 deletions(-)
> 
> diff --git a/lib/graph/graph_debug.c b/lib/graph/graph_debug.c
> index b84412f5dd..9def3067ec 100644
> --- a/lib/graph/graph_debug.c
> +++ b/lib/graph/graph_debug.c
> @@ -74,6 +74,12 @@ rte_graph_obj_dump(FILE *f, struct rte_graph *g, bool
> all)
>  		fprintf(f, "       size=%d\n", n->size);
>  		fprintf(f, "       idx=%d\n", n->idx);
>  		fprintf(f, "       total_objs=%" PRId64 "\n", n->total_objs);
> +		if (rte_graph_worker_model_get(g) ==
> RTE_GRAPH_MODEL_MCORE_DISPATCH) {
> +			fprintf(f, "       total_sched_objs=%" PRId64 "\n",
> +				n->dispatch.total_sched_objs);
> +			fprintf(f, "       total_sched_fail=%" PRId64 "\n",
> +				n->dispatch.total_sched_fail);
> +		}
>  		fprintf(f, "       total_calls=%" PRId64 "\n", n->total_calls);
>  		for (i = 0; i < n->nb_edges; i++)
>  			fprintf(f, "          edge[%d] <%s>\n", i,
> diff --git a/lib/graph/graph_stats.c b/lib/graph/graph_stats.c
> index c0140ba922..cc32245c05 100644
> --- a/lib/graph/graph_stats.c
> +++ b/lib/graph/graph_stats.c
> @@ -40,13 +40,19 @@ struct rte_graph_cluster_stats {
>  	struct cluster_node clusters[];
>  } __rte_cache_aligned;
> 
> +#define boarder_model_dispatch()                                                              \
> +	fprintf(f, "+-------------------------------+---------------+--------" \
> +		   "-------+---------------+---------------+---------------+" \
> +		   "---------------+---------------+-" \
> +		   "----------+\n")
> +
>  #define boarder()                                                              \
>  	fprintf(f, "+-------------------------------+---------------+--------" \
>  		   "-------+---------------+---------------+---------------+-" \
>  		   "----------+\n")
> 
>  static inline void
> -print_banner(FILE *f)
> +print_banner_default(FILE *f)
>  {
>  	boarder();
>  	fprintf(f, "%-32s%-16s%-16s%-16s%-16s%-16s%-16s\n", "|Node",
> "|calls",
> @@ -55,6 +61,28 @@ print_banner(FILE *f)
>  	boarder();
>  }
> 
> +static inline void
> +print_banner_dispatch(FILE *f)
> +{
> +	boarder_model_dispatch();
> +	fprintf(f, "%-32s%-16s%-16s%-16s%-16s%-16s%-16s%-16s%-16s\n",
> +		"|Node", "|calls",
> +		"|objs", "|sched objs", "|sched fail",
> +		"|realloc_count", "|objs/call", "|objs/sec(10E6)",
> +		"|cycles/call|");
> +	boarder_model_dispatch();
> +}
> +
> +static inline void
> +print_banner(FILE *f)
> +{
> +	if
> (rte_graph_worker_model_get(STAILQ_FIRST(graph_list_head_get())-
> >graph) ==
> +	    RTE_GRAPH_MODEL_MCORE_DISPATCH)
> +		print_banner_dispatch(f);
> +	else
> +		print_banner_default(f);
> +}
> +
>  static inline void
>  print_node(FILE *f, const struct rte_graph_cluster_node_stats *stat)
>  {
> @@ -76,11 +104,22 @@ print_node(FILE *f, const struct
> rte_graph_cluster_node_stats *stat)
>  	objs_per_sec = ts_per_hz ? (objs - prev_objs) / ts_per_hz : 0;
>  	objs_per_sec /= 1000000;
> 
> -	fprintf(f,
> -		"|%-31s|%-15" PRIu64 "|%-15" PRIu64 "|%-15" PRIu64
> -		"|%-15.3f|%-15.6f|%-11.4f|\n",
> -		stat->name, calls, objs, stat->realloc_count, objs_per_call,
> -		objs_per_sec, cycles_per_call);
> +	if
> (rte_graph_worker_model_get(STAILQ_FIRST(graph_list_head_get())-
> >graph) ==
> +	    RTE_GRAPH_MODEL_MCORE_DISPATCH) {
> +		fprintf(f,
> +			"|%-31s|%-15" PRIu64 "|%-15" PRIu64 "|%-15"
> PRIu64
> +			"|%-15" PRIu64 "|%-15" PRIu64
> +			"|%-15.3f|%-15.6f|%-11.4f|\n",
> +			stat->name, calls, objs, stat->dispatch.sched_objs,
> +			stat->dispatch.sched_fail, stat->realloc_count,
> objs_per_call,
> +			objs_per_sec, cycles_per_call);
> +	} else {
> +		fprintf(f,
> +			"|%-31s|%-15" PRIu64 "|%-15" PRIu64 "|%-15"
> PRIu64
> +			"|%-15.3f|%-15.6f|%-11.4f|\n",
> +			stat->name, calls, objs, stat->realloc_count,
> objs_per_call,
> +			objs_per_sec, cycles_per_call);
> +	}
>  }
> 
>  static int
> @@ -88,13 +127,20 @@ graph_cluster_stats_cb(bool is_first, bool is_last,
> void *cookie,
>  		       const struct rte_graph_cluster_node_stats *stat)
>  {
>  	FILE *f = cookie;
> +	int model;
> +
> +	model =
> rte_graph_worker_model_get(STAILQ_FIRST(graph_list_head_get())-
> >graph);
> 
>  	if (unlikely(is_first))
>  		print_banner(f);
>  	if (stat->objs)
>  		print_node(f, stat);
> -	if (unlikely(is_last))
> -		boarder();
> +	if (unlikely(is_last)) {
> +		if (model == RTE_GRAPH_MODEL_MCORE_DISPATCH)
> +			boarder_model_dispatch();
> +		else
> +			boarder();
> +	}
> 
>  	return 0;
>  };
> @@ -333,12 +379,20 @@ cluster_node_arregate_stats(struct cluster_node
> *cluster)
>  {
>  	uint64_t calls = 0, cycles = 0, objs = 0, realloc_count = 0;
>  	struct rte_graph_cluster_node_stats *stat = &cluster->stat;
> +	uint64_t sched_objs = 0, sched_fail = 0;
>  	struct rte_node *node;
>  	rte_node_t count;
> +	int model;
> 
> +	model =
> rte_graph_worker_model_get(STAILQ_FIRST(graph_list_head_get())-
> >graph);
>  	for (count = 0; count < cluster->nb_nodes; count++) {
>  		node = cluster->nodes[count];
> 
> +		if (model == RTE_GRAPH_MODEL_MCORE_DISPATCH) {
> +			sched_objs += node->dispatch.total_sched_objs;
> +			sched_fail += node->dispatch.total_sched_fail;
> +		}
> +
>  		calls += node->total_calls;
>  		objs += node->total_objs;
>  		cycles += node->total_cycles;
> @@ -348,6 +402,12 @@ cluster_node_arregate_stats(struct cluster_node
> *cluster)
>  	stat->calls = calls;
>  	stat->objs = objs;
>  	stat->cycles = cycles;
> +
> +	if (model == RTE_GRAPH_MODEL_MCORE_DISPATCH) {
> +		stat->dispatch.sched_objs = sched_objs;
> +		stat->dispatch.sched_fail = sched_fail;
> +	}
> +
>  	stat->ts = rte_get_timer_cycles();
>  	stat->realloc_count = realloc_count;
>  }
> diff --git a/lib/graph/rte_graph.h b/lib/graph/rte_graph.h
> index 2ffee520b1..28e50e49b8 100644
> --- a/lib/graph/rte_graph.h
> +++ b/lib/graph/rte_graph.h
> @@ -220,6 +220,16 @@ struct rte_graph_cluster_node_stats {
>  	uint64_t prev_objs;	/**< Previous number of processed objs. */
>  	uint64_t prev_cycles;	/**< Previous number of cycles. */
> 
> +	RTE_STD_C11
> +	union {
> +		struct {
> +			uint64_t sched_objs;
> +			/**< Previous number of scheduled objs for dispatch
> model. */
> +			uint64_t sched_fail;
> +			/**< Previous number of failed schedule objs for
> dispatch model. */
> +		} dispatch;
> +	};
> +
>  	uint64_t realloc_count; /**< Realloc count. */
> 
>  	rte_node_t id;	/**< Node identifier of stats. */
> diff --git a/lib/graph/rte_graph_model_mcore_dispatch.c
> b/lib/graph/rte_graph_model_mcore_dispatch.c
> index 8f4bc860ab..d1291b8c57 100644
> --- a/lib/graph/rte_graph_model_mcore_dispatch.c
> +++ b/lib/graph/rte_graph_model_mcore_dispatch.c
> @@ -96,6 +96,7 @@ __graph_sched_node_enqueue(struct rte_node
> *node, struct rte_graph *graph)
>  		rte_pause();
> 
>  	off += size;
> +	node->dispatch.total_sched_objs += size;
>  	node->idx -= size;
>  	if (node->idx > 0)
>  		goto submit_again;
> @@ -107,6 +108,8 @@ __graph_sched_node_enqueue(struct rte_node
> *node, struct rte_graph *graph)
>  		memmove(&node->objs[0], &node->objs[off],
>  			node->idx * sizeof(void *));
> 
> +	node->dispatch.total_sched_fail += node->idx;
> +
>  	return false;
>  }
> 
> diff --git a/lib/graph/rte_graph_worker_common.h
> b/lib/graph/rte_graph_worker_common.h
> index d6a16dc7e3..a6bae4c6a5 100644
> --- a/lib/graph/rte_graph_worker_common.h
> +++ b/lib/graph/rte_graph_worker_common.h
> @@ -110,6 +110,8 @@ struct rte_node {
>  		/* Fast schedule area for mcore dispatch model */
>  		struct {
>  			unsigned int lcore_id;  /**< Node running lcore. */
> +			uint64_t total_sched_objs; /**< Number of objects
> scheduled. */
> +			uint64_t total_sched_fail; /**< Number of scheduled
> failure. */
>  		} dispatch;
>  	};
>  	/* Fast path area  */
> --
> 2.37.2
  

Patch

diff --git a/lib/graph/graph_debug.c b/lib/graph/graph_debug.c
index b84412f5dd..9def3067ec 100644
--- a/lib/graph/graph_debug.c
+++ b/lib/graph/graph_debug.c
@@ -74,6 +74,12 @@  rte_graph_obj_dump(FILE *f, struct rte_graph *g, bool all)
 		fprintf(f, "       size=%d\n", n->size);
 		fprintf(f, "       idx=%d\n", n->idx);
 		fprintf(f, "       total_objs=%" PRId64 "\n", n->total_objs);
+		if (rte_graph_worker_model_get(g) == RTE_GRAPH_MODEL_MCORE_DISPATCH) {
+			fprintf(f, "       total_sched_objs=%" PRId64 "\n",
+				n->dispatch.total_sched_objs);
+			fprintf(f, "       total_sched_fail=%" PRId64 "\n",
+				n->dispatch.total_sched_fail);
+		}
 		fprintf(f, "       total_calls=%" PRId64 "\n", n->total_calls);
 		for (i = 0; i < n->nb_edges; i++)
 			fprintf(f, "          edge[%d] <%s>\n", i,
diff --git a/lib/graph/graph_stats.c b/lib/graph/graph_stats.c
index c0140ba922..cc32245c05 100644
--- a/lib/graph/graph_stats.c
+++ b/lib/graph/graph_stats.c
@@ -40,13 +40,19 @@  struct rte_graph_cluster_stats {
 	struct cluster_node clusters[];
 } __rte_cache_aligned;
 
+#define boarder_model_dispatch()                                                              \
+	fprintf(f, "+-------------------------------+---------------+--------" \
+		   "-------+---------------+---------------+---------------+" \
+		   "---------------+---------------+-" \
+		   "----------+\n")
+
 #define boarder()                                                              \
 	fprintf(f, "+-------------------------------+---------------+--------" \
 		   "-------+---------------+---------------+---------------+-" \
 		   "----------+\n")
 
 static inline void
-print_banner(FILE *f)
+print_banner_default(FILE *f)
 {
 	boarder();
 	fprintf(f, "%-32s%-16s%-16s%-16s%-16s%-16s%-16s\n", "|Node", "|calls",
@@ -55,6 +61,28 @@  print_banner(FILE *f)
 	boarder();
 }
 
+static inline void
+print_banner_dispatch(FILE *f)
+{
+	boarder_model_dispatch();
+	fprintf(f, "%-32s%-16s%-16s%-16s%-16s%-16s%-16s%-16s%-16s\n",
+		"|Node", "|calls",
+		"|objs", "|sched objs", "|sched fail",
+		"|realloc_count", "|objs/call", "|objs/sec(10E6)",
+		"|cycles/call|");
+	boarder_model_dispatch();
+}
+
+static inline void
+print_banner(FILE *f)
+{
+	if (rte_graph_worker_model_get(STAILQ_FIRST(graph_list_head_get())->graph) ==
+	    RTE_GRAPH_MODEL_MCORE_DISPATCH)
+		print_banner_dispatch(f);
+	else
+		print_banner_default(f);
+}
+
 static inline void
 print_node(FILE *f, const struct rte_graph_cluster_node_stats *stat)
 {
@@ -76,11 +104,22 @@  print_node(FILE *f, const struct rte_graph_cluster_node_stats *stat)
 	objs_per_sec = ts_per_hz ? (objs - prev_objs) / ts_per_hz : 0;
 	objs_per_sec /= 1000000;
 
-	fprintf(f,
-		"|%-31s|%-15" PRIu64 "|%-15" PRIu64 "|%-15" PRIu64
-		"|%-15.3f|%-15.6f|%-11.4f|\n",
-		stat->name, calls, objs, stat->realloc_count, objs_per_call,
-		objs_per_sec, cycles_per_call);
+	if (rte_graph_worker_model_get(STAILQ_FIRST(graph_list_head_get())->graph) ==
+	    RTE_GRAPH_MODEL_MCORE_DISPATCH) {
+		fprintf(f,
+			"|%-31s|%-15" PRIu64 "|%-15" PRIu64 "|%-15" PRIu64
+			"|%-15" PRIu64 "|%-15" PRIu64
+			"|%-15.3f|%-15.6f|%-11.4f|\n",
+			stat->name, calls, objs, stat->dispatch.sched_objs,
+			stat->dispatch.sched_fail, stat->realloc_count, objs_per_call,
+			objs_per_sec, cycles_per_call);
+	} else {
+		fprintf(f,
+			"|%-31s|%-15" PRIu64 "|%-15" PRIu64 "|%-15" PRIu64
+			"|%-15.3f|%-15.6f|%-11.4f|\n",
+			stat->name, calls, objs, stat->realloc_count, objs_per_call,
+			objs_per_sec, cycles_per_call);
+	}
 }
 
 static int
@@ -88,13 +127,20 @@  graph_cluster_stats_cb(bool is_first, bool is_last, void *cookie,
 		       const struct rte_graph_cluster_node_stats *stat)
 {
 	FILE *f = cookie;
+	int model;
+
+	model = rte_graph_worker_model_get(STAILQ_FIRST(graph_list_head_get())->graph);
 
 	if (unlikely(is_first))
 		print_banner(f);
 	if (stat->objs)
 		print_node(f, stat);
-	if (unlikely(is_last))
-		boarder();
+	if (unlikely(is_last)) {
+		if (model == RTE_GRAPH_MODEL_MCORE_DISPATCH)
+			boarder_model_dispatch();
+		else
+			boarder();
+	}
 
 	return 0;
 };
@@ -333,12 +379,20 @@  cluster_node_arregate_stats(struct cluster_node *cluster)
 {
 	uint64_t calls = 0, cycles = 0, objs = 0, realloc_count = 0;
 	struct rte_graph_cluster_node_stats *stat = &cluster->stat;
+	uint64_t sched_objs = 0, sched_fail = 0;
 	struct rte_node *node;
 	rte_node_t count;
+	int model;
 
+	model = rte_graph_worker_model_get(STAILQ_FIRST(graph_list_head_get())->graph);
 	for (count = 0; count < cluster->nb_nodes; count++) {
 		node = cluster->nodes[count];
 
+		if (model == RTE_GRAPH_MODEL_MCORE_DISPATCH) {
+			sched_objs += node->dispatch.total_sched_objs;
+			sched_fail += node->dispatch.total_sched_fail;
+		}
+
 		calls += node->total_calls;
 		objs += node->total_objs;
 		cycles += node->total_cycles;
@@ -348,6 +402,12 @@  cluster_node_arregate_stats(struct cluster_node *cluster)
 	stat->calls = calls;
 	stat->objs = objs;
 	stat->cycles = cycles;
+
+	if (model == RTE_GRAPH_MODEL_MCORE_DISPATCH) {
+		stat->dispatch.sched_objs = sched_objs;
+		stat->dispatch.sched_fail = sched_fail;
+	}
+
 	stat->ts = rte_get_timer_cycles();
 	stat->realloc_count = realloc_count;
 }
diff --git a/lib/graph/rte_graph.h b/lib/graph/rte_graph.h
index 2ffee520b1..28e50e49b8 100644
--- a/lib/graph/rte_graph.h
+++ b/lib/graph/rte_graph.h
@@ -220,6 +220,16 @@  struct rte_graph_cluster_node_stats {
 	uint64_t prev_objs;	/**< Previous number of processed objs. */
 	uint64_t prev_cycles;	/**< Previous number of cycles. */
 
+	RTE_STD_C11
+	union {
+		struct {
+			uint64_t sched_objs;
+			/**< Previous number of scheduled objs for dispatch model. */
+			uint64_t sched_fail;
+			/**< Previous number of failed schedule objs for dispatch model. */
+		} dispatch;
+	};
+
 	uint64_t realloc_count; /**< Realloc count. */
 
 	rte_node_t id;	/**< Node identifier of stats. */
diff --git a/lib/graph/rte_graph_model_mcore_dispatch.c b/lib/graph/rte_graph_model_mcore_dispatch.c
index 8f4bc860ab..d1291b8c57 100644
--- a/lib/graph/rte_graph_model_mcore_dispatch.c
+++ b/lib/graph/rte_graph_model_mcore_dispatch.c
@@ -96,6 +96,7 @@  __graph_sched_node_enqueue(struct rte_node *node, struct rte_graph *graph)
 		rte_pause();
 
 	off += size;
+	node->dispatch.total_sched_objs += size;
 	node->idx -= size;
 	if (node->idx > 0)
 		goto submit_again;
@@ -107,6 +108,8 @@  __graph_sched_node_enqueue(struct rte_node *node, struct rte_graph *graph)
 		memmove(&node->objs[0], &node->objs[off],
 			node->idx * sizeof(void *));
 
+	node->dispatch.total_sched_fail += node->idx;
+
 	return false;
 }
 
diff --git a/lib/graph/rte_graph_worker_common.h b/lib/graph/rte_graph_worker_common.h
index d6a16dc7e3..a6bae4c6a5 100644
--- a/lib/graph/rte_graph_worker_common.h
+++ b/lib/graph/rte_graph_worker_common.h
@@ -110,6 +110,8 @@  struct rte_node {
 		/* Fast schedule area for mcore dispatch model */
 		struct {
 			unsigned int lcore_id;  /**< Node running lcore. */
+			uint64_t total_sched_objs; /**< Number of objects scheduled. */
+			uint64_t total_sched_fail; /**< Number of scheduled failure. */
 		} dispatch;
 	};
 	/* Fast path area  */