From: Peter Zijlstra <peterz@infradead.org>
To: Jiri Olsa <jolsa@redhat.com>
Cc: Vegard Nossum <vegard.nossum@gmail.com>,
Thomas Gleixner <tglx@linutronix.de>,
Stephane Eranian <eranian@google.com>,
Vince Weaver <vincent.weaver@maine.edu>,
Ingo Molnar <mingo@kernel.org>,
David Carrillo-Cisneros <davidcc@google.com>,
"H. Peter Anvin" <hpa@zytor.com>, Kan Liang <kan.liang@intel.com>,
Arnaldo Carvalho de Melo <acme@redhat.com>,
Paul Turner <pjt@google.com>,
Linus Torvalds <torvalds@linux-foundation.org>,
LKML <linux-kernel@vger.kernel.org>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
linux-tip-commits@vger.kernel.org
Subject: Re: [tip:perf/core] perf/core: Check return value of the perf_event_read() IPI
Date: Mon, 29 Aug 2016 15:02:13 +0200 [thread overview]
Message-ID: <20160829130213.GF10168@twins.programming.kicks-ass.net> (raw)
In-Reply-To: <20160829100309.GS10121@twins.programming.kicks-ass.net>
On Mon, Aug 29, 2016 at 12:03:09PM +0200, Peter Zijlstra wrote:
> @@ -1802,8 +1802,18 @@ event_sched_out(struct perf_event *event,
>
> event->tstamp_stopped = tstamp;
> event->pmu->del(event, 0);
> - event->oncpu = -1;
> - event->state = PERF_EVENT_STATE_INACTIVE;
> +
> + WRITE_ONCE(event->state, PERF_EVENT_STATE_INACTIVE);
> + /*
> + * pmu::del() will have updated the event count. Now mark it inactive,
> + * but take care to clear ->oncpu after the INACTIVE store, such that
> + * while ->state == ACTIVE, ->oncpu must be valid.
> + *
> + * See event_sched_in(), perf_event_restart() and perf_event_read().
> + */
> + smp_wmb();
> + WRITE_ONCE(event->oncpu, -1);
> +
> if (event->pending_disable) {
> event->pending_disable = 0;
> event->state = PERF_EVENT_STATE_OFF;
> @@ -2015,8 +2025,10 @@ event_sched_in(struct perf_event *event,
>
> WRITE_ONCE(event->oncpu, smp_processor_id());
> /*
> - * Order event::oncpu write to happen before the ACTIVE state
> - * is visible.
> + * Order event::oncpu write to happen before the ACTIVE state is
> + * visible, such that when we observe ACTIVE, oncpu must be correct.
> + *
> + * Matches the smp_rmb() in perf_event_restart().
> */
> smp_wmb();
> WRITE_ONCE(event->state, PERF_EVENT_STATE_ACTIVE);
Urgh.. that cannot work either, because now perf_event_read() can race
against event_sched_in(). Since that's no longer crossed.
> @@ -3561,28 +3576,36 @@ u64 perf_event_read_local(struct perf_event *event)
>
> static int perf_event_read(struct perf_event *event, bool group)
> {
> - int ret = 0, cpu_to_read, local_cpu;
> + int ret = 0, cpu_to_read, local_cpu, state;
> +
> + local_cpu = get_cpu(); /* disable preemption to hold off hotplut */
> + cpu_to_read = READ_ONCE(event->oncpu);
> + /*
> + * Matches smp_wmb() from event_sched_out(), ->oncpu must be valid
> + * IFF we observe ACTIVE.
> + */
> + smp_rmb();
> + state = READ_ONCE(event->state);
The best I can come up with is something like:
do {
state = READ_ONCE(event->state);
if (state != ACTIVE)
break;
smp_rmb();
cpu = READ_ONCE(event->cpu);
smp_rmb();
} while (READ_ONCE(event->state) != state);
And I suppose perf_event_restart() should do the same thing... Let me
ponder this a wee bit more.
next prev parent reply other threads:[~2016-08-29 13:02 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-08-17 20:55 [PATCH v3 0/4] remove unnecessary IPI reading uncore events David Carrillo-Cisneros
2016-08-17 20:55 ` [PATCH v3 1/4] perf/core: check return value of perf_event_read IPI David Carrillo-Cisneros
2016-08-18 10:52 ` [tip:perf/core] perf/core: Check return value of the perf_event_read() IPI tip-bot for David Carrillo-Cisneros
2016-08-21 12:10 ` Vegard Nossum
2016-08-22 7:17 ` Jiri Olsa
2016-08-22 8:29 ` Jiri Olsa
2016-08-22 10:38 ` Jiri Olsa
2016-08-28 18:09 ` Jiri Olsa
2016-08-29 10:03 ` Peter Zijlstra
2016-08-29 13:02 ` Peter Zijlstra [this message]
2016-08-29 13:14 ` Vince Weaver
2016-08-29 18:58 ` Jiri Olsa
2016-08-30 6:47 ` Peter Zijlstra
2016-08-30 7:26 ` Peter Zijlstra
2016-08-30 9:47 ` Jiri Olsa
2016-08-30 16:26 ` Stephane Eranian
2016-09-02 8:33 ` Peter Zijlstra
2016-10-09 7:09 ` [perf/core] 412929295f: WARNING: CPU: 2 PID: 600 at kernel/events/core.c:3530 perf_event_read+0x17d/0x190 kernel test robot
2016-10-09 7:09 ` [lkp] " kernel test robot
2016-10-09 7:58 ` David Carrillo-Cisneros
2016-08-17 20:55 ` [PATCH v3 2/4] perf/core: generalize event->group_flags David Carrillo-Cisneros
2016-08-18 10:53 ` [tip:perf/core] perf/core: Generalize event->group_flags tip-bot for David Carrillo-Cisneros
2016-08-17 20:55 ` [PATCH v3 3/4] perf/core: introduce PMU_EV_CAP_READ_ACTIVE_PKG David Carrillo-Cisneros
2016-08-18 10:54 ` [tip:perf/core] perf/core: Introduce PMU_EV_CAP_READ_ACTIVE_PKG tip-bot for David Carrillo-Cisneros
2016-08-17 20:55 ` [PATCH v3 4/4] perf/x86: use PMUEF_READ_CPU_PKG in uncore events David Carrillo-Cisneros
2016-08-18 10:54 ` [tip:perf/core] perf/x86: Use " tip-bot for David Carrillo-Cisneros
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=20160829130213.GF10168@twins.programming.kicks-ass.net \
--to=peterz@infradead.org \
--cc=acme@redhat.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=davidcc@google.com \
--cc=eranian@google.com \
--cc=hpa@zytor.com \
--cc=jolsa@redhat.com \
--cc=kan.liang@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tip-commits@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=pjt@google.com \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
--cc=vegard.nossum@gmail.com \
--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.