From: Ingo Molnar <mingo@elte.hu>
To: Steven Rostedt <rostedt@goodmis.org>
Cc: LKML <linux-kernel@vger.kernel.org>,
Thomas Gleixner <tglx@linutronix.de>,
Peter Zijlstra <peterz@infradead.org>,
Andrew Morton <akpm@linux-foundation.org>,
prasad@linux.vnet.ibm.com,
Linus Torvalds <torvalds@linux-foundation.org>,
Mathieu Desnoyers <compudj@krystal.dyndns.org>,
"Frank Ch. Eigler" <fche@redhat.com>,
David Wilder <dwilder@us.ibm.com>,
hch@lst.de, Martin Bligh <mbligh@google.com>,
Christoph Hellwig <hch@infradead.org>,
Masami Hiramatsu <mhiramat@redhat.com>,
Steven Rostedt <srostedt@redhat.com>,
Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Subject: Re: [PATCH v9] Unified trace buffer
Date: Sat, 27 Sep 2008 20:39:12 +0200 [thread overview]
Message-ID: <20080927183912.GA13685@elte.hu> (raw)
In-Reply-To: <alpine.DEB.1.10.0809270203270.1628@gandalf.stny.rr.com>
small nitpicking review, nothing structural yet:
* Steven Rostedt <rostedt@goodmis.org> wrote:
> Index: linux-trace.git/include/linux/ring_buffer.h
> +enum {
> + RB_TYPE_PADDING, /* Left over page padding
RB_ clashes with red-black tree namespace. (on the thought level)
> +#define RB_ALIGNMENT_SHIFT 2
> +#define RB_ALIGNMENT (1 << RB_ALIGNMENT_SHIFT)
> +#define RB_MAX_SMALL_DATA (28)
no need to put numeric literals into parenthesis.
> +static inline unsigned
> +ring_buffer_event_length(struct ring_buffer_event *event)
> +{
> + unsigned length;
> +
> + switch (event->type) {
> + case RB_TYPE_PADDING:
> + /* undefined */
> + return -1;
> +
> + case RB_TYPE_TIME_EXTENT:
> + return RB_LEN_TIME_EXTENT;
> +
> + case RB_TYPE_TIME_STAMP:
> + return RB_LEN_TIME_STAMP;
> +
> + case RB_TYPE_DATA:
> + if (event->len)
> + length = event->len << RB_ALIGNMENT_SHIFT;
> + else
> + length = event->array[0];
> + return length + RB_EVNT_HDR_SIZE;
> + default:
> + BUG();
> + }
> + /* not hit */
> + return 0;
too large, please uninline.
> +static inline void *
> +ring_buffer_event_data(struct ring_buffer_event *event)
> +{
> + BUG_ON(event->type != RB_TYPE_DATA);
> + /* If length is in len field, then array[0] has the data */
> + if (event->len)
> + return (void *)&event->array[0];
> + /* Otherwise length is in array[0] and array[1] has the data */
> + return (void *)&event->array[1];
> +}
ditto.
> +/* FIXME!!! */
> +u64 ring_buffer_time_stamp(int cpu)
> +{
> + /* shift to debug/test normalization and TIME_EXTENTS */
> + return sched_clock() << DEBUG_SHIFT;
[ duly noted ;-) ]
> +}
> +void ring_buffer_normalize_time_stamp(int cpu, u64 *ts)
needs extra newline above.
> +/*
> + * head_page == tail_page && head == tail then buffer is empty.
> + */
> +struct ring_buffer_per_cpu {
> + int cpu;
> + struct ring_buffer *buffer;
> + raw_spinlock_t lock;
hm, should not be raw, at least initially. I am 95% sure we'll see
lockups, we always did when we iterated ftrace's buffer implementation
;-)
> +struct ring_buffer {
> + unsigned long size;
> + unsigned pages;
> + unsigned flags;
> + int cpus;
> + cpumask_t cpumask;
> + atomic_t record_disabled;
> +
> + struct mutex mutex;
> +
> + struct ring_buffer_per_cpu **buffers;
> +};
> +
> +struct ring_buffer_iter {
> + struct ring_buffer_per_cpu *cpu_buffer;
> + unsigned long head;
> + struct buffer_page *head_page;
> + u64 read_stamp;
please use consistent vertical whitespaces. Above, in the struct
ring_buffer definition, you can add another tab to most of the vars -
that will also make the '**buffers' line look nice.
same for all structs across this file. In my experience, a 50% vertical
break works best - the one you used here in 'struct ring_buffer_iter'.
> +};
> +
> +#define CHECK_COND(buffer, cond) \
> + if (unlikely(cond)) { \
> + atomic_inc(&buffer->record_disabled); \
> + WARN_ON(1); \
> + return -1; \
> + }
please name it RINGBUFFER_BUG_ON() / RINGBUFFER_WARN_ON(), so that we
dont have to memorize another set of debug names. [ See
DEBUG_LOCKS_WARN_ON() in include/linux/debug_locks.h ]
you can change it to:
> +static int
> +rb_allocate_pages(struct ring_buffer_per_cpu *cpu_buffer, unsigned nr_pages)
> +{
> + struct list_head *head = &cpu_buffer->pages;
> + LIST_HEAD(pages);
> + struct buffer_page *page, *tmp;
> + unsigned long addr;
> + unsigned i;
please apply ftrace's standard reverse christmas tree style and move the
'pages' line down two lines.
> +int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size)
> +{
> + struct ring_buffer_per_cpu *cpu_buffer;
> + unsigned long buffer_size;
> + LIST_HEAD(pages);
> + unsigned long addr;
> + unsigned nr_pages, rm_pages, new_pages;
> + struct buffer_page *page, *tmp;
> + int i, cpu;
ditto.
> +static inline void *rb_page_index(struct buffer_page *page, unsigned index)
> +{
> + void *addr;
> +
> + addr = page_address(&page->page);
'addr' initialization can move to the definition line - you save two
lines.
> + return addr + index;
> +}
> +
> +static inline struct ring_buffer_event *
> +rb_head_event(struct ring_buffer_per_cpu *cpu_buffer)
> +{
> + return rb_page_index(cpu_buffer->head_page,
> + cpu_buffer->head);
can all move to the same return line.
> +}
> +
> +static inline struct ring_buffer_event *
> +rb_iter_head_event(struct ring_buffer_iter *iter)
> +{
> + return rb_page_index(iter->head_page,
> + iter->head);
ditto.
> + for (head = 0; head < rb_head_size(cpu_buffer);
> + head += ring_buffer_event_length(event)) {
> + event = rb_page_index(cpu_buffer->head_page, head);
> + BUG_ON(rb_null_event(event));
( optional:when there's a multi-line loop then i generally try to insert
an extra newline when starting the body - to make sure the iterator
and the body stands apart visually. Matter of taste. )
> +static struct ring_buffer_event *
> +rb_reserve_next_event(struct ring_buffer_per_cpu *cpu_buffer,
> + unsigned type, unsigned long length)
> +{
> + u64 ts, delta;
> + struct ring_buffer_event *event;
> + static int once;
> +
> + ts = ring_buffer_time_stamp(cpu_buffer->cpu);
> +
> + if (cpu_buffer->tail) {
> + delta = ts - cpu_buffer->write_stamp;
> +
> + if (test_time_stamp(delta)) {
> + if (unlikely(delta > (1ULL << 59) && !once++)) {
> + printk(KERN_WARNING "Delta way too big! %llu"
> + " ts=%llu write stamp = %llu\n",
> + delta, ts, cpu_buffer->write_stamp);
> + WARN_ON(1);
> + }
> + /*
> + * The delta is too big, we to add a
> + * new timestamp.
> + */
> + event = __rb_reserve_next(cpu_buffer,
> + RB_TYPE_TIME_EXTENT,
> + RB_LEN_TIME_EXTENT,
> + &ts);
> + if (!event)
> + return NULL;
> +
> + /* check to see if we went to the next page */
> + if (cpu_buffer->tail) {
> + /* Still on same page, update timestamp */
> + event->time_delta = delta & TS_MASK;
> + event->array[0] = delta >> TS_SHIFT;
> + /* commit the time event */
> + cpu_buffer->tail +=
> + ring_buffer_event_length(event);
> + cpu_buffer->write_stamp = ts;
> + delta = 0;
> + }
> + }
> + } else {
> + rb_add_stamp(cpu_buffer, &ts);
> + delta = 0;
> + }
> +
> + event = __rb_reserve_next(cpu_buffer, type, length, &ts);
> + if (!event)
> + return NULL;
> +
> + /* If the reserve went to the next page, our delta is zero */
> + if (!cpu_buffer->tail)
> + delta = 0;
> +
> + event->time_delta = delta;
> +
> + return event;
> +}
this function is too long, please split it up. The first condition's
body could go into a separate function i guess.
> + RB_TYPE_TIME_EXTENT, /* Extent the time delta
> + * array[0] = time delta (28 .. 59)
> + * size = 8 bytes
> + */
please use standard comment style:
/*
* Comment
*/
Ingo
next prev parent reply other threads:[~2008-09-27 18:40 UTC|newest]
Thread overview: 102+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-09-25 18:51 [RFC PATCH 0/2 v3] Unified trace buffer Steven Rostedt
2008-09-25 18:51 ` [RFC PATCH 1/2 " Steven Rostedt
2008-09-26 1:02 ` [RFC PATCH v4] " Steven Rostedt
2008-09-26 1:52 ` Masami Hiramatsu
2008-09-26 2:11 ` Steven Rostedt
2008-09-26 2:47 ` Masami Hiramatsu
2008-09-26 3:20 ` Mathieu Desnoyers
2008-09-26 7:18 ` Peter Zijlstra
2008-09-26 10:45 ` Steven Rostedt
2008-09-26 11:00 ` Peter Zijlstra
2008-09-26 16:57 ` Masami Hiramatsu
2008-09-26 17:14 ` Steven Rostedt
2008-09-26 10:47 ` Steven Rostedt
2008-09-26 16:04 ` Mathieu Desnoyers
2008-09-26 17:11 ` [PATCH v5] " Steven Rostedt
2008-09-26 17:31 ` Arnaldo Carvalho de Melo
2008-09-26 17:37 ` Linus Torvalds
2008-09-26 17:46 ` Steven Rostedt
2008-09-27 17:02 ` Ingo Molnar
2008-09-27 17:18 ` Steven Rostedt
2008-09-26 18:05 ` [PATCH v6] " Steven Rostedt
2008-09-26 18:30 ` Richard Holden
2008-09-26 18:39 ` Steven Rostedt
2008-09-26 18:59 ` Peter Zijlstra
2008-09-26 19:46 ` Martin Bligh
2008-09-26 19:52 ` Steven Rostedt
2008-09-26 21:37 ` Steven Rostedt
2008-09-26 19:14 ` Peter Zijlstra
2008-09-26 22:28 ` Mike Travis
2008-09-26 23:56 ` Steven Rostedt
2008-09-27 0:05 ` Mike Travis
2008-09-27 0:18 ` Steven Rostedt
2008-09-27 0:46 ` Mike Travis
2008-09-27 0:52 ` Steven Rostedt
2008-09-26 19:17 ` Peter Zijlstra
2008-09-26 23:16 ` Arjan van de Ven
2008-09-26 20:08 ` Peter Zijlstra
2008-09-26 21:14 ` Masami Hiramatsu
2008-09-26 21:26 ` Steven Rostedt
2008-09-26 21:13 ` [PATCH v7] " Steven Rostedt
2008-09-27 2:02 ` [PATCH v8] " Steven Rostedt
2008-09-27 6:06 ` [PATCH v9] " Steven Rostedt
2008-09-27 18:39 ` Ingo Molnar [this message]
2008-09-27 19:24 ` Steven Rostedt
2008-09-27 19:41 ` Ingo Molnar
2008-09-27 19:54 ` Steven Rostedt
2008-09-27 20:00 ` Ingo Molnar
2008-09-29 15:05 ` Steven Rostedt
2008-09-27 20:07 ` Martin Bligh
2008-09-27 20:34 ` Ingo Molnar
2008-09-29 16:10 ` [PATCH v10 Golden] " Steven Rostedt
2008-09-29 16:11 ` Steven Rostedt
2008-09-29 23:35 ` Mathieu Desnoyers
2008-09-30 0:01 ` Steven Rostedt
2008-09-30 0:03 ` Mathieu Desnoyers
2008-09-30 0:12 ` Steven Rostedt
2008-09-30 3:46 ` Mathieu Desnoyers
2008-09-30 4:00 ` Steven Rostedt
2008-09-30 15:20 ` Jonathan Corbet
2008-09-30 15:54 ` Peter Zijlstra
2008-09-30 16:38 ` Linus Torvalds
2008-09-30 16:48 ` Steven Rostedt
2008-09-30 17:00 ` Peter Zijlstra
2008-09-30 17:41 ` Steven Rostedt
2008-09-30 17:49 ` Peter Zijlstra
2008-09-30 17:56 ` Steven Rostedt
2008-09-30 18:02 ` Steven Rostedt
2008-09-30 17:01 ` Linus Torvalds
2008-10-01 15:14 ` [PATCH] ring_buffer: allocate buffer page pointer Steven Rostedt
2008-10-01 17:36 ` Mathieu Desnoyers
2008-10-01 17:49 ` Steven Rostedt
2008-10-01 18:21 ` Mathieu Desnoyers
2008-10-02 8:50 ` Ingo Molnar
2008-10-02 8:51 ` Ingo Molnar
2008-10-02 9:05 ` [PATCH] ring-buffer: fix build error Ingo Molnar
2008-10-02 9:38 ` [boot crash] " Ingo Molnar
2008-10-02 13:16 ` Steven Rostedt
2008-10-02 13:17 ` Steven Rostedt
2008-10-02 15:50 ` Ingo Molnar
2008-10-02 18:27 ` Steven Rostedt
2008-10-02 18:55 ` Ingo Molnar
2008-10-02 23:18 ` [PATCH] ring_buffer: map to cpu not page Steven Rostedt
2008-10-02 23:36 ` Steven Rostedt
2008-10-03 4:56 ` [PATCH] x86 Topology cpu_to_node parameter check Mathieu Desnoyers
2008-10-03 5:20 ` Steven Rostedt
2008-10-03 15:56 ` Mathieu Desnoyers
2008-10-03 16:26 ` Steven Rostedt
2008-10-03 17:21 ` Mathieu Desnoyers
2008-10-03 17:54 ` Steven Rostedt
2008-10-03 18:53 ` [PATCH] topology.h define mess fix Mathieu Desnoyers
2008-10-03 20:14 ` Luck, Tony
2008-10-03 22:47 ` [PATCH] topology.h define mess fix v2 Mathieu Desnoyers
2008-10-03 7:27 ` [PATCH] ring_buffer: map to cpu not page Ingo Molnar
2008-10-02 9:06 ` [PATCH] ring_buffer: allocate buffer page pointer Andrew Morton
2008-10-02 9:41 ` Ingo Molnar
2008-10-02 13:06 ` Steven Rostedt
2008-09-26 22:31 ` [PATCH v6] Unified trace buffer Arnaldo Carvalho de Melo
2008-09-26 23:58 ` Steven Rostedt
2008-09-27 0:13 ` Linus Torvalds
2008-09-27 0:23 ` Steven Rostedt
2008-09-27 0:28 ` Steven Rostedt
2008-09-25 18:51 ` [RFC PATCH 2/2 v3] ftrace: make work with new ring buffer Steven Rostedt
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=20080927183912.GA13685@elte.hu \
--to=mingo@elte.hu \
--cc=acme@ghostprotocols.net \
--cc=akpm@linux-foundation.org \
--cc=compudj@krystal.dyndns.org \
--cc=dwilder@us.ibm.com \
--cc=fche@redhat.com \
--cc=hch@infradead.org \
--cc=hch@lst.de \
--cc=linux-kernel@vger.kernel.org \
--cc=mbligh@google.com \
--cc=mhiramat@redhat.com \
--cc=peterz@infradead.org \
--cc=prasad@linux.vnet.ibm.com \
--cc=rostedt@goodmis.org \
--cc=srostedt@redhat.com \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.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.