|
@@ -1516,6 +1516,8 @@ static void *s_next(struct seq_file *m, void *v, loff_t *pos)
|
|
|
int i = (int)*pos;
|
|
|
void *ent;
|
|
|
|
|
|
+ WARN_ON_ONCE(iter->leftover);
|
|
|
+
|
|
|
(*pos)++;
|
|
|
|
|
|
/* can't go backwards */
|
|
@@ -1614,8 +1616,16 @@ static void *s_start(struct seq_file *m, loff_t *pos)
|
|
|
;
|
|
|
|
|
|
} else {
|
|
|
- l = *pos - 1;
|
|
|
- p = s_next(m, p, &l);
|
|
|
+ /*
|
|
|
+ * If we overflowed the seq_file before, then we want
|
|
|
+ * to just reuse the trace_seq buffer again.
|
|
|
+ */
|
|
|
+ if (iter->leftover)
|
|
|
+ p = iter;
|
|
|
+ else {
|
|
|
+ l = *pos - 1;
|
|
|
+ p = s_next(m, p, &l);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
trace_event_read_lock();
|
|
@@ -1923,6 +1933,7 @@ static enum print_line_t print_trace_line(struct trace_iterator *iter)
|
|
|
static int s_show(struct seq_file *m, void *v)
|
|
|
{
|
|
|
struct trace_iterator *iter = v;
|
|
|
+ int ret;
|
|
|
|
|
|
if (iter->ent == NULL) {
|
|
|
if (iter->tr) {
|
|
@@ -1942,9 +1953,27 @@ static int s_show(struct seq_file *m, void *v)
|
|
|
if (!(trace_flags & TRACE_ITER_VERBOSE))
|
|
|
print_func_help_header(m);
|
|
|
}
|
|
|
+ } else if (iter->leftover) {
|
|
|
+ /*
|
|
|
+ * If we filled the seq_file buffer earlier, we
|
|
|
+ * want to just show it now.
|
|
|
+ */
|
|
|
+ ret = trace_print_seq(m, &iter->seq);
|
|
|
+
|
|
|
+ /* ret should this time be zero, but you never know */
|
|
|
+ iter->leftover = ret;
|
|
|
+
|
|
|
} else {
|
|
|
print_trace_line(iter);
|
|
|
- trace_print_seq(m, &iter->seq);
|
|
|
+ ret = trace_print_seq(m, &iter->seq);
|
|
|
+ /*
|
|
|
+ * If we overflow the seq_file buffer, then it will
|
|
|
+ * ask us for this data again at start up.
|
|
|
+ * Use that instead.
|
|
|
+ * ret is 0 if seq_file write succeeded.
|
|
|
+ * -1 otherwise.
|
|
|
+ */
|
|
|
+ iter->leftover = ret;
|
|
|
}
|
|
|
|
|
|
return 0;
|