169 lines
4.4 KiB
Diff
169 lines
4.4 KiB
Diff
From b3f4cadee6a1f296fe265bb64f3b5e18d5da043b Mon Sep 17 00:00:00 2001
|
|
From: John Garry <john.garry@huawei.com>
|
|
Date: Thu, 22 Oct 2020 19:02:26 +0800
|
|
Subject: [PATCH 154/201] perf jevents: Tidy error handling
|
|
|
|
mainline inclusion
|
|
from mainline-v5.11-rc1
|
|
commit fa1b41a74d1136cbdd6960f36d7b9c7aa35c8139
|
|
category: feature
|
|
bugzilla: https://gitee.com/openeuler/kernel/issues/I8C0CX
|
|
|
|
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=fa1b41a74d1136cbdd6960f36d7b9c7aa35c8139
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
There is much duplication in the error handling for directory transvering
|
|
for prcessing JSONs.
|
|
|
|
Factor out the common code to tidy a bit.
|
|
|
|
Signed-off-by: John Garry <john.garry@huawei.com>
|
|
Reviewed-By: Kajol Jain<kjain@linux.ibm.com>
|
|
Link: https://lore.kernel.org/r/1603364547-197086-2-git-send-email-john.garry@huawei.com
|
|
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
|
|
Signed-off-by: hongrongxuan <hongrongxuan@huawei.com>
|
|
---
|
|
tools/perf/pmu-events/jevents.c | 83 ++++++++++++++-------------------
|
|
1 file changed, 35 insertions(+), 48 deletions(-)
|
|
|
|
diff --git a/tools/perf/pmu-events/jevents.c b/tools/perf/pmu-events/jevents.c
|
|
index c84180b7fd3d..b988fa2fa270 100644
|
|
--- a/tools/perf/pmu-events/jevents.c
|
|
+++ b/tools/perf/pmu-events/jevents.c
|
|
@@ -1100,12 +1100,13 @@ static int process_one_file(const char *fpath, const struct stat *sb,
|
|
*/
|
|
int main(int argc, char *argv[])
|
|
{
|
|
- int rc, ret = 0;
|
|
+ int rc, ret = 0, empty_map = 0;
|
|
int maxfds;
|
|
char ldirname[PATH_MAX];
|
|
const char *arch;
|
|
const char *output_file;
|
|
const char *start_dirname;
|
|
+ char *err_string_ext = "";
|
|
struct stat stbuf;
|
|
|
|
prog = basename(argv[0]);
|
|
@@ -1133,7 +1134,8 @@ int main(int argc, char *argv[])
|
|
/* If architecture does not have any event lists, bail out */
|
|
if (stat(ldirname, &stbuf) < 0) {
|
|
pr_info("%s: Arch %s has no PMU event lists\n", prog, arch);
|
|
- goto empty_map;
|
|
+ empty_map = 1;
|
|
+ goto err_close_eventsfp;
|
|
}
|
|
|
|
/* Include pmu-events.h first */
|
|
@@ -1150,75 +1152,60 @@ int main(int argc, char *argv[])
|
|
*/
|
|
|
|
maxfds = get_maxfds();
|
|
- mapfile = NULL;
|
|
rc = nftw(ldirname, preprocess_arch_std_files, maxfds, 0);
|
|
- if (rc && verbose) {
|
|
- pr_info("%s: Error preprocessing arch standard files %s\n",
|
|
- prog, ldirname);
|
|
- goto empty_map;
|
|
- } else if (rc < 0) {
|
|
- /* Make build fail */
|
|
- fclose(eventsfp);
|
|
- free_arch_std_events();
|
|
- return 1;
|
|
- } else if (rc) {
|
|
- goto empty_map;
|
|
- }
|
|
+ if (rc)
|
|
+ goto err_processing_std_arch_event_dir;
|
|
|
|
rc = nftw(ldirname, process_one_file, maxfds, 0);
|
|
- if (rc && verbose) {
|
|
- pr_info("%s: Error walking file tree %s\n", prog, ldirname);
|
|
- goto empty_map;
|
|
- } else if (rc < 0) {
|
|
- /* Make build fail */
|
|
- fclose(eventsfp);
|
|
- free_arch_std_events();
|
|
- ret = 1;
|
|
- goto out_free_mapfile;
|
|
- } else if (rc) {
|
|
- goto empty_map;
|
|
- }
|
|
+ if (rc)
|
|
+ goto err_processing_dir;
|
|
|
|
sprintf(ldirname, "%s/test", start_dirname);
|
|
|
|
rc = nftw(ldirname, process_one_file, maxfds, 0);
|
|
- if (rc && verbose) {
|
|
- pr_info("%s: Error walking file tree %s rc=%d for test\n",
|
|
- prog, ldirname, rc);
|
|
- goto empty_map;
|
|
- } else if (rc < 0) {
|
|
- /* Make build fail */
|
|
- free_arch_std_events();
|
|
- ret = 1;
|
|
- goto out_free_mapfile;
|
|
- } else if (rc) {
|
|
- goto empty_map;
|
|
- }
|
|
+ if (rc)
|
|
+ goto err_processing_dir;
|
|
|
|
if (close_table)
|
|
print_events_table_suffix(eventsfp);
|
|
|
|
if (!mapfile) {
|
|
pr_info("%s: No CPU->JSON mapping?\n", prog);
|
|
- goto empty_map;
|
|
+ empty_map = 1;
|
|
+ goto err_close_eventsfp;
|
|
}
|
|
|
|
- if (process_mapfile(eventsfp, mapfile)) {
|
|
+ rc = process_mapfile(eventsfp, mapfile);
|
|
+ fclose(eventsfp);
|
|
+ if (rc) {
|
|
pr_info("%s: Error processing mapfile %s\n", prog, mapfile);
|
|
/* Make build fail */
|
|
- fclose(eventsfp);
|
|
- free_arch_std_events();
|
|
ret = 1;
|
|
+ goto err_out;
|
|
}
|
|
|
|
+ free_arch_std_events();
|
|
+ free(mapfile);
|
|
+ return 0;
|
|
|
|
- goto out_free_mapfile;
|
|
-
|
|
-empty_map:
|
|
+err_processing_std_arch_event_dir:
|
|
+ err_string_ext = " for std arch event";
|
|
+err_processing_dir:
|
|
+ if (verbose) {
|
|
+ pr_info("%s: Error walking file tree %s%s\n", prog, ldirname,
|
|
+ err_string_ext);
|
|
+ empty_map = 1;
|
|
+ } else if (rc < 0) {
|
|
+ ret = 1;
|
|
+ } else {
|
|
+ empty_map = 1;
|
|
+ }
|
|
+err_close_eventsfp:
|
|
fclose(eventsfp);
|
|
- create_empty_mapping(output_file);
|
|
+ if (empty_map)
|
|
+ create_empty_mapping(output_file);
|
|
+err_out:
|
|
free_arch_std_events();
|
|
-out_free_mapfile:
|
|
free(mapfile);
|
|
return ret;
|
|
}
|
|
--
|
|
2.27.0
|
|
|