----- "Michael Holzheu" <holzheu@xxxxxxxxxxxxxxxxxx> wrote: > Hello Dave, > > Could you please include the following patch: > > This patch adds a new option "-s" to the s390dbf command. With this option > it is possible to save the content of the s390 debug feature (a driver > tracing infrastructure) to the specified directory. As output exactly the same > directory tree is created as it can be seen on a live system under > "/sys/kernel/debug/s390dbf". > > Michael Sure -- queued for the next release. Thanks, Dave > Signed-off-by: Michael Holzheu <holzheu@xxxxxxxxxxxxxxxxxx> > --- > s390dbf.c | 126 > +++++++++++++++++++++++++++++++++++++++++++++++++++++++------- > 1 file changed, 113 insertions(+), 13 deletions(-) > > --- a/s390dbf.c > +++ b/s390dbf.c > @@ -204,6 +204,7 @@ static inline kaddr_t kl_funcaddr(kaddr_ > > #define LOAD_FLAG (1 << C_LFLG_SHFT) > #define VIEWS_FLAG (2 << C_LFLG_SHFT) > +#define SAVE_DBF_FLAG (4 << C_LFLG_SHFT) > > #ifndef MIN > #define MIN(a,b) (((a)<(b))?(a):(b)) > @@ -215,7 +216,7 @@ static inline kaddr_t kl_funcaddr(kaddr_ > #define DBF_VERSION_V2 2 > #define PAGE_SIZE 4096 > #define DEBUG_MAX_VIEWS 10 /* max number of views in proc fs */ > -#define DEBUG_MAX_PROCF_LEN 16 /* max length for a proc file name */ > +#define DEBUG_MAX_PROCF_LEN 64 /* max length for a proc file name */ > #define DEBUG_SPRINTF_MAX_ARGS 10 > > /* define debug-structures for lcrash */ > @@ -1039,6 +1040,18 @@ free_debug_info_v2(debug_info_t * db_inf > free(db_info); > } > > +static void > +debug_write_output(debug_info_t *db_info, debug_view_t *db_view, FILE > * fp) > +{ > + if (dbf_version == DBF_VERSION_V1) { > + debug_format_output_v1(db_info, db_view, fp); > + free_debug_info_v1(db_info); > + } else { > + debug_format_output_v2(db_info, db_view, fp); > + free_debug_info_v2(db_info); > + } > +} > + > static int > get_debug_areas(void) > { > @@ -1140,13 +1153,7 @@ list_one_view(char *area_name, char *vie > fprintf(cmd->efp, "View '%s' not registered!\n", view_name); > return -1; > } > - if(dbf_version == DBF_VERSION_V1){ > - debug_format_output_v1(db_info, db_view, cmd->ofp); > - free_debug_info_v1(db_info); > - } else { > - debug_format_output_v2(db_info, db_view, cmd->ofp); > - free_debug_info_v2(db_info); > - } > + debug_write_output(db_info, db_view, cmd->ofp); > return 0; > } > > @@ -1222,6 +1229,86 @@ load_debug_view(const char *path, comman > } > #endif > > +static int > +save_one_view(const char *dbf_dir_name, const char *area_name, > + const char *view_name, command_t *cmd) > +{ > + char path_view[PATH_MAX]; > + debug_info_t *db_info; > + debug_view_t *db_view; > + FILE *view_fh; > + > + db_info = find_debug_area(area_name); > + if (db_info == NULL) { > + fprintf(cmd->efp, "Debug log '%s' not found!\n", area_name); > + return -1; > + } > + db_info = get_debug_info(db_info->addr, 1); > + > + db_view = find_lcrash_debug_view(view_name); > + if (db_view == NULL) { > + fprintf(cmd->efp, "View '%s' not registered!\n", view_name); > + return -1; > + } > + sprintf(path_view, "%s/%s/%s", dbf_dir_name, area_name, view_name); > + view_fh = fopen(path_view, "w"); > + if (view_fh == NULL) { > + fprintf(cmd->efp, "Could not create file: %s (%s)\n", > + path_view, strerror(errno)); > + return -1; > + } > + debug_write_output(db_info, db_view, view_fh); > + fclose(view_fh); > + return 0; > +} > + > +static int > +save_one_area(const char *dbf_dir_name, const char *area_name, > command_t *cmd) > +{ > + char dir_name_area[PATH_MAX]; > + debug_info_t *db_info; > + int i; > + > + db_info = find_debug_area(area_name); > + if (db_info == NULL) { > + fprintf(cmd->efp, "Debug log '%s' not found!\n", area_name); > + return -1; > + } > + sprintf(dir_name_area, "%s/%s", dbf_dir_name, area_name); > + if (mkdir(dir_name_area, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != > 0) { > + fprintf(cmd->efp, "Could not create directory: %s (%s)\n", > + dir_name_area, strerror(errno)); > + return -1; > + } > + for (i = 0; i < DEBUG_MAX_VIEWS; i++) { > + if (db_info->views[i] == NULL) > + continue; > + if (!find_lcrash_debug_view(db_info->views[i]->name)) > + continue; > + save_one_view(dbf_dir_name, area_name, db_info->views[i]->name, > + cmd); > + } > + return 0; > +} > + > +static void > +save_dbf(const char *dbf_dir_name, command_t *cmd) > +{ > + debug_info_t *act_debug_info = debug_area_first; > + FILE *ofp = cmd->ofp; > + > + fprintf(ofp, "Saving s390dbf to directory \"%s\"\n", dbf_dir_name); > + if (mkdir(dbf_dir_name, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0) > { > + fprintf(cmd->efp, "Could not create directory: %s (%s)\n", > + dbf_dir_name, strerror(errno)); > + return; > + } > + while (act_debug_info != NULL) { > + save_one_area(dbf_dir_name, act_debug_info->name, cmd); > + act_debug_info = act_debug_info->next; > + } > +} > + > /* > * s390dbf_cmd() -- Run the 's390dbf' command. > */ > @@ -1272,6 +1359,14 @@ s390dbf_cmd(command_t * cmd) > if(get_debug_areas() == -1) > return -1; > > + if (cmd->flags & SAVE_DBF_FLAG) { > + if (cmd->nargs != 2) { > + fprintf(cmd->efp, "Specify directory name for -s\n"); > + return 1; > + } > + save_dbf(cmd->args[1], cmd); > + return 0; > + } > switch (cmd->nargs) { > case 0: > rc = list_areas(cmd->ofp); > @@ -1289,7 +1384,7 @@ s390dbf_cmd(command_t * cmd) > return rc; > } > > -#define _S390DBF_USAGE " [-v] [debug log] [debug view]" > +#define _S390DBF_USAGE " [-v] [-s dirname] [debug log] [debug view]" > > /* > * s390dbf_usage() -- Print the usage string for the 's390dbf' > command. > @@ -1307,17 +1402,19 @@ s390dbf_usage(command_t * cmd) > char *help_s390dbf[] = { > "s390dbf", > "s390dbf prints out debug feature logs", > - "[-v] [debug_log] [debug_log view]", > + "[-v] [-s dirname] [debug log] [debug view]" > "", > "Display Debug logs:", > " + If called without parameters, all active debug logs are > listed.", > - " + If called with '-v', all debug views which are available to", > - " 'crash' are listed", > " + If called with the name of a debug log, all debug-views for > which", > " the debug-log has registered are listed. It is possible > thatsome", > " of the debug views are not available to 'crash'.", > " + If called with the name of a debug-log and an available > viewname,", > " the specified view is printed.", > + " + If called with '-s dirname', the s390dbf is saved to the > specified", > + " directory", > + " + If called with '-v', all debug views which are available to", > + " 'crash' are listed", > NULL > }; > > @@ -1336,11 +1433,14 @@ void cmd_s390dbf() > for (i=1; i < argcnt; i++) > cmd.args[i-1] = args[i]; > > - while ((c = getopt(argcnt, args, "v")) != EOF) { > + while ((c = getopt(argcnt, args, "vs")) != EOF) { > switch(c) { > case 'v': > cmd.flags |= VIEWS_FLAG; > break; > + case 's': > + cmd.flags |= SAVE_DBF_FLAG; > + break; > default: > s390dbf_usage(&cmd); > return; > > > -- > Crash-utility mailing list > Crash-utility@xxxxxxxxxx > https://www.redhat.com/mailman/listinfo/crash-utility -- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/crash-utility