* [PATCH] perf_counter: Fix lockup with interrupting counters
@ 2009-06-05 2:36 Paul Mackerras
2009-06-05 6:24 ` [tip:perfcounters/core] " tip-bot for Paul Mackerras
0 siblings, 1 reply; 2+ messages in thread
From: Paul Mackerras @ 2009-06-05 2:36 UTC (permalink / raw)
To: Ingo Molnar; +Cc: Peter Zijlstra, linux-kernel
Commit 8e3747c1 ("perf_counter: Change data head from u32 to u64")
changed the type of 'head' in struct perf_mmap_data from atomic_t
to atomic_long_t, but missed converting one use of atomic_read on
it to atomic_long_read. The effect of using atomic_read rather than
atomic_long_read on powerpc (and other big-endian architectures) is
that we get the high half of the 64-bit quantity, resulting in the
cmpxchg retry loop in perf_output_begin spinning forever as soon as
data->head becomes non-zero. On little-endian architectures such as
x86 we would get the low half, resulting in a lockup once data->head
becomes greater than 4G.
This fixes it by using atomic_long_read rather than atomic_read.
Signed-off-by: Paul Mackerras <paulus@samba.org>
---
kernel/perf_counter.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/kernel/perf_counter.c b/kernel/perf_counter.c
index 195712e..a5d3e2a 100644
--- a/kernel/perf_counter.c
+++ b/kernel/perf_counter.c
@@ -2234,7 +2234,7 @@ static int perf_output_begin(struct perf_output_handle *handle,
perf_output_lock(handle);
do {
- offset = head = atomic_read(&data->head);
+ offset = head = atomic_long_read(&data->head);
head += size;
} while (atomic_long_cmpxchg(&data->head, offset, head) != offset);
--
1.6.0.4
^ permalink raw reply related [flat|nested] 2+ messages in thread
* [tip:perfcounters/core] perf_counter: Fix lockup with interrupting counters
2009-06-05 2:36 [PATCH] perf_counter: Fix lockup with interrupting counters Paul Mackerras
@ 2009-06-05 6:24 ` tip-bot for Paul Mackerras
0 siblings, 0 replies; 2+ messages in thread
From: tip-bot for Paul Mackerras @ 2009-06-05 6:24 UTC (permalink / raw)
To: linux-tip-commits
Cc: linux-kernel, paulus, hpa, mingo, a.p.zijlstra, tglx, mingo
Commit-ID: 6dc5f2a41759987e35e757ef00192e7b424563bb
Gitweb: http://git.kernel.org/tip/6dc5f2a41759987e35e757ef00192e7b424563bb
Author: Paul Mackerras <paulus@samba.org>
AuthorDate: Fri, 5 Jun 2009 12:36:28 +1000
Committer: Ingo Molnar <mingo@elte.hu>
CommitDate: Fri, 5 Jun 2009 08:22:26 +0200
perf_counter: Fix lockup with interrupting counters
Commit 8e3747c1 ("perf_counter: Change data head from u32 to u64")
changed the type of 'head' in struct perf_mmap_data from atomic_t
to atomic_long_t, but missed converting one use of atomic_read on
it to atomic_long_read. The effect of using atomic_read rather than
atomic_long_read on powerpc (and other big-endian architectures) is
that we get the high half of the 64-bit quantity, resulting in the
cmpxchg retry loop in perf_output_begin spinning forever as soon as
data->head becomes non-zero. On little-endian architectures such as
x86 we would get the low half, resulting in a lockup once data->head
becomes greater than 4G.
This fixes it by using atomic_long_read rather than atomic_read.
[ Impact: fix perfcounter lockup on PowerPC / big-endian systems ]
Signed-off-by: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
LKML-Reference: <18984.33964.21541.743096@cargo.ozlabs.ibm.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
---
kernel/perf_counter.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/kernel/perf_counter.c b/kernel/perf_counter.c
index 195712e..a5d3e2a 100644
--- a/kernel/perf_counter.c
+++ b/kernel/perf_counter.c
@@ -2234,7 +2234,7 @@ static int perf_output_begin(struct perf_output_handle *handle,
perf_output_lock(handle);
do {
- offset = head = atomic_read(&data->head);
+ offset = head = atomic_long_read(&data->head);
head += size;
} while (atomic_long_cmpxchg(&data->head, offset, head) != offset);
^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2009-06-05 6:26 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-06-05 2:36 [PATCH] perf_counter: Fix lockup with interrupting counters Paul Mackerras
2009-06-05 6:24 ` [tip:perfcounters/core] " tip-bot for Paul Mackerras
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.