From: Adrian Hunter <adrian.hunter@intel.com>
To: Vince Weaver <vince@deater.net>
Cc: mingo@kernel.org, hpa@zytor.com, linux-kernel@vger.kernel.org,
a.p.zijlstra@chello.nl, tglx@linutronix.de,
linux-tip-commits@vger.kernel.org
Subject: Re: [tip:perf/core] perf: Fix broken union in ' struct perf_event_mmap_page'
Date: Wed, 18 Sep 2013 12:13:25 +0300 [thread overview]
Message-ID: <52396EB5.6050104@intel.com> (raw)
In-Reply-To: <alpine.DEB.2.02.1309171617400.13303@pianoman.cluster.toy>
On 17/09/13 23:23, Vince Weaver wrote:
>
> This patch somehow breaks the perf-ABI.
>
> If I take a program that reads "mmap->cap_usr_rdpmc" and compile it
> against the new header with this change (say from 3.12-rc1)
> and then run it on an old kernel (say 3.11) then I get "0" for
> cap_usr_rdpmc.
>
> If I take the same program and recompile against the old (without this
> patch) header and run it on 3.11, I get the expected "1" value.
>
> So something about this changed the bit pattern in an incompatible
> fashion.
cap_usr_time and cap_usr_rdpmc were occupying the same bit position i.e. bit 0
That means that cap_usr_time and cap_usr_rdpmc were both unreliable.
If you look at the logic:
void arch_perf_update_userpage(struct perf_event_mmap_page *userpg, u64 now)
{
userpg->cap_usr_time = 0;
userpg->cap_usr_time_zero = 0;
userpg->cap_usr_rdpmc = x86_pmu.attr_rdpmc;
userpg->pmc_width = x86_pmu.cntval_bits;
if (!boot_cpu_has(X86_FEATURE_CONSTANT_TSC))
return;
if (!boot_cpu_has(X86_FEATURE_NONSTOP_TSC))
return;
userpg->cap_usr_time = 1;
userpg->time_mult = this_cpu_read(cyc2ns);
userpg->time_shift = CYC2NS_SCALE_FACTOR;
userpg->time_offset = this_cpu_read(cyc2ns_offset) - now;
if (sched_clock_stable && !check_tsc_disabled()) {
userpg->cap_usr_time_zero = 1;
userpg->time_zero = this_cpu_read(cyc2ns_offset);
}
}
The incorrect union caused 2 bugs:
1. On hardware with constant, non-stop TSC cap_usr_rdpmc was always 1.
2. On hardware without constant, non-stop TSC cap_usr_time was still 1 if
rdpmc was allowed in userspace.
Possible improvements are one or both of:
1. Add cap_usr_fixed to identify kernels that have the capabilities bits fixed
2. Swap the positions of cap_usr_time and cap_usr_rdpmc so that
cap_usr_rdpmc remains in bit 0
>
> Vince
>
>
>
>
> On Tue, 23 Jul 2013, tip-bot for Adrian Hunter wrote:
>
>> Commit-ID: 860f085b74e9f0075de8140ed3a1e5b5e3e39aa8
>> Gitweb: http://git.kernel.org/tip/860f085b74e9f0075de8140ed3a1e5b5e3e39aa8
>> Author: Adrian Hunter <adrian.hunter@intel.com>
>> AuthorDate: Fri, 28 Jun 2013 16:22:17 +0300
>> Committer: Ingo Molnar <mingo@kernel.org>
>> CommitDate: Tue, 23 Jul 2013 12:17:10 +0200
>>
>> perf: Fix broken union in 'struct perf_event_mmap_page'
>>
>> The capabilities bits must not be "union'ed" together.
>> Put them in a separate struct.
>>
>> Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
>> Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
>> Link: http://lkml.kernel.org/r/1372425741-1676-2-git-send-email-adrian.hunter@intel.com
>> Signed-off-by: Ingo Molnar <mingo@kernel.org>
>> ---
>> include/uapi/linux/perf_event.h | 8 +++++---
>> 1 file changed, 5 insertions(+), 3 deletions(-)
>>
>> diff --git a/include/uapi/linux/perf_event.h b/include/uapi/linux/perf_event.h
>> index 00d8274..0041aed 100644
>> --- a/include/uapi/linux/perf_event.h
>> +++ b/include/uapi/linux/perf_event.h
>> @@ -375,9 +375,11 @@ struct perf_event_mmap_page {
>> __u64 time_running; /* time event on cpu */
>> union {
>> __u64 capabilities;
>> - __u64 cap_usr_time : 1,
>> - cap_usr_rdpmc : 1,
>> - cap_____res : 62;
>> + struct {
>> + __u64 cap_usr_time : 1,
>> + cap_usr_rdpmc : 1,
>> + cap_____res : 62;
>> + };
>> };
>>
>> /*
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>> Please read the FAQ at http://www.tux.org/lkml/
>>
> k
>
>
next prev parent reply other threads:[~2013-09-18 9:07 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-06-28 13:22 [PATCH 0/5] perf: add two new features Adrian Hunter
2013-06-28 13:22 ` [PATCH 1/5] perf: fix broken union in perf_event_mmap_page Adrian Hunter
2013-06-28 15:22 ` Peter Zijlstra
2013-07-16 11:51 ` H. Peter Anvin
2013-07-24 3:56 ` [tip:perf/core] perf: Fix broken union in ' struct perf_event_mmap_page' tip-bot for Adrian Hunter
2013-09-17 20:23 ` Vince Weaver
2013-09-17 20:35 ` Vince Weaver
2013-09-19 8:42 ` Ingo Molnar
2013-09-18 8:57 ` Peter Zijlstra
2013-09-18 14:19 ` Vince Weaver
2013-09-18 15:42 ` Peter Zijlstra
2013-09-18 18:33 ` Stephane Eranian
2013-09-19 8:43 ` Peter Zijlstra
2013-09-19 8:55 ` Stephane Eranian
2013-09-19 9:16 ` Ingo Molnar
2013-09-18 20:07 ` Vince Weaver
2013-09-19 8:16 ` Peter Zijlstra
2013-09-19 9:14 ` [PATCH] perf: Always set bit 0 in the capabilities field of 'struct perf_event_mmap_page' to 0, to maintain the ABI Ingo Molnar
2013-09-19 10:12 ` Peter Zijlstra
2013-09-19 10:28 ` Ingo Molnar
2013-09-19 10:35 ` Peter Zijlstra
2013-09-19 10:40 ` [PATCH, v3] " Ingo Molnar
2013-09-19 11:18 ` Adrian Hunter
2013-09-19 11:42 ` [PATCH, v4] perf: Fix capabilities bitfield compatibility in 'struct perf_event_mmap_page' Ingo Molnar
2013-09-19 17:40 ` Vince Weaver
2013-09-20 7:44 ` Ingo Molnar
2013-09-18 9:13 ` Adrian Hunter [this message]
2013-09-18 14:10 ` [tip:perf/core] perf: Fix broken union in ' struct perf_event_mmap_page' Vince Weaver
2013-06-28 13:22 ` [PATCH 2/5] x86: add ability to calculate TSC from perf sample timestamps Adrian Hunter
2013-07-24 3:56 ` [tip:perf/core] perf/x86: Add " tip-bot for Adrian Hunter
2013-06-28 13:22 ` [PATCH 3/5] perf tools: add test for converting perf time to/from TSC Adrian Hunter
2013-07-24 3:56 ` [tip:perf/core] perf tools: Add test for converting perf time to/ from TSC tip-bot for Adrian Hunter
2013-06-28 13:22 ` [PATCH 4/5] perf: add 'keep tracking' flag to PERF_EVENT_IOC_DISABLE Adrian Hunter
2013-06-28 13:22 ` [PATCH 5/5] perf tools: add 'keep tracking' test Adrian Hunter
2013-06-28 15:27 ` [PATCH 0/5] perf: add two new features Peter Zijlstra
2013-06-28 19:22 ` Adrian Hunter
2013-07-16 6:22 ` Adrian Hunter
2013-07-16 14:34 ` Peter Zijlstra
2013-07-17 11:28 ` Adrian Hunter
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=52396EB5.6050104@intel.com \
--to=adrian.hunter@intel.com \
--cc=a.p.zijlstra@chello.nl \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tip-commits@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=tglx@linutronix.de \
--cc=vince@deater.net \
/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.