Em Thu, Oct 10, 2019 at 11:36:46AM -0700, Ian Rogers escreveu:
> Reduce duplicated logic by using the subcmd library. Ensure when errors
> occur they are reported to the caller. Before this patch, if no lines are
> read the error status is 0.

Thanks, applied and tested.

- Arnaldo
 
> Signed-off-by: Ian Rogers <[email protected]>
> ---
>  tools/perf/util/annotate.c | 71 +++++++++++++++++++-------------------
>  1 file changed, 36 insertions(+), 35 deletions(-)
> 
> diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c
> index 1487849a191a..fc12c5cfe112 100644
> --- a/tools/perf/util/annotate.c
> +++ b/tools/perf/util/annotate.c
> @@ -43,6 +43,7 @@
>  #include <linux/string.h>
>  #include <bpf/libbpf.h>
>  #include <subcmd/parse-options.h>
> +#include <subcmd/run-command.h>
>  
>  /* FIXME: For the HE_COLORSET */
>  #include "ui/browser.h"
> @@ -1843,12 +1844,18 @@ static int symbol__disassemble(struct symbol *sym, 
> struct annotate_args *args)
>       struct kcore_extract kce;
>       bool delete_extract = false;
>       bool decomp = false;
> -     int stdout_fd[2];
>       int lineno = 0;
>       int nline;
> -     pid_t pid;
>       char *line;
>       size_t line_len;
> +     const char *objdump_argv[] = {
> +             "/bin/sh",
> +             "-c",
> +             NULL, /* Will be the objdump command to run. */
> +             "--",
> +             NULL, /* Will be the symfs path. */
> +     };
> +     struct child_process objdump_process;
>       int err = dso__disassemble_filename(dso, symfs_filename, 
> sizeof(symfs_filename));
>  
>       if (err)
> @@ -1878,7 +1885,7 @@ static int symbol__disassemble(struct symbol *sym, 
> struct annotate_args *args)
>  
>               if (dso__decompress_kmodule_path(dso, symfs_filename,
>                                                tmp, sizeof(tmp)) < 0)
> -                     goto out;
> +                     return -1;
>  
>               decomp = true;
>               strcpy(symfs_filename, tmp);
> @@ -1903,38 +1910,28 @@ static int symbol__disassemble(struct symbol *sym, 
> struct annotate_args *args)
>  
>       pr_debug("Executing: %s\n", command);
>  
> -     err = -1;
> -     if (pipe(stdout_fd) < 0) {
> -             pr_err("Failure creating the pipe to run %s\n", command);
> -             goto out_free_command;
> -     }
> -
> -     pid = fork();
> -     if (pid < 0) {
> -             pr_err("Failure forking to run %s\n", command);
> -             goto out_close_stdout;
> -     }
> +     objdump_argv[2] = command;
> +     objdump_argv[4] = symfs_filename;
>  
> -     if (pid == 0) {
> -             close(stdout_fd[0]);
> -             dup2(stdout_fd[1], 1);
> -             close(stdout_fd[1]);
> -             execl("/bin/sh", "sh", "-c", command, "--", symfs_filename,
> -                   NULL);
> -             perror(command);
> -             exit(-1);
> +     /* Create a pipe to read from for stdout */
> +     memset(&objdump_process, 0, sizeof(objdump_process));
> +     objdump_process.argv = objdump_argv;
> +     objdump_process.out = -1;
> +     if (start_command(&objdump_process)) {
> +             pr_err("Failure starting to run %s\n", command);
> +             err = -1;
> +             goto out_free_command;
>       }
>  
> -     close(stdout_fd[1]);
> -
> -     file = fdopen(stdout_fd[0], "r");
> +     file = fdopen(objdump_process.out, "r");
>       if (!file) {
>               pr_err("Failure creating FILE stream for %s\n", command);
>               /*
>                * If we were using debug info should retry with
>                * original binary.
>                */
> -             goto out_free_command;
> +             err = -1;
> +             goto out_close_stdout;
>       }
>  
>       /* Storage for getline. */
> @@ -1958,8 +1955,14 @@ static int symbol__disassemble(struct symbol *sym, 
> struct annotate_args *args)
>       }
>       free(line);
>  
> -     if (nline == 0)
> +     err = finish_command(&objdump_process);
> +     if (err)
> +             pr_err("Error running %s\n", command);
> +
> +     if (nline == 0) {
> +             err = -1;
>               pr_err("No output from %s\n", command);
> +     }
>  
>       /*
>        * kallsyms does not have symbol sizes so there may a nop at the end.
> @@ -1969,23 +1972,21 @@ static int symbol__disassemble(struct symbol *sym, 
> struct annotate_args *args)
>               delete_last_nop(sym);
>  
>       fclose(file);
> -     err = 0;
> +
> +out_close_stdout:
> +     close(objdump_process.out);
> +
>  out_free_command:
>       free(command);
> -out_remove_tmp:
> -     close(stdout_fd[0]);
>  
> +out_remove_tmp:
>       if (decomp)
>               unlink(symfs_filename);
>  
>       if (delete_extract)
>               kcore_extract__delete(&kce);
> -out:
> -     return err;
>  
> -out_close_stdout:
> -     close(stdout_fd[1]);
> -     goto out_free_command;
> +     return err;
>  }
>  
>  static void calc_percent(struct sym_hist *sym_hist,
> -- 
> 2.23.0.581.g78d2f28ef7-goog

-- 

- Arnaldo

Reply via email to