On 2020-03-18 20:02, jer...@marvell.com wrote:
> From: Jerin Jacob <jer...@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 <jer...@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;


Reply via email to