diff options
| -rw-r--r-- | include/linux/perf_event.h | 2 | ||||
| -rw-r--r-- | kernel/perf_event.c | 20 |
2 files changed, 4 insertions, 18 deletions
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 09cd9c1abfda..fb6c91eac7e3 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h | |||
| @@ -803,8 +803,6 @@ struct perf_cpu_context { | |||
| 803 | struct perf_output_handle { | 803 | struct perf_output_handle { |
| 804 | struct perf_event *event; | 804 | struct perf_event *event; |
| 805 | struct perf_mmap_data *data; | 805 | struct perf_mmap_data *data; |
| 806 | unsigned long head; | ||
| 807 | unsigned long offset; | ||
| 808 | unsigned long wakeup; | 806 | unsigned long wakeup; |
| 809 | unsigned long size; | 807 | unsigned long size; |
| 810 | void *addr; | 808 | void *addr; |
diff --git a/kernel/perf_event.c b/kernel/perf_event.c index 953ce46d7b2f..d25c864cadbf 100644 --- a/kernel/perf_event.c +++ b/kernel/perf_event.c | |||
| @@ -2967,20 +2967,11 @@ again: | |||
| 2967 | preempt_enable(); | 2967 | preempt_enable(); |
| 2968 | } | 2968 | } |
| 2969 | 2969 | ||
| 2970 | void perf_output_copy(struct perf_output_handle *handle, | 2970 | __always_inline void perf_output_copy(struct perf_output_handle *handle, |
| 2971 | const void *buf, unsigned int len) | 2971 | const void *buf, unsigned int len) |
| 2972 | { | 2972 | { |
| 2973 | handle->offset += len; | ||
| 2974 | |||
| 2975 | /* | ||
| 2976 | * Check we didn't copy past our reservation window, taking the | ||
| 2977 | * possible unsigned int wrap into account. | ||
| 2978 | */ | ||
| 2979 | if (WARN_ON_ONCE(((long)(handle->head - handle->offset)) < 0)) | ||
| 2980 | return; | ||
| 2981 | |||
| 2982 | do { | 2973 | do { |
| 2983 | unsigned long size = min(handle->size, len); | 2974 | unsigned long size = min_t(unsigned long, handle->size, len); |
| 2984 | 2975 | ||
| 2985 | memcpy(handle->addr, buf, size); | 2976 | memcpy(handle->addr, buf, size); |
| 2986 | 2977 | ||
| @@ -3055,15 +3046,12 @@ int perf_output_begin(struct perf_output_handle *handle, | |||
| 3055 | goto fail; | 3046 | goto fail; |
| 3056 | } while (local_cmpxchg(&data->head, offset, head) != offset); | 3047 | } while (local_cmpxchg(&data->head, offset, head) != offset); |
| 3057 | 3048 | ||
| 3058 | handle->offset = offset; | ||
| 3059 | handle->head = head; | ||
| 3060 | |||
| 3061 | if (head - local_read(&data->wakeup) > data->watermark) | 3049 | if (head - local_read(&data->wakeup) > data->watermark) |
| 3062 | local_add(data->watermark, &data->wakeup); | 3050 | local_add(data->watermark, &data->wakeup); |
| 3063 | 3051 | ||
| 3064 | handle->page = handle->offset >> (PAGE_SHIFT + page_order(data)); | 3052 | handle->page = offset >> (PAGE_SHIFT + page_order(data)); |
| 3065 | handle->page &= data->nr_pages - 1; | 3053 | handle->page &= data->nr_pages - 1; |
| 3066 | handle->size = handle->offset & ((PAGE_SIZE << page_order(data)) - 1); | 3054 | handle->size = offset & ((PAGE_SIZE << page_order(data)) - 1); |
| 3067 | handle->addr = data->data_pages[handle->page]; | 3055 | handle->addr = data->data_pages[handle->page]; |
| 3068 | handle->addr += handle->size; | 3056 | handle->addr += handle->size; |
| 3069 | handle->size = (PAGE_SIZE << page_order(data)) - handle->size; | 3057 | handle->size = (PAGE_SIZE << page_order(data)) - handle->size; |
