All of lore.kernel.org
 help / color / mirror / Atom feed
From: Madhavan Srinivasan <maddy@linux.vnet.ibm.com>
To: Peter Zijlstra <peterz@infradead.org>
Cc: linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org,
	Yury Norov <ynorov@caviumnetworks.com>,
	Ingo Molnar <mingo@redhat.com>,
	Arnaldo Carvalho de Melo <acme@kernel.org>,
	Alexander Shishkin <alexander.shishkin@linux.intel.com>,
	Jiri Olsa <jolsa@kernel.org>,
	Michael Ellerman <mpe@ellerman.id.au>
Subject: Re: [PATCH] perf/core: Fix the mask in perf_output_sample_regs
Date: Tue, 16 Aug 2016 10:59:05 +0530	[thread overview]
Message-ID: <80480a53-c9db-d912-c560-0c31b81100ce@linux.vnet.ibm.com> (raw)
In-Reply-To: <20160811122710.GP6879@twins.programming.kicks-ass.net>



On Thursday 11 August 2016 05:57 PM, Peter Zijlstra wrote:
> Sorry, found it in my inbox while clearing out backlog..
>
> On Sun, Jul 03, 2016 at 11:31:58PM +0530, Madhavan Srinivasan wrote:
>> When decoding the perf_regs mask in perf_output_sample_regs(),
>> we loop through the mask using find_first_bit and find_next_bit functions.
>> While the exisitng code works fine in most of the case,
>> the logic is broken for 32bit kernel (Big Endian).
>> When reading u64 mask using (u32 *)(&val)[0], find_*_bit() assumes it gets
>> lower 32bits of u64 but instead gets upper 32bits which is wrong.
>> Proposed fix is to swap the words of the u64 to handle this case.
>> This is _not_ endianness swap.
> But it looks an awful lot like it..
Hit this issue when testing my perf_arch_regs patchset. Yep exactly
the reason for adding that comment in the commit message.


>
>> +++ b/kernel/events/core.c
>> @@ -5205,8 +5205,10 @@ perf_output_sample_regs(struct perf_output_handle *handle,
>>   			struct pt_regs *regs, u64 mask)
>>   {
>>   	int bit;
>> +	DECLARE_BITMAP(_mask, 64);
>>   
>> -	for_each_set_bit(bit, (const unsigned long *) &mask,
>> +	bitmap_from_u64(_mask, mask);
>> +	for_each_set_bit(bit, _mask,
>>   			 sizeof(mask) * BITS_PER_BYTE) {
>>   		u64 val;
>> +++ b/lib/bitmap.c
>> +void bitmap_from_u64(unsigned long *dst, u64 mask)
>> +{
>> +	dst[0] = mask & ULONG_MAX;
>> +
>> +	if (sizeof(mask) > sizeof(unsigned long))
>> +		dst[1] = mask >> 32;
>> +}
>> +EXPORT_SYMBOL(bitmap_from_u64);
> Looks small enough for an inline.
>
> Alternatively you can go all the way and add bitmap_from_u64array(), but
> that seems massive overkill.

Ok will make it inline and resend.

Maddy

>
> Tedious stuff.. I can't come up with anything prettier :/
>

      reply	other threads:[~2016-08-16  5:29 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-07-03 18:01 [PATCH] perf/core: Fix the mask in perf_output_sample_regs Madhavan Srinivasan
2016-07-04  7:19 ` Yury Norov
2016-07-04 22:41   ` Arnaldo Carvalho de Melo
2016-08-11 12:27 ` Peter Zijlstra
2016-08-16  5:29   ` Madhavan Srinivasan [this message]

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=80480a53-c9db-d912-c560-0c31b81100ce@linux.vnet.ibm.com \
    --to=maddy@linux.vnet.ibm.com \
    --cc=acme@kernel.org \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=jolsa@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=mingo@redhat.com \
    --cc=mpe@ellerman.id.au \
    --cc=peterz@infradead.org \
    --cc=ynorov@caviumnetworks.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 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.