@@ -64,6 +64,6 @@ struct cpu_data_source {
int out_write_cpu_data(struct tracecmd_output *handle, int cpus,
struct cpu_data_source *data, const char *buff_name);
off64_t msg_lseek(struct tracecmd_msg_handle *msg_handle, off_t offset, int whence);
-
+unsigned long long get_last_option_offset(struct tracecmd_input *handle);
#endif /* _TRACE_CMD_LOCAL_H */
@@ -178,6 +178,7 @@ struct tracecmd_input {
struct file_section *sections;
bool options_init;
unsigned long long options_start;
+ unsigned long long options_last_offset;
size_t total_file_size;
/* For custom profilers. */
@@ -2916,6 +2917,30 @@ tracecmd_search_task_map(struct tracecmd_input *handle,
return lib;
}
+__hidden unsigned long long get_last_option_offset(struct tracecmd_input *handle)
+{
+ return handle->options_last_offset;
+}
+
+static int handle_option_done(struct tracecmd_input *handle, char *buf, int size)
+{
+ unsigned long long offset;
+
+ if (size < 8)
+ return -1;
+ offset = lseek64(handle->fd, 0, SEEK_CUR);
+ if (offset >= size)
+ handle->options_last_offset = offset - size;
+ offset = tep_read_number(handle->pevent, buf, 8);
+ if (!offset)
+ return 0;
+
+ if (lseek64(handle->fd, offset, SEEK_SET) == (off_t)-1)
+ return -1;
+
+ return handle_options(handle);
+}
+
#define save_read_number(R, C) \
do { \
if ((C) > size) \
@@ -3160,6 +3185,12 @@ static int handle_options(struct tracecmd_input *handle)
break;
add_section(handle, option, -1, tep_read_number(handle->pevent, buf, 8), 0);
break;
+ case TRACECMD_OPTION_DONE:
+ if (comperss)
+ in_uncompress_reset(handle);
+ ret = handle_option_done(handle, buf, size);
+ free(buf);
+ return ret;
default:
tracecmd_warning("unknown option %d", option);
break;
@@ -2409,7 +2409,7 @@ struct tracecmd_output *tracecmd_get_output_handle_fd(int fd)
tep_ref(handle->pevent);
handle->page_size = tracecmd_page_size(ihandle);
handle->file_version = tracecmd_get_in_file_version(ihandle);
- handle->options_start = tracecmd_get_options_offset(ihandle);
+ handle->options_start = get_last_option_offset(ihandle);
list_head_init(&handle->options);
list_head_init(&handle->buffers);
In trace file version 7 the DONE option is extended to store the offset in the file to the next options section. This way a list of options sections can be stored in the file. Added logic to recursively read all option sections from the file. Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com> --- lib/trace-cmd/include/trace-cmd-local.h | 2 +- lib/trace-cmd/trace-input.c | 31 +++++++++++++++++++++++++ lib/trace-cmd/trace-output.c | 2 +- 3 files changed, 33 insertions(+), 2 deletions(-)