From: tip-bot for Sukadev Bhattiprolu <tipbot@zytor.com>
To: linux-tip-commits@vger.kernel.org
Cc: peterz@infradead.org, linux-kernel@vger.kernel.org,
tglx@linutronix.de, eranian@google.com, acme@redhat.com,
sukadev@linux.vnet.ibm.com, acme@kernel.org, hpa@zytor.com,
jolsa@redhat.com, torvalds@linux-foundation.org,
mpe@ellerman.id.au, mingo@kernel.org, vincent.weaver@maine.edu
Subject: [tip:perf/core] perf/core: Add return value for perf_event_read()
Date: Sun, 13 Sep 2015 04:12:46 -0700 [thread overview]
Message-ID: <tip-7d88962e230c8342080e7e2fe9dd5be43dc13b79@git.kernel.org> (raw)
In-Reply-To: <1441336073-22750-8-git-send-email-sukadev@linux.vnet.ibm.com>
Commit-ID: 7d88962e230c8342080e7e2fe9dd5be43dc13b79
Gitweb: http://git.kernel.org/tip/7d88962e230c8342080e7e2fe9dd5be43dc13b79
Author: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
AuthorDate: Thu, 3 Sep 2015 20:07:50 -0700
Committer: Ingo Molnar <mingo@kernel.org>
CommitDate: Sun, 13 Sep 2015 11:27:28 +0200
perf/core: Add return value for perf_event_read()
When we implement the ability to read several counters at once (using
the PERF_PMU_TXN_READ transaction interface), perf_event_read() can
fail when the 'group' parameter is true (eg: trying to read too many
events at once).
For now, have perf_event_read() return an integer. Ignore the return
value when the 'group' parameter is false.
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-8-git-send-email-sukadev@linux.vnet.ibm.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
kernel/events/core.c | 45 ++++++++++++++++++++++++++++++++++-----------
1 file changed, 34 insertions(+), 11 deletions(-)
diff --git a/kernel/events/core.c b/kernel/events/core.c
index dd2a0b8..ade04df 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -3187,6 +3187,7 @@ void perf_event_exec(void)
struct perf_read_data {
struct perf_event *event;
bool group;
+ int ret;
};
/*
@@ -3227,6 +3228,7 @@ static void __perf_event_read(void *info)
if (sub->state == PERF_EVENT_STATE_ACTIVE)
sub->pmu->read(sub);
}
+ data->ret = 0;
unlock:
raw_spin_unlock(&ctx->lock);
@@ -3293,8 +3295,10 @@ u64 perf_event_read_local(struct perf_event *event)
return val;
}
-static void perf_event_read(struct perf_event *event, bool group)
+static int perf_event_read(struct perf_event *event, bool group)
{
+ int ret = 0;
+
/*
* If event is enabled and currently active on a CPU, update the
* value in the event structure:
@@ -3303,9 +3307,11 @@ static void perf_event_read(struct perf_event *event, bool group)
struct perf_read_data data = {
.event = event,
.group = group,
+ .ret = 0,
};
smp_call_function_single(event->oncpu,
__perf_event_read, &data, 1);
+ ret = data.ret;
} else if (event->state == PERF_EVENT_STATE_INACTIVE) {
struct perf_event_context *ctx = event->ctx;
unsigned long flags;
@@ -3326,6 +3332,8 @@ static void perf_event_read(struct perf_event *event, bool group)
update_event_times(event);
raw_spin_unlock_irqrestore(&ctx->lock, flags);
}
+
+ return ret;
}
/*
@@ -3842,7 +3850,7 @@ u64 perf_event_read_value(struct perf_event *event, u64 *enabled, u64 *running)
mutex_lock(&event->child_mutex);
- perf_event_read(event, false);
+ (void)perf_event_read(event, false);
total += perf_event_count(event);
*enabled += event->total_time_enabled +
@@ -3851,7 +3859,7 @@ u64 perf_event_read_value(struct perf_event *event, u64 *enabled, u64 *running)
atomic64_read(&event->child_total_time_running);
list_for_each_entry(child, &event->child_list, child_list) {
- perf_event_read(child, false);
+ (void)perf_event_read(child, false);
total += perf_event_count(child);
*enabled += child->total_time_enabled;
*running += child->total_time_running;
@@ -3862,13 +3870,16 @@ u64 perf_event_read_value(struct perf_event *event, u64 *enabled, u64 *running)
}
EXPORT_SYMBOL_GPL(perf_event_read_value);
-static void __perf_read_group_add(struct perf_event *leader,
+static int __perf_read_group_add(struct perf_event *leader,
u64 read_format, u64 *values)
{
struct perf_event *sub;
int n = 1; /* skip @nr */
+ int ret;
- perf_event_read(leader, true);
+ ret = perf_event_read(leader, true);
+ if (ret)
+ return ret;
/*
* Since we co-schedule groups, {enabled,running} times of siblings
@@ -3897,6 +3908,8 @@ static void __perf_read_group_add(struct perf_event *leader,
if (read_format & PERF_FORMAT_ID)
values[n++] = primary_event_id(sub);
}
+
+ return 0;
}
static int perf_read_group(struct perf_event *event,
@@ -3904,7 +3917,7 @@ static int perf_read_group(struct perf_event *event,
{
struct perf_event *leader = event->group_leader, *child;
struct perf_event_context *ctx = leader->ctx;
- int ret = event->read_size;
+ int ret;
u64 *values;
lockdep_assert_held(&ctx->mutex);
@@ -3921,17 +3934,27 @@ static int perf_read_group(struct perf_event *event,
*/
mutex_lock(&leader->child_mutex);
- __perf_read_group_add(leader, read_format, values);
- list_for_each_entry(child, &leader->child_list, child_list)
- __perf_read_group_add(child, read_format, values);
+ ret = __perf_read_group_add(leader, read_format, values);
+ if (ret)
+ goto unlock;
+
+ list_for_each_entry(child, &leader->child_list, child_list) {
+ ret = __perf_read_group_add(child, read_format, values);
+ if (ret)
+ goto unlock;
+ }
mutex_unlock(&leader->child_mutex);
+ ret = event->read_size;
if (copy_to_user(buf, values, event->read_size))
ret = -EFAULT;
+ goto out;
+unlock:
+ mutex_unlock(&leader->child_mutex);
+out:
kfree(values);
-
return ret;
}
@@ -4037,7 +4060,7 @@ static unsigned int perf_poll(struct file *file, poll_table *wait)
static void _perf_event_reset(struct perf_event *event)
{
- perf_event_read(event, false);
+ (void)perf_event_read(event, false);
local64_set(&event->count, 0);
perf_event_update_userpage(event);
}
next prev parent 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-bot for Sukadev Bhattiprolu [this message]
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:perf/core] perf/core: " tip-bot for Sukadev Bhattiprolu
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-7d88962e230c8342080e7e2fe9dd5be43dc13b79@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.