Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752505AbdIMPT7 (ORCPT ); Wed, 13 Sep 2017 11:19:59 -0400 Received: from mail.kernel.org ([198.145.29.99]:50992 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752440AbdIMPTz (ORCPT ); Wed, 13 Sep 2017 11:19:55 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 828A721A92 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: Wed, 13 Sep 2017 12:19:52 -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 V2 02/10] perf tools: using scandir to replace readdir Message-ID: <20170913151952.GH5866@kernel.org> References: <1505096603-215017-1-git-send-email-kan.liang@intel.com> <1505096603-215017-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: <1505096603-215017-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: 2951 Lines: 95 Em Sun, Sep 10, 2017 at 07:23:15PM -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. This one I had already merged into my perf/core branch, - Arnaldo > Signed-off-by: Kan Liang > --- > tools/perf/util/event.c | 46 ++++++++++++++++++++++++++-------------------- > 1 file changed, 26 insertions(+), 20 deletions(-) > > diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c > index 1c905ba..c31f678 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,33 @@ 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