All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC][PATCH] ring-buffer: Have nested events still record running time stamp
@ 2020-06-25 13:44 Steven Rostedt
  2020-06-25 13:53 ` Mathieu Desnoyers
                   ` (6 more replies)
  0 siblings, 7 replies; 31+ messages in thread
From: Steven Rostedt @ 2020-06-25 13:44 UTC (permalink / raw)
  To: LKML
  Cc: Ingo Molnar, Peter Zijlstra, Thomas Gleixner, Masami Hiramatsu,
	Arnaldo Carvalho de Melo, Jiri Olsa, Namhyung Kim,
	Yordan Karadzhov, Tzvetomir Stoyanov, Mathieu Desnoyers,
	Tom Zanussi, Jason Behmer, Julia Lawall, Clark Williams,
	Daniel Bristot de Oliveira, Daniel Wagner, Darren Hart,
	Jonathan Corbet, Suresh E. Warrier

From: "Steven Rostedt (VMware)" <rostedt@goodmis.org>

[ SEVEN YEAR PROBLEM SOLVED! ]

Up until now, if an event is interrupted while it is recorded by an
interrupt, and that interrupt records events, the time of those events will
all be the same. This is because events only record the delta of the time
since the previous event (or beginning of a page), and to handle updating
the time keeping for that of nested events is extremely racy. After years of
thinking about this and several failed attempts, I finally have a solution
to solve this puzzle.

The problem is that you need to atomically calculate the delta and then
update the time stamp you made the delta from, as well as then record it
into the buffer, all this while at any time an interrupt can come in and
do the same thing. This is easy to solve with heavy weight atomics, but that
would be detrimental to the performance of the ring buffer. The current
state of affairs sacrificed the time deltas for nested events for
performance.

The reason for previous failed attempts at solving this puzzle was because I
was trying to completely avoid slow atomic operations like cmpxchg. I final
came to the conclusion to always avoid cmpxchg is not possible, which is why
those previous attempts always failed. But it is possible to pick one path
(the most common case) and avoid cmpxchg in that path, which is the "fast
path". The most common case is that an event will not be interrupted and
have other events added into it. An event can detect if it has
interrupted another event, and for these cases we can make it the slow
path and use the heavy operations like cmpxchg.

One more player was added to the game that made this possible, and that is
the "absolute timestamp" (by Tom Zanussi) that allows us to inject a full 59
bit time stamp. (Of course this breaks if a machine is running for more than
18 years without a reboot!).

There's barrier() placements around for being paranoid, even when they
are not needed because of other atomic functions near by. But those
should not hurt, as if they are not needed, they basically become a nop.

Note, this also makes the race window much smaller, which means there
are less slow paths to slow down the performance.

Here's the design of this solution:

 All this is per cpu, and only needs to worry about nested events (not
 parallel events).

The players:

 write_tail: The index in the buffer where new events can be written to.
     It is incremented via local_add() to reserve space for a new event.

 before_stamp: A time stamp set by all events before reserving space.

 write_stamp: A time stamp updated by events after it has successfully
     reserved space.

 next_write: A copy of "write_tail" used to help with races.

	/* Save the current position of write */
 [A]	w = local_read(write_tail);
	barrier();
	/* Read both before and write stamps before touching anything */
	before = READ_ONCE(before_stamp);
	after = local_read(write_stamp);
	barrier();

	/*
	 * If before and after are the same, then this event is not
	 * preempting a time update. If it is, then reserve space for adding
	 * a full time stamp (this can turn into a time extend which is
	 * just an extended time delta but fill up the extra space).
	 */
	if (after != before)
		abs = true;

	ts = clock();

	/* Now update the before_stamp (everyone does this!) */
 [B]	WRITE_ONCE(before_stamp, ts);

	/* Read the current next_write and update it to what we want write
	 * to be after we reserve space. */
 	next = READ_ONCE(next_write);
	WRITE_ONCE(next_write, w + len);

	/* Now reserve space on the buffer */
 [C]	write = local_add_return(len, write_tail);

	/* Set tail to be were this event's data is */
	tail = write - len;

 	if (w == tail) {

		/* Nothing preempted this between A and C */
 [D]		local_set(write_stamp, ts);
		barrier();
 [E]		save_before = READ_ONCE(before_stamp);

 		if (!abs) {
			/* This did not preempt a time update */
			delta = ts - a;
		} else {
			/* slow path */
			if (w == next) {
				/* This event preempted the previous event
				 * just after it reserved its buffer.
				 * It's timestamp should be "before_stamp" */
				delta = ts - before;
				abs = 0; /* No need for that full time stamp */
			} else {
				delta = ts; /* The full time stamp will be in use */
			}
		}
		if (ts != save_before) {
			/* slow path - Was preempted between C and E */
			/* The update to write_stamp could have overwritten the update to
			 * it by the preempting event, but before and after should be
			 * the same for all completed top events */
			after = local_read(write_stamp);
			if (save_before > after)
				local_cmpxchg(write_stamp, after, save_before);
		}
	} else {
		/* slow path - Preempted between A and C */

		after = local_read(write_stamp);
		temp_ts = clock();
		barrier();
 [F]		if (write == local_read(write_tail) && after < temp_ts) {
			/* This was not preempted since C and F
			 * The last write_stamp is still valid for the previous event
			 * in the buffer. */
			delta = temp_ts - after;
			/* OK to keep this new time stamp */
			ts = temp_ts;
		} else {
			/* Preempted between C and F
			 * Well, there's no use to try to know what the time stamp
			 * is for the previous event. Just set delta to zero and
			 * be the same time as that event that preempted us before
			 * the reservation of the buffer. */

			delta = 0;
		}
		/* No need to use full timestamps here */
		abs = 0;
	}

Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
---
 kernel/trace/ring_buffer.c | 274 +++++++++++++++++++++++++------------
 1 file changed, 188 insertions(+), 86 deletions(-)

diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
index b8e1ca48be50..a5c3f1608de8 100644
--- a/kernel/trace/ring_buffer.c
+++ b/kernel/trace/ring_buffer.c
@@ -418,6 +418,17 @@ struct rb_event_info {
 	int			add_timestamp;
 };
 
+/*
+ * Used for the add_timestamp
+ *  NONE
+ *  NORMAL - may be for either time extend or absolute
+ *  FORCE - force a full time stamp.
+ */
+enum {
+	RB_ADD_STAMP_NONE,
+	RB_ADD_STAMP_NORMAL,
+	RB_ADD_STAMP_FORCE
+};
 /*
  * Used for which event context the event is in.
  *  NMI     = 0
@@ -470,8 +481,10 @@ struct ring_buffer_per_cpu {
 	size_t				shortest_full;
 	unsigned long			read;
 	unsigned long			read_bytes;
-	u64				write_stamp;
+	unsigned long			next_write;
+	local64_t			write_stamp;
 	u64				read_stamp;
+	u64				before_stamp;
 	/* ring buffer pages to update, > 0 to add, < 0 to remove */
 	long				nr_pages_to_update;
 	struct list_head		new_pages; /* new pages to add */
@@ -2416,16 +2429,13 @@ rb_update_event(struct ring_buffer_per_cpu *cpu_buffer,
 	unsigned length = info->length;
 	u64 delta = info->delta;
 
-	/* Only a commit updates the timestamp */
-	if (unlikely(!rb_event_is_commit(cpu_buffer, event)))
-		delta = 0;
-
 	/*
 	 * If we need to add a timestamp, then we
 	 * add it to the start of the reserved space.
 	 */
 	if (unlikely(info->add_timestamp)) {
-		bool abs = ring_buffer_time_stamp_abs(cpu_buffer->buffer);
+		bool abs = info->add_timestamp == RB_ADD_STAMP_FORCE ||
+			ring_buffer_time_stamp_abs(cpu_buffer->buffer);
 
 		event = rb_add_time_stamp(event, info->delta, abs);
 		length -= RB_LEN_TIME_EXTEND;
@@ -2480,6 +2490,39 @@ static inline bool sched_clock_stable(void)
 }
 #endif
 
+static __always_inline bool
+rb_event_is_commit(struct ring_buffer_per_cpu *cpu_buffer,
+		   struct ring_buffer_event *event)
+{
+	unsigned long addr = (unsigned long)event;
+	unsigned long index;
+
+	index = rb_event_index(event);
+	addr &= PAGE_MASK;
+
+	return cpu_buffer->commit_page->page == (void *)addr &&
+		rb_commit_index(cpu_buffer) == index;
+}
+
+static u64 rb_time_delta(struct ring_buffer_event *event)
+{
+	switch (event->type_len) {
+	case RINGBUF_TYPE_PADDING:
+		return 0;
+
+	case RINGBUF_TYPE_TIME_EXTEND:
+		return ring_buffer_event_time_stamp(event);
+
+	case RINGBUF_TYPE_TIME_STAMP:
+		return 0;
+
+	case RINGBUF_TYPE_DATA:
+		return event->time_delta;
+	default:
+		return 0;
+	}
+}
+
 static inline int
 rb_try_to_discard(struct ring_buffer_per_cpu *cpu_buffer,
 		  struct ring_buffer_event *event)
@@ -2488,6 +2531,8 @@ rb_try_to_discard(struct ring_buffer_per_cpu *cpu_buffer,
 	struct buffer_page *bpage;
 	unsigned long index;
 	unsigned long addr;
+	u64 write_stamp;
+	u64 delta;
 
 	new_index = rb_event_index(event);
 	old_index = new_index + rb_event_ts_length(event);
@@ -2496,10 +2541,32 @@ rb_try_to_discard(struct ring_buffer_per_cpu *cpu_buffer,
 
 	bpage = READ_ONCE(cpu_buffer->tail_page);
 
+	delta = rb_time_delta(event);
+
+	write_stamp = local64_read(&cpu_buffer->write_stamp);
+
+	/* Make sure the write stamp is read before testing the location */
+	barrier();
+
 	if (bpage->page == (void *)addr && rb_page_write(bpage) == old_index) {
 		unsigned long write_mask =
 			local_read(&bpage->write) & ~RB_WRITE_MASK;
 		unsigned long event_length = rb_event_length(event);
+		u64 ret;
+
+		ret = local64_cmpxchg(&cpu_buffer->write_stamp, write_stamp, write_stamp - delta);
+		/* Something came in, can't discard */
+		if (ret != write_stamp)
+			return 0;
+
+		/*
+		 * If an event were to come in now, it would see that the
+		 * write_stamp and the before_stamp are different, and assume
+		 * that this event just added itself before updating
+		 * the write stamp. The preempting event will fix the
+		 * write stamp for us, and use the before stamp as its delta.
+		 */
+
 		/*
 		 * This is on the tail page. It is possible that
 		 * a write could come in and move the tail page
@@ -2551,10 +2618,6 @@ rb_set_commit_to_write(struct ring_buffer_per_cpu *cpu_buffer)
 		local_set(&cpu_buffer->commit_page->page->commit,
 			  rb_page_write(cpu_buffer->commit_page));
 		rb_inc_page(cpu_buffer, &cpu_buffer->commit_page);
-		/* Only update the write stamp if the page has an event */
-		if (rb_page_write(cpu_buffer->commit_page))
-			cpu_buffer->write_stamp =
-				cpu_buffer->commit_page->page->time_stamp;
 		/* add barrier to keep gcc from optimizing too much */
 		barrier();
 	}
@@ -2626,54 +2689,10 @@ static inline void rb_event_discard(struct ring_buffer_event *event)
 		event->time_delta = 1;
 }
 
-static __always_inline bool
-rb_event_is_commit(struct ring_buffer_per_cpu *cpu_buffer,
-		   struct ring_buffer_event *event)
-{
-	unsigned long addr = (unsigned long)event;
-	unsigned long index;
-
-	index = rb_event_index(event);
-	addr &= PAGE_MASK;
-
-	return cpu_buffer->commit_page->page == (void *)addr &&
-		rb_commit_index(cpu_buffer) == index;
-}
-
-static __always_inline void
-rb_update_write_stamp(struct ring_buffer_per_cpu *cpu_buffer,
-		      struct ring_buffer_event *event)
-{
-	u64 delta;
-
-	/*
-	 * The event first in the commit queue updates the
-	 * time stamp.
-	 */
-	if (rb_event_is_commit(cpu_buffer, event)) {
-		/*
-		 * A commit event that is first on a page
-		 * updates the write timestamp with the page stamp
-		 */
-		if (!rb_event_index(event))
-			cpu_buffer->write_stamp =
-				cpu_buffer->commit_page->page->time_stamp;
-		else if (event->type_len == RINGBUF_TYPE_TIME_EXTEND) {
-			delta = ring_buffer_event_time_stamp(event);
-			cpu_buffer->write_stamp += delta;
-		} else if (event->type_len == RINGBUF_TYPE_TIME_STAMP) {
-			delta = ring_buffer_event_time_stamp(event);
-			cpu_buffer->write_stamp = delta;
-		} else
-			cpu_buffer->write_stamp += event->time_delta;
-	}
-}
-
 static void rb_commit(struct ring_buffer_per_cpu *cpu_buffer,
 		      struct ring_buffer_event *event)
 {
 	local_inc(&cpu_buffer->entries);
-	rb_update_write_stamp(cpu_buffer, event);
 	rb_end_commit(cpu_buffer);
 }
 
@@ -2872,13 +2891,13 @@ rb_handle_timestamp(struct ring_buffer_per_cpu *cpu_buffer,
 		  KERN_WARNING "Delta way too big! %llu ts=%llu write stamp = %llu\n%s",
 		  (unsigned long long)info->delta,
 		  (unsigned long long)info->ts,
-		  (unsigned long long)cpu_buffer->write_stamp,
+		  (unsigned long long)local64_read(&cpu_buffer->write_stamp),
 		  sched_clock_stable() ? "" :
 		  "If you just came from a suspend/resume,\n"
 		  "please switch to the trace global clock:\n"
 		  "  echo global > /sys/kernel/debug/tracing/trace_clock\n"
 		  "or add trace_clock=global to the kernel command line\n");
-	info->add_timestamp = 1;
+	info->add_timestamp = RB_ADD_STAMP_NORMAL;
 }
 
 static struct ring_buffer_event *
@@ -2887,8 +2906,22 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer,
 {
 	struct ring_buffer_event *event;
 	struct buffer_page *tail_page;
-	unsigned long tail, write;
+	unsigned long tail, write, w, next;
+	u64 delta, before, after;
+
+	/* Don't let the compiler play games with cpu_buffer->tail_page */
+	tail_page = info->tail_page = READ_ONCE(cpu_buffer->tail_page);
 
+ /*A*/	w = local_read(&tail_page->write) & RB_WRITE_MASK;
+	barrier();
+	before = READ_ONCE(cpu_buffer->before_stamp);
+	after = local64_read(&cpu_buffer->write_stamp);
+	/*
+	 * If preempting an event time update, we may need absolute timestamp.
+	 * Don't bother if this is the start of a new page (w == 0).
+	 */
+	if (unlikely(before != after && w))
+		info->add_timestamp = RB_ADD_STAMP_FORCE;
 	/*
 	 * If the time delta since the last event is too big to
 	 * hold in the time field of the event, then we append a
@@ -2897,25 +2930,101 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer,
 	if (unlikely(info->add_timestamp))
 		info->length += RB_LEN_TIME_EXTEND;
 
-	/* Don't let the compiler play games with cpu_buffer->tail_page */
-	tail_page = info->tail_page = READ_ONCE(cpu_buffer->tail_page);
-	write = local_add_return(info->length, &tail_page->write);
+	next = READ_ONCE(cpu_buffer->next_write);
+	WRITE_ONCE(cpu_buffer->next_write, w + info->length);
+
+	info->ts = rb_time_stamp(cpu_buffer->buffer);
+ /*B*/	WRITE_ONCE(cpu_buffer->before_stamp, info->ts);
+
+ /*C*/	write = local_add_return(info->length, &tail_page->write);
 
 	/* set write to only the index of the write */
 	write &= RB_WRITE_MASK;
+
 	tail = write - info->length;
 
+	/* See if we shot pass the end of this buffer page */
+	if (unlikely(write > BUF_PAGE_SIZE)) {
+		if (tail != w) {
+			/* before and after may now different, fix it up*/
+			before = READ_ONCE(cpu_buffer->before_stamp);
+			after = local64_read(&cpu_buffer->write_stamp);
+			if (before != after)
+				(void)cmpxchg(&cpu_buffer->before_stamp, before, after);
+		}
+		return rb_move_tail(cpu_buffer, tail, info);
+	}
+
+	if (likely(tail == w)) {
+		u64 save_before;
+
+		/* Nothing preempted us between A and C */
+ /*D*/		local64_set(&cpu_buffer->write_stamp, info->ts);
+		barrier();
+ /*E*/		save_before = READ_ONCE(cpu_buffer->before_stamp);
+		if (likely(info->add_timestamp != RB_ADD_STAMP_FORCE)) {
+			/* This did not preempt any time update */
+			info->delta = info->ts - after;
+		} else {
+			/* SLOW PATH */
+			if (w == next) {
+				/* before is the time stamp of the last event */
+				info->delta = info->ts - before;
+				info->add_timestamp = RB_ADD_STAMP_NORMAL;
+			} else {
+				/* Last event time stamp is lost, inject absolute. */
+				info->delta = info->ts;
+			}
+		}
+		barrier();
+		if (unlikely(info->ts != save_before)) {
+			/* SLOW PATH - Preempted between C and E */
+
+			after = local64_read(&cpu_buffer->write_stamp);
+			/* Write stamp must only go forward */
+			if (save_before > after) {
+				/*
+				 * We do not care about the result, only that
+				 * it gets updated atomically.
+				 */
+				(void)local64_cmpxchg(&cpu_buffer->write_stamp, after, save_before);
+			}
+		}
+	} else {
+		u64 ts;
+		/* SLOW PATH - Preempted between A and C */
+		after = local64_read(&cpu_buffer->write_stamp);
+		ts = rb_time_stamp(cpu_buffer->buffer);
+		barrier();
+ /*E*/		if (write == (local_read(&tail_page->write) & RB_WRITE_MASK) &&
+		    after < ts) {
+			/* Nothing came after this event between C and E */
+			info->delta = ts - after;
+			(void)local64_cmpxchg(&cpu_buffer->write_stamp, after, info->ts);
+			info->ts = ts;
+		} else {
+			/*
+			 * Preempted beween C and E:
+			 * Lost the previous events time stamp. Just set the
+			 * delta to zero, and this will be the same time as
+			 * the veent this event preempted. And the events that
+			 * came after this will still be correct (as they would
+			 * have built their delta on the previous event.
+			 */
+			info->delta = 0;
+		}
+		if (info->add_timestamp == RB_ADD_STAMP_FORCE)
+			info->add_timestamp = RB_ADD_STAMP_NORMAL;
+	}
+
 	/*
 	 * If this is the first commit on the page, then it has the same
 	 * timestamp as the page itself.
 	 */
-	if (!tail && !ring_buffer_time_stamp_abs(cpu_buffer->buffer))
+	if (unlikely(!tail && info->add_timestamp != RB_ADD_STAMP_FORCE &&
+		     !ring_buffer_time_stamp_abs(cpu_buffer->buffer)))
 		info->delta = 0;
 
-	/* See if we shot pass the end of this buffer page */
-	if (unlikely(write > BUF_PAGE_SIZE))
-		return rb_move_tail(cpu_buffer, tail, info);
-
 	/* We reserved something on the buffer */
 
 	event = __rb_page_index(tail_page, tail);
@@ -2933,6 +3042,9 @@ __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer,
 	/* account for these added bytes */
 	local_add(info->length, &cpu_buffer->entries_bytes);
 
+	/* This will be used to update write stamp */
+	info->delta = delta;
+
 	return event;
 }
 
@@ -2944,9 +3056,10 @@ rb_reserve_next_event(struct trace_buffer *buffer,
 	struct ring_buffer_event *event;
 	struct rb_event_info info;
 	int nr_loops = 0;
-	u64 diff;
+	u64 write_stamp;
 
 	rb_start_commit(cpu_buffer);
+	/* The commit page can not change after this */
 
 #ifdef CONFIG_RING_BUFFER_ALLOW_SWAP
 	/*
@@ -2965,7 +3078,7 @@ rb_reserve_next_event(struct trace_buffer *buffer,
 
 	info.length = rb_calculate_event_length(length);
  again:
-	info.add_timestamp = 0;
+	info.add_timestamp = RB_ADD_STAMP_NONE;
 	info.delta = 0;
 
 	/*
@@ -2980,18 +3093,14 @@ rb_reserve_next_event(struct trace_buffer *buffer,
 	if (RB_WARN_ON(cpu_buffer, ++nr_loops > 1000))
 		goto out_fail;
 
+	write_stamp = local64_read(&cpu_buffer->write_stamp);
 	info.ts = rb_time_stamp(cpu_buffer->buffer);
-	diff = info.ts - cpu_buffer->write_stamp;
-
-	/* make sure this diff is calculated here */
-	barrier();
 
 	if (ring_buffer_time_stamp_abs(buffer)) {
 		info.delta = info.ts;
 		rb_handle_timestamp(cpu_buffer, &info);
-	} else /* Did the write stamp get updated already? */
-		if (likely(info.ts >= cpu_buffer->write_stamp)) {
-		info.delta = diff;
+	} else {
+		info.delta = info.ts - write_stamp ;
 		if (unlikely(test_time_stamp(info.delta)))
 			rb_handle_timestamp(cpu_buffer, &info);
 	}
@@ -3004,11 +3113,8 @@ rb_reserve_next_event(struct trace_buffer *buffer,
 		goto again;
 	}
 
-	if (!event)
-		goto out_fail;
-
-	return event;
-
+	if (likely(event))
+		return event;
  out_fail:
 	rb_end_commit(cpu_buffer);
 	return NULL;
@@ -3154,11 +3260,6 @@ void ring_buffer_discard_commit(struct trace_buffer *buffer,
 	if (rb_try_to_discard(cpu_buffer, event))
 		goto out;
 
-	/*
-	 * The commit is still visible by the reader, so we
-	 * must still update the timestamp.
-	 */
-	rb_update_write_stamp(cpu_buffer, event);
  out:
 	rb_end_commit(cpu_buffer);
 
@@ -4475,8 +4576,9 @@ rb_reset_cpu(struct ring_buffer_per_cpu *cpu_buffer)
 	cpu_buffer->read = 0;
 	cpu_buffer->read_bytes = 0;
 
-	cpu_buffer->write_stamp = 0;
-	cpu_buffer->read_stamp = 0;
+	local64_set(&cpu_buffer->write_stamp, 0);
+	cpu_buffer->before_stamp = 0;
+	cpu_buffer->next_write = 0;
 
 	cpu_buffer->lost_events = 0;
 	cpu_buffer->last_overrun = 0;
-- 
2.25.4


^ permalink raw reply related	[flat|nested] 31+ messages in thread
* Re: [RFC][PATCH] ring-buffer: Have nested events still record running time stamp
@ 2020-06-25 17:10 kernel test robot
  0 siblings, 0 replies; 31+ messages in thread
From: kernel test robot @ 2020-06-25 17:10 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 16898 bytes --]

CC: kbuild-all(a)lists.01.org
In-Reply-To: <20200625094454.732790f7@oasis.local.home>
References: <20200625094454.732790f7@oasis.local.home>
TO: Steven Rostedt <rostedt@goodmis.org>

Hi Steven,

[FYI, it's a private test report for your RFC patch.]
[auto build test WARNING on tip/perf/core]
[also build test WARNING on linux/master linus/master v5.8-rc2 next-20200625]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use  as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Steven-Rostedt/ring-buffer-Have-nested-events-still-record-running-time-stamp/20200625-214744
base:   https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git bb42b3d39781d7fcd3be7f9f9bf11b6661b5fdf1
:::::: branch date: 3 hours ago
:::::: commit date: 3 hours ago
config: arm-randconfig-s032-20200624 (attached as .config)
compiler: arm-linux-gnueabi-gcc (GCC) 9.3.0
reproduce:
        # apt-get install sparse
        # sparse version: v0.6.2-dirty
        # save the attached .config to linux build tree
        make W=1 C=1 ARCH=arm CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__'

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>


sparse warnings: (new ones prefixed by >>)

>> kernel/trace/ring_buffer.c:485:41: sparse: sparse: expected ; at end of declaration
   kernel/trace/ring_buffer.c:485:41: sparse: sparse: Expected } at end of struct-union-enum-specifier
   kernel/trace/ring_buffer.c:485:41: sparse: sparse: got write_stamp
   kernel/trace/ring_buffer.c:495:1: sparse: sparse: Expected ; at the end of type declaration
   kernel/trace/ring_buffer.c:495:1: sparse: sparse: got }
   kernel/trace/ring_buffer.c:1715:50: sparse: sparse: no member 'update_pages_work' in struct ring_buffer_per_cpu
>> kernel/trace/ring_buffer.c:1715:50: sparse: sparse: unknown member
>> kernel/trace/ring_buffer.c:1715:50: sparse: sparse: cast from unknown type
   kernel/trace/ring_buffer.c:1718:29: sparse: sparse: no member 'update_done' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:611:35: sparse: sparse: no member 'irq_work' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:715:35: sparse: sparse: no member 'irq_work' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1318:9: sparse: sparse: no member 'update_pages_work' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1318:9: sparse: sparse: no member 'update_pages_work' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1318:9: sparse: sparse: no member 'update_pages_work' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1318:9: sparse: sparse: no member 'update_pages_work' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1318:9: sparse: sparse: no member 'update_pages_work' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1319:9: sparse: sparse: no member 'update_done' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1320:34: sparse: sparse: no member 'irq_work' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1321:9: sparse: sparse: no member 'irq_work' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1322:9: sparse: sparse: no member 'irq_work' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1339:35: sparse: sparse: no member 'new_pages' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:4559:35: sparse: sparse: no member 'new_pages' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:4579:9: sparse: sparse: undefined identifier 'local64_set'
   kernel/trace/ring_buffer.c:4580:19: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1625:46: sparse: sparse: no member 'new_pages' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1690:17: sparse: sparse: no member 'new_pages' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1690:17: sparse: sparse: no member 'new_pages' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1690:17: sparse: sparse: cast from unknown type
   kernel/trace/ring_buffer.c:1690:17: sparse: sparse: no member 'new_pages' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1690:17: sparse: sparse: no member 'new_pages' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1703:23: sparse: sparse: no member 'nr_pages_to_update' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1707:52: sparse: sparse: no member 'nr_pages_to_update' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1710:51: sparse: sparse: no member 'nr_pages_to_update' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1779:35: sparse: sparse: no member 'nr_pages_to_update' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1784:39: sparse: sparse: no member 'nr_pages_to_update' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1790:51: sparse: sparse: no member 'new_pages' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1791:59: sparse: sparse: no member 'nr_pages_to_update' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1807:40: sparse: sparse: no member 'nr_pages_to_update' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1813:43: sparse: sparse: no member 'nr_pages_to_update' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1816:60: sparse: sparse: no member 'update_pages_work' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1823:40: sparse: sparse: no member 'nr_pages_to_update' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1827:64: sparse: sparse: no member 'update_done' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1828:35: sparse: sparse: no member 'nr_pages_to_update' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1852:27: sparse: sparse: no member 'nr_pages_to_update' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1855:43: sparse: sparse: no member 'new_pages' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1856:31: sparse: sparse: no member 'nr_pages_to_update' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1870:53: sparse: sparse: no member 'update_pages_work' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1871:56: sparse: sparse: no member 'update_done' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1874:27: sparse: sparse: no member 'nr_pages_to_update' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1910:27: sparse: sparse: no member 'nr_pages_to_update' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1912:43: sparse: sparse: no member 'new_pages' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1915:17: sparse: sparse: no member 'new_pages' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1915:17: sparse: sparse: no member 'new_pages' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1915:17: sparse: sparse: cast from unknown type
   kernel/trace/ring_buffer.c:1915:17: sparse: sparse: no member 'new_pages' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:1915:17: sparse: sparse: no member 'new_pages' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2890:9: sparse: sparse: undefined identifier 'local64_read'
   kernel/trace/ring_buffer.c:2890:9: sparse: sparse: cast from unknown type
   kernel/trace/ring_buffer.c:2917:18: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2917:18: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2917:18: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2917:18: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2917:18: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2917:18: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2917:18: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2917:18: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2917:18: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2917:18: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2917:18: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2917:18: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2917:18: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2917:18: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2917:18: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2917:18: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2917:18: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2917:18: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2917:18: sparse: sparse: cast from unknown type
>> kernel/trace/ring_buffer.c:2917:18: sparse: sparse: cannot dereference this type
   kernel/trace/ring_buffer.c:2917:18: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2918:17: sparse: sparse: undefined identifier 'local64_read'
   kernel/trace/ring_buffer.c:2937:9: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2937:9: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2937:9: sparse: sparse: cast from unknown type
   kernel/trace/ring_buffer.c:2937:9: sparse: sparse: cannot dereference this type
   kernel/trace/ring_buffer.c:2950:34: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2950:34: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2950:34: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2950:34: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2950:34: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2950:34: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2950:34: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2950:34: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2950:34: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2950:34: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2950:34: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2950:34: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2950:34: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2950:34: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2950:34: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2950:34: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
   kernel/trace/ring_buffer.c:2950:34: sparse: sparse: no member 'before_stamp' in struct ring_buffer_per_cpu
>> kernel/trace/ring_buffer.c:2950:34: sparse: sparse: too many errors

# https://github.com/0day-ci/linux/commit/9a8ccc67a4f2747143e5fadf7404172d9608cdb8
git remote add linux-review https://github.com/0day-ci/linux
git remote update linux-review
git checkout 9a8ccc67a4f2747143e5fadf7404172d9608cdb8
vim +485 kernel/trace/ring_buffer.c

a497adb45b8691f Steven Rostedt (Red Hat  2015-05-29  448) 
7a8e76a3829f106 Steven Rostedt           2008-09-29  449  /*
7a8e76a3829f106 Steven Rostedt           2008-09-29  450   * head_page == tail_page && head == tail then buffer is empty.
7a8e76a3829f106 Steven Rostedt           2008-09-29  451   */
7a8e76a3829f106 Steven Rostedt           2008-09-29  452  struct ring_buffer_per_cpu {
7a8e76a3829f106 Steven Rostedt           2008-09-29  453  	int				cpu;
985023dee6e2124 Richard Kennedy          2010-03-25  454  	atomic_t			record_disabled;
07b8b10ec94f852 Steven Rostedt (VMware   2020-03-27  455) 	atomic_t			resize_disabled;
13292494379f92f Steven Rostedt (VMware   2019-12-13  456) 	struct trace_buffer	*buffer;
5389f6fad27019f Thomas Gleixner          2009-07-25  457  	raw_spinlock_t			reader_lock;	/* serialize readers */
445c89514be242b Thomas Gleixner          2009-12-02  458  	arch_spinlock_t			lock;
7a8e76a3829f106 Steven Rostedt           2008-09-29  459  	struct lock_class_key		lock_key;
73a757e63114dfd Steven Rostedt (VMware   2017-05-01  460) 	struct buffer_data_page		*free_page;
9b94a8fba501f38 Steven Rostedt (Red Hat  2016-05-12  461) 	unsigned long			nr_pages;
58a09ec6e3ec88c Steven Rostedt (Red Hat  2015-05-27  462) 	unsigned int			current_context;
3adc54fa82a68be Steven Rostedt           2009-03-30  463  	struct list_head		*pages;
6f807acd2773419 Steven Rostedt           2008-10-04  464  	struct buffer_page		*head_page;	/* read from head */
6f807acd2773419 Steven Rostedt           2008-10-04  465  	struct buffer_page		*tail_page;	/* write to tail */
c3706f005c3aaf5 Wenji Huang              2009-02-10  466  	struct buffer_page		*commit_page;	/* committed pages */
d769041f8653300 Steven Rostedt           2008-10-01  467  	struct buffer_page		*reader_page;
66a8cb95ed04025 Steven Rostedt           2010-03-31  468  	unsigned long			lost_events;
66a8cb95ed04025 Steven Rostedt           2010-03-31  469  	unsigned long			last_overrun;
8e012066fe0de5f Steven Rostedt (VMware   2018-02-07  470) 	unsigned long			nest;
c64e148a3be3cb7 Vaibhav Nagarnaik        2011-08-16  471  	local_t				entries_bytes;
e4906eff9e6fbd2 Steven Rostedt           2009-04-30  472  	local_t				entries;
884bfe89a462fcc Slava Pestov             2011-07-15  473  	local_t				overrun;
884bfe89a462fcc Slava Pestov             2011-07-15  474  	local_t				commit_overrun;
884bfe89a462fcc Slava Pestov             2011-07-15  475  	local_t				dropped_events;
fa7439531dee582 Steven Rostedt           2009-06-16  476  	local_t				committing;
fa7439531dee582 Steven Rostedt           2009-06-16  477  	local_t				commits;
2c2b0a78b373908 Steven Rostedt (VMware   2018-11-29  478) 	local_t				pages_touched;
2c2b0a78b373908 Steven Rostedt (VMware   2018-11-29  479) 	local_t				pages_read;
03329f993978104 Steven Rostedt (VMware   2018-11-29  480) 	long				last_pages_touch;
2c2b0a78b373908 Steven Rostedt (VMware   2018-11-29  481) 	size_t				shortest_full;
77ae365eca89506 Steven Rostedt           2009-03-27  482  	unsigned long			read;
c64e148a3be3cb7 Vaibhav Nagarnaik        2011-08-16  483  	unsigned long			read_bytes;
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  484) 	unsigned long			next_write;
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25 @485) 	local64_t			write_stamp;
7a8e76a3829f106 Steven Rostedt           2008-09-29  486  	u64				read_stamp;
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  487) 	u64				before_stamp;
438ced1720b5840 Vaibhav Nagarnaik        2012-02-02  488  	/* ring buffer pages to update, > 0 to add, < 0 to remove */
9b94a8fba501f38 Steven Rostedt (Red Hat  2016-05-12  489) 	long				nr_pages_to_update;
438ced1720b5840 Vaibhav Nagarnaik        2012-02-02  490  	struct list_head		new_pages; /* new pages to add */
83f40318dab00e3 Vaibhav Nagarnaik        2012-05-03  491  	struct work_struct		update_pages_work;
05fdd70d2fe1e34 Vaibhav Nagarnaik        2012-05-18  492  	struct completion		update_done;
15693458c4bc069 Steven Rostedt (Red Hat  2013-02-28  493) 
15693458c4bc069 Steven Rostedt (Red Hat  2013-02-28  494) 	struct rb_irq_work		irq_work;
7a8e76a3829f106 Steven Rostedt           2008-09-29  495  };
7a8e76a3829f106 Steven Rostedt           2008-09-29  496  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 23304 bytes --]

^ permalink raw reply	[flat|nested] 31+ messages in thread
* Re: [RFC][PATCH] ring-buffer: Have nested events still record running time stamp
@ 2020-06-25 20:43 kernel test robot
  0 siblings, 0 replies; 31+ messages in thread
From: kernel test robot @ 2020-06-25 20:43 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 15113 bytes --]

CC: kbuild-all(a)lists.01.org
In-Reply-To: <20200625094454.732790f7@oasis.local.home>
References: <20200625094454.732790f7@oasis.local.home>
TO: Steven Rostedt <rostedt@goodmis.org>

Hi Steven,

[FYI, it's a private test report for your RFC patch.]
[auto build test WARNING on tip/perf/core]
[also build test WARNING on linux/master linus/master v5.8-rc2 next-20200625]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use  as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Steven-Rostedt/ring-buffer-Have-nested-events-still-record-running-time-stamp/20200625-214744
base:   https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git bb42b3d39781d7fcd3be7f9f9bf11b6661b5fdf1
:::::: branch date: 7 hours ago
:::::: commit date: 7 hours ago
config: x86_64-randconfig-m001-20200624 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-13) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>

smatch warnings:
kernel/trace/ring_buffer.c:3046 __rb_reserve_next() error: uninitialized symbol 'delta'.

# https://github.com/0day-ci/linux/commit/9a8ccc67a4f2747143e5fadf7404172d9608cdb8
git remote add linux-review https://github.com/0day-ci/linux
git remote update linux-review
git checkout 9a8ccc67a4f2747143e5fadf7404172d9608cdb8
vim +/delta +3046 kernel/trace/ring_buffer.c

9826b2733a43991 Steven Rostedt (Red Hat  2015-05-28  2902) 
6634ff26cce2da0 Steven Rostedt           2009-05-06  2903  static struct ring_buffer_event *
6634ff26cce2da0 Steven Rostedt           2009-05-06  2904  __rb_reserve_next(struct ring_buffer_per_cpu *cpu_buffer,
fcc742eaad7cbcb Steven Rostedt (Red Hat  2015-05-28  2905) 		  struct rb_event_info *info)
6634ff26cce2da0 Steven Rostedt           2009-05-06  2906  {
6634ff26cce2da0 Steven Rostedt           2009-05-06  2907  	struct ring_buffer_event *event;
fcc742eaad7cbcb Steven Rostedt (Red Hat  2015-05-28  2908) 	struct buffer_page *tail_page;
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2909) 	unsigned long tail, write, w, next;
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2910) 	u64 delta, before, after;
b7dc42fd79390c0 Steven Rostedt (Red Hat  2015-09-03  2911) 
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2912) 	/* Don't let the compiler play games with cpu_buffer->tail_page */
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2913) 	tail_page = info->tail_page = READ_ONCE(cpu_buffer->tail_page);
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2914) 
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2915)  /*A*/	w = local_read(&tail_page->write) & RB_WRITE_MASK;
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2916) 	barrier();
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2917) 	before = READ_ONCE(cpu_buffer->before_stamp);
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2918) 	after = local64_read(&cpu_buffer->write_stamp);
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2919) 	/*
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2920) 	 * If preempting an event time update, we may need absolute timestamp.
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2921) 	 * Don't bother if this is the start of a new page (w == 0).
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2922) 	 */
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2923) 	if (unlikely(before != after && w))
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2924) 		info->add_timestamp = RB_ADD_STAMP_FORCE;
b7dc42fd79390c0 Steven Rostedt (Red Hat  2015-09-03  2925) 	/*
b7dc42fd79390c0 Steven Rostedt (Red Hat  2015-09-03  2926) 	 * If the time delta since the last event is too big to
b7dc42fd79390c0 Steven Rostedt (Red Hat  2015-09-03  2927) 	 * hold in the time field of the event, then we append a
b7dc42fd79390c0 Steven Rostedt (Red Hat  2015-09-03  2928) 	 * TIME EXTEND event ahead of the data event.
b7dc42fd79390c0 Steven Rostedt (Red Hat  2015-09-03  2929) 	 */
b7dc42fd79390c0 Steven Rostedt (Red Hat  2015-09-03  2930) 	if (unlikely(info->add_timestamp))
b7dc42fd79390c0 Steven Rostedt (Red Hat  2015-09-03  2931) 		info->length += RB_LEN_TIME_EXTEND;
69d1b839f7eee34 Steven Rostedt           2010-10-07  2932  
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2933) 	next = READ_ONCE(cpu_buffer->next_write);
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2934) 	WRITE_ONCE(cpu_buffer->next_write, w + info->length);
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2935) 
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2936) 	info->ts = rb_time_stamp(cpu_buffer->buffer);
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2937)  /*B*/	WRITE_ONCE(cpu_buffer->before_stamp, info->ts);
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2938) 
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2939)  /*C*/	write = local_add_return(info->length, &tail_page->write);
77ae365eca89506 Steven Rostedt           2009-03-27  2940  
77ae365eca89506 Steven Rostedt           2009-03-27  2941  	/* set write to only the index of the write */
77ae365eca89506 Steven Rostedt           2009-03-27  2942  	write &= RB_WRITE_MASK;
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2943) 
fcc742eaad7cbcb Steven Rostedt (Red Hat  2015-05-28  2944) 	tail = write - info->length;
6634ff26cce2da0 Steven Rostedt           2009-05-06  2945  
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2946) 	/* See if we shot pass the end of this buffer page */
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2947) 	if (unlikely(write > BUF_PAGE_SIZE)) {
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2948) 		if (tail != w) {
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2949) 			/* before and after may now different, fix it up*/
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2950) 			before = READ_ONCE(cpu_buffer->before_stamp);
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2951) 			after = local64_read(&cpu_buffer->write_stamp);
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2952) 			if (before != after)
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2953) 				(void)cmpxchg(&cpu_buffer->before_stamp, before, after);
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2954) 		}
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2955) 		return rb_move_tail(cpu_buffer, tail, info);
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2956) 	}
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2957) 
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2958) 	if (likely(tail == w)) {
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2959) 		u64 save_before;
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2960) 
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2961) 		/* Nothing preempted us between A and C */
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2962)  /*D*/		local64_set(&cpu_buffer->write_stamp, info->ts);
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2963) 		barrier();
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2964)  /*E*/		save_before = READ_ONCE(cpu_buffer->before_stamp);
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2965) 		if (likely(info->add_timestamp != RB_ADD_STAMP_FORCE)) {
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2966) 			/* This did not preempt any time update */
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2967) 			info->delta = info->ts - after;
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2968) 		} else {
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2969) 			/* SLOW PATH */
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2970) 			if (w == next) {
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2971) 				/* before is the time stamp of the last event */
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2972) 				info->delta = info->ts - before;
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2973) 				info->add_timestamp = RB_ADD_STAMP_NORMAL;
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2974) 			} else {
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2975) 				/* Last event time stamp is lost, inject absolute. */
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2976) 				info->delta = info->ts;
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2977) 			}
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2978) 		}
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2979) 		barrier();
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2980) 		if (unlikely(info->ts != save_before)) {
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2981) 			/* SLOW PATH - Preempted between C and E */
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2982) 
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2983) 			after = local64_read(&cpu_buffer->write_stamp);
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2984) 			/* Write stamp must only go forward */
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2985) 			if (save_before > after) {
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2986) 				/*
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2987) 				 * We do not care about the result, only that
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2988) 				 * it gets updated atomically.
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2989) 				 */
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2990) 				(void)local64_cmpxchg(&cpu_buffer->write_stamp, after, save_before);
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2991) 			}
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2992) 		}
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2993) 	} else {
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2994) 		u64 ts;
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2995) 		/* SLOW PATH - Preempted between A and C */
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2996) 		after = local64_read(&cpu_buffer->write_stamp);
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2997) 		ts = rb_time_stamp(cpu_buffer->buffer);
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2998) 		barrier();
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  2999)  /*E*/		if (write == (local_read(&tail_page->write) & RB_WRITE_MASK) &&
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  3000) 		    after < ts) {
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  3001) 			/* Nothing came after this event between C and E */
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  3002) 			info->delta = ts - after;
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  3003) 			(void)local64_cmpxchg(&cpu_buffer->write_stamp, after, info->ts);
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  3004) 			info->ts = ts;
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  3005) 		} else {
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  3006) 			/*
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  3007) 			 * Preempted beween C and E:
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  3008) 			 * Lost the previous events time stamp. Just set the
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  3009) 			 * delta to zero, and this will be the same time as
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  3010) 			 * the veent this event preempted. And the events that
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  3011) 			 * came after this will still be correct (as they would
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  3012) 			 * have built their delta on the previous event.
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  3013) 			 */
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  3014) 			info->delta = 0;
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  3015) 		}
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  3016) 		if (info->add_timestamp == RB_ADD_STAMP_FORCE)
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  3017) 			info->add_timestamp = RB_ADD_STAMP_NORMAL;
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  3018) 	}
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  3019) 
b7dc42fd79390c0 Steven Rostedt (Red Hat  2015-09-03  3020) 	/*
b7dc42fd79390c0 Steven Rostedt (Red Hat  2015-09-03  3021) 	 * If this is the first commit on the page, then it has the same
b7dc42fd79390c0 Steven Rostedt (Red Hat  2015-09-03  3022) 	 * timestamp as the page itself.
b7dc42fd79390c0 Steven Rostedt (Red Hat  2015-09-03  3023) 	 */
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  3024) 	if (unlikely(!tail && info->add_timestamp != RB_ADD_STAMP_FORCE &&
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  3025) 		     !ring_buffer_time_stamp_abs(cpu_buffer->buffer)))
b7dc42fd79390c0 Steven Rostedt (Red Hat  2015-09-03  3026) 		info->delta = 0;
b7dc42fd79390c0 Steven Rostedt (Red Hat  2015-09-03  3027) 
6634ff26cce2da0 Steven Rostedt           2009-05-06  3028  	/* We reserved something on the buffer */
6634ff26cce2da0 Steven Rostedt           2009-05-06  3029  
b7dc42fd79390c0 Steven Rostedt (Red Hat  2015-09-03  3030) 	event = __rb_page_index(tail_page, tail);
b7dc42fd79390c0 Steven Rostedt (Red Hat  2015-09-03  3031) 	rb_update_event(cpu_buffer, event, info);
a4543a2fa9ef31d Steven Rostedt (Red Hat  2015-05-29  3032) 
b7dc42fd79390c0 Steven Rostedt (Red Hat  2015-09-03  3033) 	local_inc(&tail_page->entries);
6634ff26cce2da0 Steven Rostedt           2009-05-06  3034  
6634ff26cce2da0 Steven Rostedt           2009-05-06  3035  	/*
b7dc42fd79390c0 Steven Rostedt (Red Hat  2015-09-03  3036) 	 * If this is the first commit on the page, then update
b7dc42fd79390c0 Steven Rostedt (Red Hat  2015-09-03  3037) 	 * its timestamp.
6634ff26cce2da0 Steven Rostedt           2009-05-06  3038  	 */
b7dc42fd79390c0 Steven Rostedt (Red Hat  2015-09-03  3039) 	if (!tail)
fcc742eaad7cbcb Steven Rostedt (Red Hat  2015-05-28  3040) 		tail_page->page->time_stamp = info->ts;
6634ff26cce2da0 Steven Rostedt           2009-05-06  3041  
c64e148a3be3cb7 Vaibhav Nagarnaik        2011-08-16  3042  	/* account for these added bytes */
fcc742eaad7cbcb Steven Rostedt (Red Hat  2015-05-28  3043) 	local_add(info->length, &cpu_buffer->entries_bytes);
c64e148a3be3cb7 Vaibhav Nagarnaik        2011-08-16  3044  
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  3045) 	/* This will be used to update write stamp */
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25 @3046) 	info->delta = delta;
9a8ccc67a4f2747 Steven Rostedt (VMware   2020-06-25  3047) 
6634ff26cce2da0 Steven Rostedt           2009-05-06  3048  	return event;
6634ff26cce2da0 Steven Rostedt           2009-05-06  3049  }
6634ff26cce2da0 Steven Rostedt           2009-05-06  3050  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 33424 bytes --]

^ permalink raw reply	[flat|nested] 31+ messages in thread

end of thread, other threads:[~2020-06-30  3:26 UTC | newest]

Thread overview: 31+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-06-25 13:44 [RFC][PATCH] ring-buffer: Have nested events still record running time stamp Steven Rostedt
2020-06-25 13:53 ` Mathieu Desnoyers
2020-06-25 14:37   ` Steven Rostedt
2020-06-25 16:42     ` Korben Rusek
2020-06-25 18:12       ` Steven Rostedt
2020-06-25 17:55 ` Mathieu Desnoyers
2020-06-25 18:35   ` Steven Rostedt
2020-06-25 19:35     ` Mathieu Desnoyers
2020-06-25 19:58       ` Steven Rostedt
2020-06-26  2:36       ` Steven Rostedt
2020-06-26  3:35         ` Steven Rostedt
2020-06-26 13:58           ` Steven Rostedt
2020-06-26 18:13             ` Mathieu Desnoyers
2020-06-26 18:58               ` Steven Rostedt
2020-06-26 19:39                 ` Steven Rostedt
2020-06-30  0:21       ` Steven Rostedt
2020-06-30  3:13         ` Mathieu Desnoyers
2020-06-30  3:26           ` Steven Rostedt
2020-06-25 19:04   ` Steven Rostedt
2020-06-25 19:58     ` Mathieu Desnoyers
2020-06-25 20:42       ` Steven Rostedt
2020-06-25 19:09   ` Steven Rostedt
2020-06-25 20:03     ` Mathieu Desnoyers
2020-06-25 18:02 ` kernel test robot
2020-06-25 18:09 ` Steven Rostedt
2020-06-25 18:56 ` kernel test robot
2020-06-26  8:44 ` Dan Carpenter
2020-06-26  8:44   ` Dan Carpenter
2020-06-28  8:59 ` kernel test robot
  -- strict thread matches above, loose matches on Subject: below --
2020-06-25 17:10 kernel test robot
2020-06-25 20:43 kernel test robot

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.