All of lore.kernel.org
 help / color / mirror / Atom feed
From: tip-bot for Sukadev Bhattiprolu <tipbot@zytor.com>
To: linux-tip-commits@vger.kernel.org
Cc: peterz@infradead.org, mingo@kernel.org, acme@redhat.com,
	vincent.weaver@maine.edu, mpe@ellerman.id.au, acme@kernel.org,
	torvalds@linux-foundation.org, linux-kernel@vger.kernel.org,
	jolsa@redhat.com, hpa@zytor.com, tglx@linutronix.de,
	eranian@google.com, sukadev@linux.vnet.ibm.com
Subject: [tip:perf/core] perf/core: Define PERF_PMU_TXN_READ interface
Date: Sun, 13 Sep 2015 04:13:07 -0700	[thread overview]
Message-ID: <tip-4a00c16e552ea5e71756cd29cd2df7557ec9cac4@git.kernel.org> (raw)
In-Reply-To: <1441336073-22750-9-git-send-email-sukadev@linux.vnet.ibm.com>

Commit-ID:  4a00c16e552ea5e71756cd29cd2df7557ec9cac4
Gitweb:     http://git.kernel.org/tip/4a00c16e552ea5e71756cd29cd2df7557ec9cac4
Author:     Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
AuthorDate: Thu, 3 Sep 2015 20:07:51 -0700
Committer:  Ingo Molnar <mingo@kernel.org>
CommitDate: Sun, 13 Sep 2015 11:27:28 +0200

perf/core: Define PERF_PMU_TXN_READ interface

Define a new PERF_PMU_TXN_READ interface to read a group of counters
at once.

        pmu->start_txn()                // Initialize before first event

        for each event in group
                pmu->read(event);       // Queue each event to be read

        rc = pmu->commit_txn()          // Read/update all queued counters

Note that we use this interface with all PMUs.  PMUs that implement this
interface use the ->read() operation to _queue_ the counters to be read
and use ->commit_txn() to actually read all the queued counters at once.

PMUs that don't implement PERF_PMU_TXN_READ ignore ->start_txn() and
->commit_txn() and continue to read counters one at a time.

Thanks to input from Peter Zijlstra.

Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Vince Weaver <vincent.weaver@maine.edu>
Link: http://lkml.kernel.org/r/1441336073-22750-9-git-send-email-sukadev@linux.vnet.ibm.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
 include/linux/perf_event.h |  1 +
 kernel/events/core.c       | 24 +++++++++++++++++++-----
 2 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
index ea3b5dd..b83cea9 100644
--- a/include/linux/perf_event.h
+++ b/include/linux/perf_event.h
@@ -202,6 +202,7 @@ struct perf_event;
 #define PERF_EVENT_TXN 0x1
 
 #define PERF_PMU_TXN_ADD  0x1		/* txn to add/schedule event on PMU */
+#define PERF_PMU_TXN_READ 0x2		/* txn to read event group from PMU */
 
 /**
  * pmu::capabilities flags
diff --git a/kernel/events/core.c b/kernel/events/core.c
index ade04df..55b0f7c 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -3199,6 +3199,7 @@ static void __perf_event_read(void *info)
 	struct perf_event *sub, *event = data->event;
 	struct perf_event_context *ctx = event->ctx;
 	struct perf_cpu_context *cpuctx = __get_cpu_context(ctx);
+	struct pmu *pmu = event->pmu;
 
 	/*
 	 * If this is a task context, we need to check whether it is
@@ -3217,18 +3218,31 @@ static void __perf_event_read(void *info)
 	}
 
 	update_event_times(event);
-	if (event->state == PERF_EVENT_STATE_ACTIVE)
-		event->pmu->read(event);
+	if (event->state != PERF_EVENT_STATE_ACTIVE)
+		goto unlock;
 
-	if (!data->group)
+	if (!data->group) {
+		pmu->read(event);
+		data->ret = 0;
 		goto unlock;
+	}
+
+	pmu->start_txn(pmu, PERF_PMU_TXN_READ);
+
+	pmu->read(event);
 
 	list_for_each_entry(sub, &event->sibling_list, group_entry) {
 		update_event_times(sub);
-		if (sub->state == PERF_EVENT_STATE_ACTIVE)
+		if (sub->state == PERF_EVENT_STATE_ACTIVE) {
+			/*
+			 * Use sibling's PMU rather than @event's since
+			 * sibling could be on different (eg: software) PMU.
+			 */
 			sub->pmu->read(sub);
+		}
 	}
-	data->ret = 0;
+
+	data->ret = pmu->commit_txn(pmu);
 
 unlock:
 	raw_spin_unlock(&ctx->lock);

  reply	other threads:[~2015-09-13 11:13 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-04  3:07 [PATCH v6 0/10] perf: Implement group-read of events using txn interface Sukadev Bhattiprolu
2015-09-04  3:07 ` Sukadev Bhattiprolu
2015-09-04  3:07 ` Sukadev Bhattiprolu
2015-09-04  3:07 ` [[PATCH v6 01/10] sparc/perf: Remove unnecessary assignment Sukadev Bhattiprolu
2015-09-04  3:07   ` Sukadev Bhattiprolu
2015-09-04  3:07   ` Sukadev Bhattiprolu
2015-09-13 11:10   ` [tip:perf/core] sparc, perf/sparc: " tip-bot for Sukadev Bhattiprolu
2015-09-04  3:07 ` [[PATCH v6 02/10] perf: Add a flags parameter to pmu txn interfaces Sukadev Bhattiprolu
2015-09-04  3:07   ` Sukadev Bhattiprolu
2015-09-04  3:07   ` Sukadev Bhattiprolu
2015-09-04 10:07   ` Michael Ellerman
2015-09-04 10:07     ` Michael Ellerman
2015-09-13 11:10   ` [tip:perf/core] perf/core: Add a 'flags' parameter to the PMU transactional interfaces tip-bot for Sukadev Bhattiprolu
2015-09-04  3:07 ` [[PATCH v6 03/10] perf: Split perf_event_read() and perf_event_count() Sukadev Bhattiprolu
2015-09-04  3:07   ` Sukadev Bhattiprolu
2015-09-04  3:07   ` Sukadev Bhattiprolu
2015-09-13 11:11   ` [tip:perf/core] perf/core: " tip-bot for Sukadev Bhattiprolu
2015-09-04  3:07 ` [[PATCH v6 04/10] perf: Rename perf_event_read_{one, group}, perf_read_hw Sukadev Bhattiprolu
2015-09-04  3:07   ` [[PATCH v6 04/10] perf: Rename perf_event_read_{one,group}, perf_read_hw Sukadev Bhattiprolu
2015-09-04  3:07   ` Sukadev Bhattiprolu
2015-09-04  3:07   ` [[PATCH v6 04/10] perf: Rename perf_event_read_{one, group}, perf_read_hw Sukadev Bhattiprolu
2015-09-13 11:11   ` [tip:perf/core] perf/core: Rename perf_event_read_{one,group}, perf_read_hw tip-bot for Peter Zijlstra (Intel)
2015-09-04  3:07 ` [[PATCH v6 05/10] perf: Add group reads to perf_event_read() Sukadev Bhattiprolu
2015-09-04  3:07   ` Sukadev Bhattiprolu
2015-09-04  3:07   ` Sukadev Bhattiprolu
2015-09-04  3:07 ` [[PATCH v6 06/10] perf: Invert perf_read_group() loops Sukadev Bhattiprolu
2015-09-04  3:07   ` Sukadev Bhattiprolu
2015-09-04  3:07   ` Sukadev Bhattiprolu
2015-09-13 11:12   ` [tip:perf/core] perf/core: " tip-bot for Peter Zijlstra
2015-09-04  3:07 ` [[PATCH v6 07/10] perf: Add return value for perf_event_read() Sukadev Bhattiprolu
2015-09-04  3:07   ` Sukadev Bhattiprolu
2015-09-04  3:07   ` Sukadev Bhattiprolu
2015-09-13 11:12   ` [tip:perf/core] perf/core: " tip-bot for Sukadev Bhattiprolu
2015-09-04  3:07 ` [[PATCH v6 08/10] Define PERF_PMU_TXN_READ interface Sukadev Bhattiprolu
2015-09-04  3:07   ` Sukadev Bhattiprolu
2015-09-04  3:07   ` Sukadev Bhattiprolu
2015-09-13 11:13   ` tip-bot for Sukadev Bhattiprolu [this message]
2015-09-04  3:07 ` [[PATCH v6 09/10] powerpc/perf/hv-24x7: Use PMU_TXN_READ interface Sukadev Bhattiprolu
2015-09-04  3:07   ` Sukadev Bhattiprolu
2015-09-04  3:07   ` Sukadev Bhattiprolu
2015-09-08  9:07   ` Michael Ellerman
2015-09-08  9:07     ` Michael Ellerman
2015-09-08 11:29     ` Peter Zijlstra
2015-09-08 11:29       ` Peter Zijlstra
2015-09-09  2:15       ` Michael Ellerman
2015-09-09  2:15         ` Michael Ellerman
2015-09-09 21:12         ` Sukadev Bhattiprolu
2015-09-09 21:12           ` Sukadev Bhattiprolu
2015-09-10  0:43           ` Michael Ellerman
2015-09-10  0:43             ` Michael Ellerman
2015-09-13 11:13   ` [tip:perf/core] powerpc, perf/powerpc/hv-24x7: " tip-bot for Sukadev Bhattiprolu
2015-09-04  3:07 ` [[PATCH v6 10/10] perf: Drop PERF_EVENT_TXN Sukadev Bhattiprolu
2015-09-04  3:07   ` Sukadev Bhattiprolu
2015-09-04  3:07   ` Sukadev Bhattiprolu
2015-09-13 11:13   ` [tip:perf/core] perf/core: " tip-bot for Sukadev Bhattiprolu

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=tip-4a00c16e552ea5e71756cd29cd2df7557ec9cac4@git.kernel.org \
    --to=tipbot@zytor.com \
    --cc=acme@kernel.org \
    --cc=acme@redhat.com \
    --cc=eranian@google.com \
    --cc=hpa@zytor.com \
    --cc=jolsa@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tip-commits@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=mpe@ellerman.id.au \
    --cc=peterz@infradead.org \
    --cc=sukadev@linux.vnet.ibm.com \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.org \
    --cc=vincent.weaver@maine.edu \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.