Messages in this thread Patch in this message | | | From | Riccardo Mancini <> | Subject | [RFC PATCH v1 30/37] perf record: use evlist__open_custom | Date | Sat, 21 Aug 2021 11:19:36 +0200 |
| |
This patch replace the custom evlist opening implemented in record__open with the new standard function evlist__open_custom. Differently from before this patch, in case of a weak group all fds are closed and then reopened (instead of just closing failing ones).
Signed-off-by: Riccardo Mancini <rickyman7@gmail.com> --- tools/perf/builtin-record.c | 63 ++++++++++++++++++++++++------------- 1 file changed, 42 insertions(+), 21 deletions(-)
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index cccc2d0f9977d5b3..dc9a814b2e7906fc 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -882,6 +882,37 @@ static int record__mmap(struct record *rec) return record__mmap_evlist(rec, rec->evlist); } +struct record_open_custom_fallback { + struct evlist_open_custom_fallback fallback; + struct record_opts *opts; + bool retry; +}; + +static bool record__open_fallback(struct evlist_open_custom_fallback *_fallback, + struct evlist *evlist, struct evsel *evsel, int err) +{ + char msg[BUFSIZ]; + struct record_open_custom_fallback *fallback = container_of(_fallback, + struct record_open_custom_fallback, fallback); + + if (evsel__fallback(evsel, -err, msg, sizeof(msg))) { + if (verbose > 0) + ui__warning("%s\n", msg); + return true; + } + if ((err == -EINVAL || err == -EBADF) && + evsel->core.leader != &evsel->core && + evsel->weak_group) { + evlist__reset_weak_group(evlist, evsel, true); + fallback->retry = true; + return false; + } + + evsel__open_strerror(evsel, &fallback->opts->target, -err, msg, sizeof(msg)); + ui__error("%s\n", msg); + return false; +} + static int record__open(struct record *rec) { char msg[BUFSIZ]; @@ -890,6 +921,12 @@ static int record__open(struct record *rec) struct perf_session *session = rec->session; struct record_opts *opts = &rec->opts; int rc = 0; + struct record_open_custom_fallback cust_fb = { + .fallback = { + .func = record__open_fallback + }, + .opts = opts + }; /* * For initial_delay, system wide or a hybrid system, we need to add a @@ -919,28 +956,12 @@ static int record__open(struct record *rec) evlist__config(evlist, opts, &callchain_param); - evlist__for_each_entry(evlist, pos) { -try_again: - if (evsel__open(pos, pos->core.cpus, pos->core.threads) < 0) { - if (evsel__fallback(pos, errno, msg, sizeof(msg))) { - if (verbose > 0) - ui__warning("%s\n", msg); - goto try_again; - } - if ((errno == EINVAL || errno == EBADF) && - pos->core.leader != &pos->core && - pos->weak_group) { - pos = evlist__reset_weak_group(evlist, pos, true); - goto try_again; - } - rc = -errno; - evsel__open_strerror(pos, &opts->target, errno, msg, sizeof(msg)); - ui__error("%s\n", msg); - goto out; - } - pos->supported = true; - } + do { + cust_fb.retry = false; + rc = evlist__open_custom(evlist, &cust_fb.fallback); + } while (cust_fb.retry); + if (symbol_conf.kptr_restrict && !evlist__exclude_kernel(evlist)) { pr_warning( -- 2.31.1
| |