mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@infradead.org>
To: Ingo Molnar <mingo@elte.hu>
Cc: linux-kernel@vger.kernel.org,
	Arnaldo Carvalho de Melo <acme@redhat.com>,
	Frederic Weisbecker <fweisbec@gmail.com>,
	Ingo Molnar <mingo@elte.hu>, Mike Galbraith <efault@gmx.de>,
	Paul Mackerras <paulus@samba.org>,
	Peter Zijlstra <peterz@infradead.org>,
	Stephane Eranian <eranian@google.com>,
	Tom Zanussi <tzanussi@gmail.com>
Subject: [PATCH 05/29] perf top: Use perf_evsel__open
Date: Tue, 25 Jan 2011 15:21:28 -0200	[thread overview]
Message-ID: <1295976112-2796-6-git-send-email-acme@infradead.org> (raw)
In-Reply-To: <1295976112-2796-1-git-send-email-acme@infradead.org>

From: Arnaldo Carvalho de Melo <acme@redhat.com>

Now that it handles group_fd and inherit we can use it, sharing it with
stat.

Next step: 'perf record' should use, then move the mmap_array out of
->priv and into perf_evsel, with top and record sharing this, and at the
same time, write a 'perf test' stress test.

Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Tom Zanussi <tzanussi@gmail.com>
LKML-Reference: <new-submission>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/builtin-top.c |   92 +++++++++++++++++++++-------------------------
 1 files changed, 42 insertions(+), 50 deletions(-)

diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
index 1bc4652..15d89be 100644
--- a/tools/perf/builtin-top.c
+++ b/tools/perf/builtin-top.c
@@ -1210,39 +1210,50 @@ static void perf_session__mmap_read(struct perf_session *self)
 	}
 }
 
-int group_fd;
-
 static void start_counter(int i, struct perf_evlist *evlist,
 			  struct perf_evsel *evsel)
 {
 	struct xyarray *mmap_array = evsel->priv;
 	struct mmap_data *mm;
-	struct perf_event_attr *attr;
-	int cpu = -1;
 	int thread_index;
 
-	if (target_tid == -1)
-		cpu = cpus->map[i];
-
-	attr = &evsel->attr;
+	for (thread_index = 0; thread_index < threads->nr; thread_index++) {
+		assert(FD(evsel, i, thread_index) >= 0);
+		fcntl(FD(evsel, i, thread_index), F_SETFL, O_NONBLOCK);
 
-	attr->sample_type	= PERF_SAMPLE_IP | PERF_SAMPLE_TID;
+		evlist->pollfd[evlist->nr_fds].fd = FD(evsel, i, thread_index);
+		evlist->pollfd[evlist->nr_fds].events = POLLIN;
+		evlist->nr_fds++;
 
-	if (freq) {
-		attr->sample_type	|= PERF_SAMPLE_PERIOD;
-		attr->freq		= 1;
-		attr->sample_freq	= freq;
+		mm = xyarray__entry(mmap_array, i, thread_index);
+		mm->prev = 0;
+		mm->mask = mmap_pages*page_size - 1;
+		mm->base = mmap(NULL, (mmap_pages+1)*page_size,
+				PROT_READ, MAP_SHARED, FD(evsel, i, thread_index), 0);
+		if (mm->base == MAP_FAILED)
+			die("failed to mmap with %d (%s)\n", errno, strerror(errno));
 	}
+}
+
+static void start_counters(struct perf_evlist *evlist)
+{
+	struct perf_evsel *counter;
+	int i;
 
-	attr->inherit		= (cpu < 0) && inherit;
-	attr->mmap		= 1;
+	list_for_each_entry(counter, &evlist->entries, node) {
+		struct perf_event_attr *attr = &counter->attr;
 
-	for (thread_index = 0; thread_index < threads->nr; thread_index++) {
-try_again:
-		FD(evsel, i, thread_index) = sys_perf_event_open(attr,
-				threads->map[thread_index], cpu, group_fd, 0);
+		attr->sample_type = PERF_SAMPLE_IP | PERF_SAMPLE_TID;
+
+		if (freq) {
+			attr->sample_type |= PERF_SAMPLE_PERIOD;
+			attr->freq	  = 1;
+			attr->sample_freq = freq;
+		}
 
-		if (FD(evsel, i, thread_index) < 0) {
+		attr->mmap = 1;
+try_again:
+		if (perf_evsel__open(counter, cpus, threads, group, inherit) < 0) {
 			int err = errno;
 
 			if (err == EPERM || err == EACCES)
@@ -1254,8 +1265,8 @@ try_again:
 			 * based cpu-clock-tick sw counter, which
 			 * is always available even if no PMU support:
 			 */
-			if (attr->type == PERF_TYPE_HARDWARE
-					&& attr->config == PERF_COUNT_HW_CPU_CYCLES) {
+			if (attr->type == PERF_TYPE_HARDWARE &&
+			    attr->config == PERF_COUNT_HW_CPU_CYCLES) {
 
 				if (verbose)
 					warning(" ... trying to fall back to cpu-clock-ticks\n");
@@ -1265,39 +1276,24 @@ try_again:
 				goto try_again;
 			}
 			printf("\n");
-			error("sys_perf_event_open() syscall returned with %d (%s).  /bin/dmesg may provide additional information.\n",
-					FD(evsel, i, thread_index), strerror(err));
+			error("sys_perf_event_open() syscall returned with %d "
+			      "(%s).  /bin/dmesg may provide additional information.\n",
+			      err, strerror(err));
 			die("No CONFIG_PERF_EVENTS=y kernel support configured?\n");
 			exit(-1);
 		}
-		assert(FD(evsel, i, thread_index) >= 0);
-		fcntl(FD(evsel, i, thread_index), F_SETFL, O_NONBLOCK);
-
-		/*
-		 * First counter acts as the group leader:
-		 */
-		if (group && group_fd == -1)
-			group_fd = FD(evsel, i, thread_index);
-
-		evlist->pollfd[evlist->nr_fds].fd = FD(evsel, i, thread_index);
-		evlist->pollfd[evlist->nr_fds].events = POLLIN;
-		evlist->nr_fds++;
+	}
 
-		mm = xyarray__entry(mmap_array, i, thread_index);
-		mm->prev = 0;
-		mm->mask = mmap_pages*page_size - 1;
-		mm->base = mmap(NULL, (mmap_pages+1)*page_size,
-				PROT_READ, MAP_SHARED, FD(evsel, i, thread_index), 0);
-		if (mm->base == MAP_FAILED)
-			die("failed to mmap with %d (%s)\n", errno, strerror(errno));
+	for (i = 0; i < cpus->nr; i++) {
+		list_for_each_entry(counter, &evlist->entries, node)
+			start_counter(i, evsel_list, counter);
 	}
 }
 
 static int __cmd_top(void)
 {
 	pthread_t thread;
-	struct perf_evsel *counter;
-	int i, ret;
+	int ret;
 	/*
 	 * FIXME: perf_session__new should allow passing a O_MMAP, so that all this
 	 * mmap reading, etc is encapsulated in it. Use O_WRONLY for now.
@@ -1311,11 +1307,7 @@ static int __cmd_top(void)
 	else
 		event__synthesize_threads(event__process, session);
 
-	for (i = 0; i < cpus->nr; i++) {
-		group_fd = -1;
-		list_for_each_entry(counter, &evsel_list->entries, node)
-			start_counter(i, evsel_list, counter);
-	}
+	start_counters(evsel_list);
 
 	/* Wait for a minimal set of events before starting the snapshot */
 	poll(evsel_list->pollfd, evsel_list->nr_fds, 100);
-- 
1.6.2.5


  parent reply	other threads:[~2011-01-25 17:22 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-01-25 17:21 [GIT PULL 00/29] perf/core improvements for 2.6.39 Arnaldo Carvalho de Melo
2011-01-25 17:21 ` [PATCH 01/29] perf evsel: Introduce perf_evlist Arnaldo Carvalho de Melo
2011-01-25 17:21 ` [PATCH 02/29] perf evlist: Adopt the pollfd array Arnaldo Carvalho de Melo
2011-01-25 17:21 ` [PATCH 03/29] perf evsel: Support event groups Arnaldo Carvalho de Melo
2011-01-25 17:21 ` [PATCH 04/29] perf evsel: Allow specifying if the inherit bit should be set Arnaldo Carvalho de Melo
2011-01-25 17:21 ` Arnaldo Carvalho de Melo [this message]
2011-01-25 17:21 ` [PATCH 06/29] perf record: Use perf_evsel__open Arnaldo Carvalho de Melo
2011-01-25 17:21 ` [PATCH 07/29] perf evsel: Introduce mmap support Arnaldo Carvalho de Melo
2011-01-25 17:21 ` [PATCH 08/29] perf record: Use struct perf_mmap and helpers Arnaldo Carvalho de Melo
2011-01-25 17:21 ` [PATCH 09/29] perf record: Move perf_mmap__write_tail to perf.h Arnaldo Carvalho de Melo
2011-01-25 17:21 ` [PATCH 10/29] perf evlist: Move the mmap array from perf_evsel Arnaldo Carvalho de Melo
2011-01-25 17:21 ` [PATCH 11/29] perf record: Use perf_evlist__mmap Arnaldo Carvalho de Melo
2011-01-25 17:21 ` [PATCH 12/29] perf tools: Add missing cpu_map__delete() Arnaldo Carvalho de Melo
2011-01-25 17:21 ` [PATCH 13/29] perf test: Check counts on all cpus in test__open_syscall_event_on_all_cpus Arnaldo Carvalho de Melo
2011-01-25 17:21 ` [PATCH 14/29] perf test: check if cpu_map__new() return NULL Arnaldo Carvalho de Melo
2011-01-25 17:21 ` [PATCH 15/29] perf evlist: Steal mmap reading routine from 'perf top' Arnaldo Carvalho de Melo
2011-01-25 17:21 ` [PATCH 16/29] perf test: Add test for the evlist mmap routines Arnaldo Carvalho de Melo
2011-01-25 17:21 ` [PATCH 17/29] perf callchain: Feed callchains into a cursor Arnaldo Carvalho de Melo
2011-01-25 17:21 ` [PATCH 18/29] perf callchain: Rename cumul_hits into callchain_cumul_hits Arnaldo Carvalho de Melo
2011-01-25 17:21 ` [PATCH 19/29] perf callchain: Rename register_callchain_param into callchain_register_param Arnaldo Carvalho de Melo
2011-01-25 17:21 ` [PATCH 20/29] perf callchain: Don't give arbitrary gender to callchain tree nodes Arnaldo Carvalho de Melo
2011-01-25 17:21 ` [PATCH 21/29] perf top: Add native_safe_halt to skip symbols Arnaldo Carvalho de Melo
2011-01-25 17:21 ` [PATCH 22/29] perf probe: Introduce lines walker interface Arnaldo Carvalho de Melo
2011-01-25 17:21 ` [PATCH 23/29] perf probe: Enable to put probe inline function call site Arnaldo Carvalho de Melo
2011-01-25 17:21 ` [PATCH 24/29] perf probe: Add --funcs to show available functions in symtab Arnaldo Carvalho de Melo
2011-01-25 17:21 ` [PATCH 25/29] perf record: auto detect when stdout is a pipe Arnaldo Carvalho de Melo
2011-01-25 17:21 ` [PATCH 26/29] perf tools: Pass the struct opt to the wildcard parsing routine Arnaldo Carvalho de Melo
2011-01-25 17:21 ` [PATCH 27/29] perf threads: Move thread_map to separate file Arnaldo Carvalho de Melo
2011-01-25 17:21 ` [PATCH 28/29] perf tools: Move event__parse_sample to evsel.c Arnaldo Carvalho de Melo
2011-01-25 17:21 ` [PATCH 29/29] perf evsel: Introduce perf_evsel__{in,ex}it Arnaldo Carvalho de Melo
2011-01-26  6:52 ` [GIT PULL 00/29] perf/core improvements for 2.6.39 Ingo Molnar

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1295976112-2796-6-git-send-email-acme@infradead.org \
    --to=acme@infradead.org \
    --cc=acme@redhat.com \
    --cc=efault@gmx.de \
    --cc=eranian@google.com \
    --cc=fweisbec@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=paulus@samba.org \
    --cc=peterz@infradead.org \
    --cc=tzanussi@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®