|
@@ -1545,7 +1545,8 @@ static void trace_iterator_increment(struct trace_iterator *iter)
|
|
|
}
|
|
|
|
|
|
static struct trace_entry *
|
|
|
-peek_next_entry(struct trace_iterator *iter, int cpu, u64 *ts)
|
|
|
+peek_next_entry(struct trace_iterator *iter, int cpu, u64 *ts,
|
|
|
+ unsigned long *lost_events)
|
|
|
{
|
|
|
struct ring_buffer_event *event;
|
|
|
struct ring_buffer_iter *buf_iter = iter->buffer_iter[cpu];
|
|
@@ -1556,7 +1557,8 @@ peek_next_entry(struct trace_iterator *iter, int cpu, u64 *ts)
|
|
|
if (buf_iter)
|
|
|
event = ring_buffer_iter_peek(buf_iter, ts);
|
|
|
else
|
|
|
- event = ring_buffer_peek(iter->tr->buffer, cpu, ts, NULL);
|
|
|
+ event = ring_buffer_peek(iter->tr->buffer, cpu, ts,
|
|
|
+ lost_events);
|
|
|
|
|
|
ftrace_enable_cpu();
|
|
|
|
|
@@ -1564,10 +1566,12 @@ peek_next_entry(struct trace_iterator *iter, int cpu, u64 *ts)
|
|
|
}
|
|
|
|
|
|
static struct trace_entry *
|
|
|
-__find_next_entry(struct trace_iterator *iter, int *ent_cpu, u64 *ent_ts)
|
|
|
+__find_next_entry(struct trace_iterator *iter, int *ent_cpu,
|
|
|
+ unsigned long *missing_events, u64 *ent_ts)
|
|
|
{
|
|
|
struct ring_buffer *buffer = iter->tr->buffer;
|
|
|
struct trace_entry *ent, *next = NULL;
|
|
|
+ unsigned long lost_events, next_lost = 0;
|
|
|
int cpu_file = iter->cpu_file;
|
|
|
u64 next_ts = 0, ts;
|
|
|
int next_cpu = -1;
|
|
@@ -1580,7 +1584,7 @@ __find_next_entry(struct trace_iterator *iter, int *ent_cpu, u64 *ent_ts)
|
|
|
if (cpu_file > TRACE_PIPE_ALL_CPU) {
|
|
|
if (ring_buffer_empty_cpu(buffer, cpu_file))
|
|
|
return NULL;
|
|
|
- ent = peek_next_entry(iter, cpu_file, ent_ts);
|
|
|
+ ent = peek_next_entry(iter, cpu_file, ent_ts, missing_events);
|
|
|
if (ent_cpu)
|
|
|
*ent_cpu = cpu_file;
|
|
|
|
|
@@ -1592,7 +1596,7 @@ __find_next_entry(struct trace_iterator *iter, int *ent_cpu, u64 *ent_ts)
|
|
|
if (ring_buffer_empty_cpu(buffer, cpu))
|
|
|
continue;
|
|
|
|
|
|
- ent = peek_next_entry(iter, cpu, &ts);
|
|
|
+ ent = peek_next_entry(iter, cpu, &ts, &lost_events);
|
|
|
|
|
|
/*
|
|
|
* Pick the entry with the smallest timestamp:
|
|
@@ -1601,6 +1605,7 @@ __find_next_entry(struct trace_iterator *iter, int *ent_cpu, u64 *ent_ts)
|
|
|
next = ent;
|
|
|
next_cpu = cpu;
|
|
|
next_ts = ts;
|
|
|
+ next_lost = lost_events;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1610,6 +1615,9 @@ __find_next_entry(struct trace_iterator *iter, int *ent_cpu, u64 *ent_ts)
|
|
|
if (ent_ts)
|
|
|
*ent_ts = next_ts;
|
|
|
|
|
|
+ if (missing_events)
|
|
|
+ *missing_events = next_lost;
|
|
|
+
|
|
|
return next;
|
|
|
}
|
|
|
|
|
@@ -1617,13 +1625,14 @@ __find_next_entry(struct trace_iterator *iter, int *ent_cpu, u64 *ent_ts)
|
|
|
struct trace_entry *trace_find_next_entry(struct trace_iterator *iter,
|
|
|
int *ent_cpu, u64 *ent_ts)
|
|
|
{
|
|
|
- return __find_next_entry(iter, ent_cpu, ent_ts);
|
|
|
+ return __find_next_entry(iter, ent_cpu, NULL, ent_ts);
|
|
|
}
|
|
|
|
|
|
/* Find the next real entry, and increment the iterator to the next entry */
|
|
|
static void *find_next_entry_inc(struct trace_iterator *iter)
|
|
|
{
|
|
|
- iter->ent = __find_next_entry(iter, &iter->cpu, &iter->ts);
|
|
|
+ iter->ent = __find_next_entry(iter, &iter->cpu,
|
|
|
+ &iter->lost_events, &iter->ts);
|
|
|
|
|
|
if (iter->ent)
|
|
|
trace_iterator_increment(iter);
|
|
@@ -1635,7 +1644,8 @@ static void trace_consume(struct trace_iterator *iter)
|
|
|
{
|
|
|
/* Don't allow ftrace to trace into the ring buffers */
|
|
|
ftrace_disable_cpu();
|
|
|
- ring_buffer_consume(iter->tr->buffer, iter->cpu, &iter->ts, NULL);
|
|
|
+ ring_buffer_consume(iter->tr->buffer, iter->cpu, &iter->ts,
|
|
|
+ &iter->lost_events);
|
|
|
ftrace_enable_cpu();
|
|
|
}
|
|
|
|
|
@@ -2030,6 +2040,10 @@ static enum print_line_t print_trace_line(struct trace_iterator *iter)
|
|
|
{
|
|
|
enum print_line_t ret;
|
|
|
|
|
|
+ if (iter->lost_events)
|
|
|
+ trace_seq_printf(&iter->seq, "CPU:%d [LOST %lu EVENTS]\n",
|
|
|
+ iter->cpu, iter->lost_events);
|
|
|
+
|
|
|
if (iter->trace && iter->trace->print_line) {
|
|
|
ret = iter->trace->print_line(iter);
|
|
|
if (ret != TRACE_TYPE_UNHANDLED)
|