All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Ahern <dsahern@gmail.com>
To: Jiri Olsa <jolsa@redhat.com>
Cc: acme@redhat.com, a.p.zijlstra@chello.nl, mingo@elte.hu,
	paulus@samba.org, cjashfor@linux.vnet.ibm.com,
	fweisbec@gmail.com, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 6/7] perf, tool: Fix endianity trick for adds_features bitmask
Date: Tue, 22 May 2012 09:48:09 -0600	[thread overview]
Message-ID: <4FBBB539.5010805@gmail.com> (raw)
In-Reply-To: <20120522084153.GC2901@m.brq.redhat.com>

[-- Attachment #1: Type: text/plain, Size: 174 bytes --]

On 5/22/12 2:41 AM, Jiri Olsa wrote:

> hm, any special details for the record? because I'm sure I tested this way..
>
> I'll retest, thanks
> jirka


The attached fixes it.

[-- Attachment #2: perf-swap-features.patch --]
[-- Type: text/plain, Size: 4019 bytes --]

commit 1353676ca6551a0165df030784ada20ebea73f73
Author: David Ahern <dsahern@gmail.com>
Date:   Tue May 22 09:40:17 2012 -0600

    perf, tool: Fix endianity swapping for adds_features bitmask
    
    Based on Jiri's latest attempt:
    https://lkml.org/lkml/2012/5/16/61
    
    Basically, adds_features should be byte swapped assuming unsigned
    longs are either 8-bytes (u64) or 4-bytes (u32).
    
    Fixes 32-bit ppc dumping 64-bit x86 feature data:
     ========
     captured on: Sun May 20 19:23:23 2012
     hostname : nxos-vdc-dev3
     os release : 3.4.0-rc7+
     perf version : 3.4.rc4.137.g978da3
     arch : x86_64
     nrcpus online : 16
     nrcpus avail : 16
     cpudesc : Intel(R) Xeon(R) CPU E5540 @ 2.53GHz
     cpuid : GenuineIntel,6,26,5
     total memory : 24680324 kB
    ...
    
    Verified 64-bit x86 can still dump feature data for 32-bit ppc.
    
    Signed-off-by: David Ahern <dsahern@gmail.com>

diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
index 5385980..81db55b 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -1942,7 +1942,6 @@ int perf_file_header__read(struct perf_file_header *header,
 		else
 			return -1;
 	} else if (ph->needs_swap) {
-		unsigned int i;
 		/*
 		 * feature bitmap is declared as an array of unsigned longs --
 		 * not good since its size can differ between the host that
@@ -1958,14 +1957,17 @@ int perf_file_header__read(struct perf_file_header *header,
 		 * file), punt and fallback to the original behavior --
 		 * clearing all feature bits and setting buildid.
 		 */
-		for (i = 0; i < BITS_TO_LONGS(HEADER_FEAT_BITS); ++i)
-			header->adds_features[i] = bswap_64(header->adds_features[i]);
+		mem_bswap_64(&header->adds_features,
+			    BITS_TO_U64(HEADER_FEAT_BITS));
 
 		if (!test_bit(HEADER_HOSTNAME, header->adds_features)) {
-			for (i = 0; i < BITS_TO_LONGS(HEADER_FEAT_BITS); ++i) {
-				header->adds_features[i] = bswap_64(header->adds_features[i]);
-				header->adds_features[i] = bswap_32(header->adds_features[i]);
-			}
+			/* unswap as u64 */
+			mem_bswap_64(&header->adds_features,
+				    BITS_TO_U64(HEADER_FEAT_BITS));
+
+			/* unswap as u32 */
+			mem_bswap_32(&header->adds_features,
+				    BITS_TO_U32(HEADER_FEAT_BITS));
 		}
 
 		if (!test_bit(HEADER_HOSTNAME, header->adds_features)) {
diff --git a/tools/perf/util/include/linux/bitops.h b/tools/perf/util/include/linux/bitops.h
index f1584833..587a230 100644
--- a/tools/perf/util/include/linux/bitops.h
+++ b/tools/perf/util/include/linux/bitops.h
@@ -8,6 +8,8 @@
 #define BITS_PER_LONG __WORDSIZE
 #define BITS_PER_BYTE           8
 #define BITS_TO_LONGS(nr)       DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))
+#define BITS_TO_U64(nr)         DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(u64))
+#define BITS_TO_U32(nr)         DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(u32))
 
 #define for_each_set_bit(bit, addr, size) \
 	for ((bit) = find_first_bit((addr), (size));		\
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
index 4dcc8f3..43870c2 100644
--- a/tools/perf/util/session.c
+++ b/tools/perf/util/session.c
@@ -441,6 +441,16 @@ void mem_bswap_64(void *src, int byte_size)
 	}
 }
 
+void mem_bswap_32(void *src, int byte_size)
+{
+	u32 *m = src;
+	while (byte_size > 0) {
+		*m = bswap_32(*m);
+		byte_size -= sizeof(u32);
+		++m;
+	}
+}
+
 static void perf_event__all64_swap(union perf_event *event)
 {
 	struct perf_event_header *hdr = &event->header;
diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h
index 7a5434c..0c702e3 100644
--- a/tools/perf/util/session.h
+++ b/tools/perf/util/session.h
@@ -80,6 +80,7 @@ struct branch_info *machine__resolve_bstack(struct machine *self,
 bool perf_session__has_traces(struct perf_session *self, const char *msg);
 
 void mem_bswap_64(void *src, int byte_size);
+void mem_bswap_32(void *src, int byte_size);
 void perf_event__attr_swap(struct perf_event_attr *attr);
 
 int perf_session__create_kernel_maps(struct perf_session *self);

  reply	other threads:[~2012-05-22 15:48 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-05-16  6:59 [PATCHv4 0/7] perf, tool: Fix endian issues Jiri Olsa
2012-05-16  6:59 ` [PATCH 1/7] perf, tool: Handle different endians properly during symbol load Jiri Olsa
2012-05-22  3:26   ` David Ahern
2012-05-16  6:59 ` [PATCH 2/7] perf, tool: Carry perf_event_attr bitfield throught different endians Jiri Olsa
2012-05-22  3:29   ` David Ahern
2012-05-23 15:26   ` [tip:perf/core] perf tools: " tip-bot for Jiri Olsa
2012-05-16  6:59 ` [PATCH 3/7] perf, tool: Add union u64_swap type for swapping u64 data Jiri Olsa
2012-05-22  3:29   ` David Ahern
2012-05-23 15:27   ` [tip:perf/core] perf tools: " tip-bot for Jiri Olsa
2012-05-16  6:59 ` [PATCH 4/7] perf, tool: Handle endianity swap on sample_id_all header data Jiri Olsa
2012-05-22  3:35   ` David Ahern
2012-05-16  6:59 ` [PATCH 5/7] perf, tool: Fix 32 bit values endianity swap for sample_id_all header Jiri Olsa
2012-05-22  4:38   ` David Ahern
2012-05-22 15:53     ` Arnaldo Carvalho de Melo
2012-05-16  6:59 ` [PATCH 6/7] perf, tool: Fix endianity trick for adds_features bitmask Jiri Olsa
2012-05-22  4:38   ` David Ahern
2012-05-22  8:41     ` Jiri Olsa
2012-05-22 15:48       ` David Ahern [this message]
2012-05-23 17:59         ` Jiri Olsa
2012-05-24 15:32           ` David Ahern
2012-05-24 19:48             ` Jiri Olsa
2012-06-15 19:10         ` [tip:perf/urgent] perf tools: Fix endianity swapping " tip-bot for David Ahern
2012-05-16  6:59 ` [PATCH 7/7] perf, tool: Fix callchain ip printf Jiri Olsa
2012-05-21  7:39   ` [tip:perf/core] perf hists: Fix callchain ip printf format tip-bot for Jiri Olsa

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=4FBBB539.5010805@gmail.com \
    --to=dsahern@gmail.com \
    --cc=a.p.zijlstra@chello.nl \
    --cc=acme@redhat.com \
    --cc=cjashfor@linux.vnet.ibm.com \
    --cc=fweisbec@gmail.com \
    --cc=jolsa@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=paulus@samba.org \
    /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.