[dpdk-dev] [PATCH v1 11/32] eal/trace: implement trace save

Mattias Rönnblom mattias.ronnblom at ericsson.com
Thu Mar 19 20:07:00 CET 2020


On 2020-03-18 20:02, jerinj at marvell.com wrote:
> From: Jerin Jacob <jerinj at marvell.com>
>
> Implement rte_trace_save(), which will save the metadata
> file and trace memory snapshot to the trace directory.
>
> Signed-off-by: Jerin Jacob <jerinj at marvell.com>
> ---
>   .../common/eal_common_trace_utils.c           | 75 +++++++++++++++++++
>   lib/librte_eal/rte_eal_version.map            |  1 +
>   2 files changed, 76 insertions(+)
>
> diff --git a/lib/librte_eal/common/eal_common_trace_utils.c b/lib/librte_eal/common/eal_common_trace_utils.c
> index dbeb36668..230e4ac95 100644
> --- a/lib/librte_eal/common/eal_common_trace_utils.c
> +++ b/lib/librte_eal/common/eal_common_trace_utils.c
> @@ -213,3 +213,78 @@ trace_mkdir(void)
>   	return 0;
>   }
>   
> +static int
> +trace_meta_save(struct trace *trace)
> +{
> +	char file_name[PATH_MAX];
> +	FILE *f;
> +	int rc;
> +
> +	rc = snprintf(file_name, PATH_MAX, "%s/metadata", trace->dir);
> +	if (rc < 0)
> +		return rc;
> +
> +	f = fopen(file_name, "w");
> +	if (f == NULL)
> +		return -errno;
> +
> +	rc = rte_trace_metadata_dump(f);
> +
> +	fclose(f);
Check fclose() return code.
> +	return rc;
> +}
> +
> +
> +static inline int
> +trace_file_sz(struct __rte_trace_header *hdr)
> +{
> +	return sizeof(struct __rte_trace_stream_header) + hdr->offset;
> +}
> +
> +static int
> +trace_mem_save(struct trace *trace, struct __rte_trace_header *hdr,
> +	       uint32_t cnt)
> +{
> +	char file_name[PATH_MAX];
> +	FILE *f;
> +	int rc;
> +
> +	rc = snprintf(file_name, PATH_MAX, "%s/channel0_%d", trace->dir, cnt);
> +	if (rc < 0)
> +		return rc;
> +
> +	f = fopen(file_name, "w");
> +	if (f == NULL)
> +		return -errno;
> +
> +	rc = fwrite(&hdr->stream_header, trace_file_sz(hdr), 1, f);
> +	fclose(f);
Again, check return code.
> +
> +	return rc == 1 ?  0 : -EACCES;
> +}
> +
> +int
> +rte_trace_save(void)
> +{
> +	struct trace *trace = trace_obj_get();
> +	struct __rte_trace_header *header;
> +	uint32_t count;
> +	int rc = 0;
> +
> +	if (trace->nb_trace_mem_list == 0)
> +		return rc;
> +
> +	rc = trace_meta_save(trace);
> +	if (rc)
> +		return rc;
> +
> +	rte_spinlock_lock(&trace->lock);
> +	for (count = 0; count < trace->nb_trace_mem_list; count++) {
> +		header = trace->lcore_meta[count].mem;
> +		rc =  trace_mem_save(trace, header, count);
> +		if (rc)
> +			break;
> +	}
> +	rte_spinlock_unlock(&trace->lock);
> +	return rc;
> +}
> diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map
> index cae358608..f56d1867e 100644
> --- a/lib/librte_eal/rte_eal_version.map
> +++ b/lib/librte_eal/rte_eal_version.map
> @@ -358,6 +358,7 @@ EXPERIMENTAL {
>   	rte_trace_mode_get;
>   	rte_trace_pattern;
>   	rte_trace_regexp;
> +	rte_trace_save;
>   	rte_trace_from_name;
>   	rte_trace_metadata_dump;
>   	rte_trace_dump;




More information about the dev mailing list