Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755137AbdIHOLN (ORCPT ); Fri, 8 Sep 2017 10:11:13 -0400 Received: from mail.kernel.org ([198.145.29.99]:39374 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754664AbdIHOLL (ORCPT ); Fri, 8 Sep 2017 10:11:11 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 0B71D22AEC Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=acme@kernel.org Date: Fri, 8 Sep 2017 11:11:07 -0300 From: Arnaldo Carvalho de Melo To: kan.liang@intel.com Cc: peterz@infradead.org, mingo@redhat.com, linux-kernel@vger.kernel.org, jolsa@kernel.org, namhyung@kernel.org, adrian.hunter@intel.com, lukasz.odzioba@intel.com, ak@linux.intel.com Subject: Re: [PATCH RFC 02/10] perf tools: using scandir to replace readdir Message-ID: <20170908141107.GE11725@kernel.org> References: <1504806954-150842-1-git-send-email-kan.liang@intel.com> <1504806954-150842-3-git-send-email-kan.liang@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1504806954-150842-3-git-send-email-kan.liang@intel.com> X-Url: http://acmel.wordpress.com User-Agent: Mutt/1.8.3 (2017-05-23) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2956 Lines: 95 Em Thu, Sep 07, 2017 at 10:55:46AM -0700, kan.liang@intel.com escreveu: > From: Kan Liang > > For perf_event__synthesize_threads, perf goes through all proc files > serially by readdir. > scandir did a snapshoot of proc, which is multithreading friendly. > > It's possible that some threads which are added during event synthesize. > But the number of lost threads should be small. > They should not impact the final analysis. Looks ok, applied locally, will see how it builds in my containers tests. - Arnaldo > Signed-off-by: Kan Liang > --- > tools/perf/util/event.c | 45 +++++++++++++++++++++++++-------------------- > 1 file changed, 25 insertions(+), 20 deletions(-) > > diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c > index 1c905ba..17c21ea 100644 > --- a/tools/perf/util/event.c > +++ b/tools/perf/util/event.c > @@ -683,12 +683,14 @@ int perf_event__synthesize_threads(struct perf_tool *tool, > bool mmap_data, > unsigned int proc_map_timeout) > { > - DIR *proc; > - char proc_path[PATH_MAX]; > - struct dirent *dirent; > union perf_event *comm_event, *mmap_event, *fork_event; > union perf_event *namespaces_event; > + char proc_path[PATH_MAX]; > + struct dirent **dirent; > int err = -1; > + char *end; > + pid_t pid; > + int n, i; > > if (machine__is_default_guest(machine)) > return 0; > @@ -712,29 +714,32 @@ int perf_event__synthesize_threads(struct perf_tool *tool, > goto out_free_fork; > > snprintf(proc_path, sizeof(proc_path), "%s/proc", machine->root_dir); > - proc = opendir(proc_path); > + n = scandir(proc_path, &dirent, 0, alphasort); > > - if (proc == NULL) > + if (n < 0) > goto out_free_namespaces; > > - while ((dirent = readdir(proc)) != NULL) { > - char *end; > - pid_t pid = strtol(dirent->d_name, &end, 10); > - > - if (*end) /* only interested in proper numerical dirents */ > + for (i = 0; i < n; i++) { > + if (!isdigit(dirent[i]->d_name[0])) > continue; > - /* > - * We may race with exiting thread, so don't stop just because > - * one thread couldn't be synthesized. > - */ > - __event__synthesize_thread(comm_event, mmap_event, fork_event, > - namespaces_event, pid, 1, process, > - tool, machine, mmap_data, > - proc_map_timeout); > - } > > + pid = (pid_t)strtol(dirent[i]->d_name, &end, 10); > + /* only interested in proper numerical dirents */ > + if (!*end) { > + /* > + * We may race with exiting thread, so don't stop just because > + * one thread couldn't be synthesized. > + */ > + __event__synthesize_thread(comm_event, mmap_event, fork_event, > + namespaces_event, pid, 1, process, > + tool, machine, mmap_data, > + proc_map_timeout); > + } > + free(dirent[i]); > + } > + free(dirent); > err = 0; > - closedir(proc); > + > out_free_namespaces: > free(namespaces_event); > out_free_fork: > -- > 2.5.5