Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1343982
| From | Wang Nan <wangnan0@huawei.com> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | [PATCH 12/46] perf core: Prepare writing into ring buffer from end |
| Date | 2016-02-26 11:00 +0100 |
| Message-ID | <r6nlM-1cF-3@gated-at.bofh.it> (permalink) |
| References | <r6n2p-13D-3@gated-at.bofh.it> |
| Organization | linux.* mail to news gateway |
Convert perf_output_begin to __perf_output_begin and make the later
function able to write records from the end of the ring buffer.
Following commits will utilize the 'backward' flag.
This patch doesn't introduce any extra performance overhead since we
use always_inline.
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Cc: He Kuang <hekuang@huawei.com>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
---
kernel/events/ring_buffer.c | 42 ++++++++++++++++++++++++++++++++++++------
1 file changed, 36 insertions(+), 6 deletions(-)
diff --git a/kernel/events/ring_buffer.c b/kernel/events/ring_buffer.c
index 22e1a47..37c11c6 100644
--- a/kernel/events/ring_buffer.c
+++ b/kernel/events/ring_buffer.c
@@ -102,8 +102,21 @@ out:
preempt_enable();
}
-int perf_output_begin(struct perf_output_handle *handle,
- struct perf_event *event, unsigned int size)
+static bool __always_inline
+ring_buffer_has_space(unsigned long head, unsigned long tail,
+ unsigned long data_size, unsigned int size,
+ bool backward)
+{
+ if (!backward)
+ return CIRC_SPACE(head, tail, data_size) >= size;
+ else
+ return CIRC_SPACE(tail, head, data_size) >= size;
+}
+
+static int __always_inline
+__perf_output_begin(struct perf_output_handle *handle,
+ struct perf_event *event, unsigned int size,
+ bool backward)
{
struct ring_buffer *rb;
unsigned long tail, offset, head;
@@ -146,9 +159,12 @@ int perf_output_begin(struct perf_output_handle *handle,
do {
tail = READ_ONCE(rb->user_page->data_tail);
offset = head = local_read(&rb->head);
- if (!rb->overwrite &&
- unlikely(CIRC_SPACE(head, tail, perf_data_size(rb)) < size))
- goto fail;
+ if (!rb->overwrite) {
+ if (unlikely(!ring_buffer_has_space(head, tail,
+ perf_data_size(rb),
+ size, backward)))
+ goto fail;
+ }
/*
* The above forms a control dependency barrier separating the
@@ -162,9 +178,17 @@ int perf_output_begin(struct perf_output_handle *handle,
* See perf_output_put_handle().
*/
- head += size;
+ if (!backward)
+ head += size;
+ else
+ head -= size;
} while (local_cmpxchg(&rb->head, offset, head) != offset);
+ if (backward) {
+ offset = head;
+ head = (u64)(-head);
+ }
+
/*
* We rely on the implied barrier() by local_cmpxchg() to ensure
* none of the data stores below can be lifted up by the compiler.
@@ -206,6 +230,12 @@ out:
return -ENOSPC;
}
+int perf_output_begin(struct perf_output_handle *handle,
+ struct perf_event *event, unsigned int size)
+{
+ return __perf_output_begin(handle, event, size, false);
+}
+
unsigned int perf_output_copy(struct perf_output_handle *handle,
const void *buf, unsigned int len)
{
--
1.8.3.4
Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
[PATCH 00/46] perf tools: Fix and improvements (bpf and overwrite) Wang Nan <wangnan0@huawei.com> - 2016-02-26 10:40 +0100
[PATCH 07/46] perf trace: Print content of bpf-output event Wang Nan <wangnan0@huawei.com> - 2016-02-26 10:40 +0100
[tip:perf/core] perf trace: Print content of bpf-output event tip-bot for Wang Nan <tipbot@zytor.com> - 2016-02-27 10:50 +0100
[PATCH 43/46] perf record: Rename variable to make code clear Wang Nan <wangnan0@huawei.com> - 2016-02-26 10:40 +0100
[PATCH 46/46] perf tools: Don't warn about out of order event if write_backward is used Wang Nan <wangnan0@huawei.com> - 2016-02-26 10:50 +0100
[PATCH 26/46] perf record: Disable buildid cache options by default in switch output mode Wang Nan <wangnan0@huawei.com> - 2016-02-26 10:50 +0100
[PATCH 33/46] perf tools: Operate multiple channels Wang Nan <wangnan0@huawei.com> - 2016-02-26 10:50 +0100
[PATCH 24/46] perf record: Split output into multiple files via '--switch-output' Wang Nan <wangnan0@huawei.com> - 2016-02-26 10:50 +0100
[PATCH 45/46] perf record: Allow generate tracking events at the end of output Wang Nan <wangnan0@huawei.com> - 2016-02-26 10:50 +0100
[PATCH 36/46] perf record: Don't poll on overwrite channel Wang Nan <wangnan0@huawei.com> - 2016-02-26 10:50 +0100
[PATCH 30/46] perf record: Prevent reading invalid data in record__mmap_read Wang Nan <wangnan0@huawei.com> - 2016-02-26 10:50 +0100
[PATCH 31/46] perf tools: Add evlist channel helpers Wang Nan <wangnan0@huawei.com> - 2016-02-26 10:50 +0100
[PATCH 35/46] perf record: Don't read from and poll overwrite channel Wang Nan <wangnan0@huawei.com> - 2016-02-26 10:50 +0100
[PATCH 23/46] perf record: Add '--timestamp-filename' option to append timestamp to output filename Wang Nan <wangnan0@huawei.com> - 2016-02-26 10:50 +0100
[PATCH 25/46] perf record: Force enable --timestamp-filename when --switch-output is provided Wang Nan <wangnan0@huawei.com> - 2016-02-26 10:50 +0100
[PATCH 28/46] perf record: Generate tracking events for process forked by perf Wang Nan <wangnan0@huawei.com> - 2016-02-26 10:50 +0100
[PATCH 21/46] perf record: Turns auxtrace_snapshot_enable into 3 states Wang Nan <wangnan0@huawei.com> - 2016-02-26 10:50 +0100
[PATCH 27/46] perf record: Re-synthesize tracking events after output switching Wang Nan <wangnan0@huawei.com> - 2016-02-26 10:50 +0100
[PATCH 12/46] perf core: Prepare writing into ring buffer from end Wang Nan <wangnan0@huawei.com> - 2016-02-26 11:00 +0100
[PATCH 19/46] perf record: Extract synthesize code to record__synthesize() Wang Nan <wangnan0@huawei.com> - 2016-02-26 11:00 +0100
[PATCH 11/46] perf core: Set event's default overflow_handler Wang Nan <wangnan0@huawei.com> - 2016-02-26 11:00 +0100
[PATCH 13/46] perf core: Add backward attribute to perf event Wang Nan <wangnan0@huawei.com> - 2016-02-26 11:00 +0100
[PATCH 18/46] perf record: Use WARN_ONCE to replace 'if' condition Wang Nan <wangnan0@huawei.com> - 2016-02-26 11:00 +0100
[PATCH 20/46] perf tools: Add perf_data_file__switch() helper Wang Nan <wangnan0@huawei.com> - 2016-02-26 11:00 +0100
[PATCH 17/46] perf tools: Make ordered_events reusable Wang Nan <wangnan0@huawei.com> - 2016-02-26 11:00 +0100
[PATCH 14/46] perf core: Reduce perf event output overhead by new overflow handler Wang Nan <wangnan0@huawei.com> - 2016-02-26 11:00 +0100
[PATCH 08/46] perf data: Support converting data from bpf_perf_event_output() Wang Nan <wangnan0@huawei.com> - 2016-02-26 11:00 +0100
[PATCH 10/46] perf core: Introduce new ioctl options to pause and resume ring buffer Wang Nan <wangnan0@huawei.com> - 2016-02-26 11:00 +0100
Re: [PATCH 10/46] perf core: Introduce new ioctl options to pause and resume ring buffer Arnaldo Carvalho de Melo <acme@kernel.org> - 2016-02-29 16:40 +0100
Re: [PATCH 10/46] perf core: Introduce new ioctl options to pause and resume ring buffer "Wangnan (F)" <wangnan0@huawei.com> - 2016-03-03 03:20 +0100
[PATCH 09/46] perf data: Explicitly set byte order for integer types Wang Nan <wangnan0@huawei.com> - 2016-02-26 11:00 +0100
[PATCH 03/46] perf config: Bring perf_default_config to the very beginning at main() Wang Nan <wangnan0@huawei.com> - 2016-02-26 11:00 +0100
[tip:perf/core] perf config: Bring perf_default_config to the very beginning at main() tip-bot for Wang Nan <tipbot@zytor.com> - 2016-02-27 10:50 +0100
csiph-web