diff options
author | Peter Zijlstra <a.p.zijlstra@chello.nl> | 2009-06-02 10:16:02 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-06-02 15:45:32 -0400 |
commit | 8e3747c13c39246c7e46def7cf495d9d21d4c5f9 (patch) | |
tree | 6a57736dd784947dbd40b75674effcb63e6696a1 /kernel | |
parent | e4abb5d4f7ddabc1fc7c392cf0a10d8e5868c9ca (diff) |
perf_counter: Change data head from u32 to u64
Since some people worried that 4G might not be a large enough
as an mmap data window, extend it to 64 bit for capable
platforms.
Reported-by: Stephane Eranian <eranian@googlemail.com>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
LKML-Reference: <new-submission>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/perf_counter.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/kernel/perf_counter.c b/kernel/perf_counter.c index 5ecd9981c035..3f11a2bc6c79 100644 --- a/kernel/perf_counter.c +++ b/kernel/perf_counter.c | |||
@@ -2067,8 +2067,8 @@ __weak struct perf_callchain_entry *perf_callchain(struct pt_regs *regs) | |||
2067 | struct perf_output_handle { | 2067 | struct perf_output_handle { |
2068 | struct perf_counter *counter; | 2068 | struct perf_counter *counter; |
2069 | struct perf_mmap_data *data; | 2069 | struct perf_mmap_data *data; |
2070 | unsigned int offset; | 2070 | unsigned long head; |
2071 | unsigned int head; | 2071 | unsigned long offset; |
2072 | int nmi; | 2072 | int nmi; |
2073 | int overflow; | 2073 | int overflow; |
2074 | int locked; | 2074 | int locked; |
@@ -2122,7 +2122,8 @@ static void perf_output_lock(struct perf_output_handle *handle) | |||
2122 | static void perf_output_unlock(struct perf_output_handle *handle) | 2122 | static void perf_output_unlock(struct perf_output_handle *handle) |
2123 | { | 2123 | { |
2124 | struct perf_mmap_data *data = handle->data; | 2124 | struct perf_mmap_data *data = handle->data; |
2125 | int head, cpu; | 2125 | unsigned long head; |
2126 | int cpu; | ||
2126 | 2127 | ||
2127 | data->done_head = data->head; | 2128 | data->done_head = data->head; |
2128 | 2129 | ||
@@ -2135,7 +2136,7 @@ again: | |||
2135 | * before we publish the new head, matched by a rmb() in userspace when | 2136 | * before we publish the new head, matched by a rmb() in userspace when |
2136 | * reading this position. | 2137 | * reading this position. |
2137 | */ | 2138 | */ |
2138 | while ((head = atomic_xchg(&data->done_head, 0))) | 2139 | while ((head = atomic_long_xchg(&data->done_head, 0))) |
2139 | data->user_page->data_head = head; | 2140 | data->user_page->data_head = head; |
2140 | 2141 | ||
2141 | /* | 2142 | /* |
@@ -2148,7 +2149,7 @@ again: | |||
2148 | /* | 2149 | /* |
2149 | * Therefore we have to validate we did not indeed do so. | 2150 | * Therefore we have to validate we did not indeed do so. |
2150 | */ | 2151 | */ |
2151 | if (unlikely(atomic_read(&data->done_head))) { | 2152 | if (unlikely(atomic_long_read(&data->done_head))) { |
2152 | /* | 2153 | /* |
2153 | * Since we had it locked, we can lock it again. | 2154 | * Since we had it locked, we can lock it again. |
2154 | */ | 2155 | */ |
@@ -2195,7 +2196,7 @@ static int perf_output_begin(struct perf_output_handle *handle, | |||
2195 | do { | 2196 | do { |
2196 | offset = head = atomic_read(&data->head); | 2197 | offset = head = atomic_read(&data->head); |
2197 | head += size; | 2198 | head += size; |
2198 | } while (atomic_cmpxchg(&data->head, offset, head) != offset); | 2199 | } while (atomic_long_cmpxchg(&data->head, offset, head) != offset); |
2199 | 2200 | ||
2200 | handle->offset = offset; | 2201 | handle->offset = offset; |
2201 | handle->head = head; | 2202 | handle->head = head; |
@@ -2246,7 +2247,7 @@ static void perf_output_copy(struct perf_output_handle *handle, | |||
2246 | * Check we didn't copy past our reservation window, taking the | 2247 | * Check we didn't copy past our reservation window, taking the |
2247 | * possible unsigned int wrap into account. | 2248 | * possible unsigned int wrap into account. |
2248 | */ | 2249 | */ |
2249 | WARN_ON_ONCE(((int)(handle->head - handle->offset)) < 0); | 2250 | WARN_ON_ONCE(((long)(handle->head - handle->offset)) < 0); |
2250 | } | 2251 | } |
2251 | 2252 | ||
2252 | #define perf_output_put(handle, x) \ | 2253 | #define perf_output_put(handle, x) \ |