diff options
Diffstat (limited to 'kernel/trace/trace.c')
| -rw-r--r-- | kernel/trace/trace.c | 35 |
1 files changed, 32 insertions, 3 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index dc937e1baa91..484114d70743 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
| @@ -1516,6 +1516,8 @@ static void *s_next(struct seq_file *m, void *v, loff_t *pos) | |||
| 1516 | int i = (int)*pos; | 1516 | int i = (int)*pos; |
| 1517 | void *ent; | 1517 | void *ent; |
| 1518 | 1518 | ||
| 1519 | WARN_ON_ONCE(iter->leftover); | ||
| 1520 | |||
| 1519 | (*pos)++; | 1521 | (*pos)++; |
| 1520 | 1522 | ||
| 1521 | /* can't go backwards */ | 1523 | /* can't go backwards */ |
| @@ -1614,8 +1616,16 @@ static void *s_start(struct seq_file *m, loff_t *pos) | |||
| 1614 | ; | 1616 | ; |
| 1615 | 1617 | ||
| 1616 | } else { | 1618 | } else { |
| 1617 | l = *pos - 1; | 1619 | /* |
| 1618 | p = s_next(m, p, &l); | 1620 | * If we overflowed the seq_file before, then we want |
| 1621 | * to just reuse the trace_seq buffer again. | ||
| 1622 | */ | ||
| 1623 | if (iter->leftover) | ||
| 1624 | p = iter; | ||
| 1625 | else { | ||
| 1626 | l = *pos - 1; | ||
| 1627 | p = s_next(m, p, &l); | ||
| 1628 | } | ||
| 1619 | } | 1629 | } |
| 1620 | 1630 | ||
| 1621 | trace_event_read_lock(); | 1631 | trace_event_read_lock(); |
| @@ -1923,6 +1933,7 @@ static enum print_line_t print_trace_line(struct trace_iterator *iter) | |||
| 1923 | static int s_show(struct seq_file *m, void *v) | 1933 | static int s_show(struct seq_file *m, void *v) |
| 1924 | { | 1934 | { |
| 1925 | struct trace_iterator *iter = v; | 1935 | struct trace_iterator *iter = v; |
| 1936 | int ret; | ||
| 1926 | 1937 | ||
| 1927 | if (iter->ent == NULL) { | 1938 | if (iter->ent == NULL) { |
| 1928 | if (iter->tr) { | 1939 | if (iter->tr) { |
| @@ -1942,9 +1953,27 @@ static int s_show(struct seq_file *m, void *v) | |||
| 1942 | if (!(trace_flags & TRACE_ITER_VERBOSE)) | 1953 | if (!(trace_flags & TRACE_ITER_VERBOSE)) |
| 1943 | print_func_help_header(m); | 1954 | print_func_help_header(m); |
| 1944 | } | 1955 | } |
| 1956 | } else if (iter->leftover) { | ||
| 1957 | /* | ||
| 1958 | * If we filled the seq_file buffer earlier, we | ||
| 1959 | * want to just show it now. | ||
| 1960 | */ | ||
| 1961 | ret = trace_print_seq(m, &iter->seq); | ||
| 1962 | |||
| 1963 | /* ret should this time be zero, but you never know */ | ||
| 1964 | iter->leftover = ret; | ||
| 1965 | |||
| 1945 | } else { | 1966 | } else { |
| 1946 | print_trace_line(iter); | 1967 | print_trace_line(iter); |
| 1947 | trace_print_seq(m, &iter->seq); | 1968 | ret = trace_print_seq(m, &iter->seq); |
| 1969 | /* | ||
| 1970 | * If we overflow the seq_file buffer, then it will | ||
| 1971 | * ask us for this data again at start up. | ||
| 1972 | * Use that instead. | ||
| 1973 | * ret is 0 if seq_file write succeeded. | ||
| 1974 | * -1 otherwise. | ||
| 1975 | */ | ||
| 1976 | iter->leftover = ret; | ||
| 1948 | } | 1977 | } |
| 1949 | 1978 | ||
| 1950 | return 0; | 1979 | return 0; |
