Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tracing: Clean up tracing_fill_pipe_page()

The function tracing_fill_pipe_page() logic is a little confusing with the
use of count saving the seq.len and reusing it.

Instead of subtracting a number that is calculated from the saved
value of the seq.len from seq.len, just save the seq.len at the start
and if we need to reset it, just assign it again.

When the seq_buf overflow is len == size + 1, the current logic will
break. Changing it to use a saved length for resetting back to the
original value is more robust and will work when we change the way
seq_buf sets the overflow.

Link: http://lkml.kernel.org/r/20141118161546.GJ23958@pathway.suse.cz

Reviewed-by: Petr Mladek <pmladek@suse.cz>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>

+19 -6
+19 -6
kernel/trace/trace.c
··· 4575 4575 tracing_fill_pipe_page(size_t rem, struct trace_iterator *iter) 4576 4576 { 4577 4577 size_t count; 4578 + int save_len; 4578 4579 int ret; 4579 4580 4580 4581 /* Seq buffer is page-sized, exactly what we need. */ 4581 4582 for (;;) { 4582 - count = iter->seq.seq.len; 4583 + save_len = iter->seq.seq.len; 4583 4584 ret = print_trace_line(iter); 4584 - count = iter->seq.seq.len - count; 4585 - if (rem < count) { 4586 - rem = 0; 4587 - iter->seq.seq.len -= count; 4585 + 4586 + if (trace_seq_has_overflowed(&iter->seq)) { 4587 + iter->seq.seq.len = save_len; 4588 4588 break; 4589 4589 } 4590 + 4591 + /* 4592 + * This should not be hit, because it should only 4593 + * be set if the iter->seq overflowed. But check it 4594 + * anyway to be safe. 4595 + */ 4590 4596 if (ret == TRACE_TYPE_PARTIAL_LINE) { 4591 - iter->seq.seq.len -= count; 4597 + iter->seq.seq.len = save_len; 4598 + break; 4599 + } 4600 + 4601 + count = iter->seq.seq.len - save_len; 4602 + if (rem < count) { 4603 + rem = 0; 4604 + iter->seq.seq.len = save_len; 4592 4605 break; 4593 4606 } 4594 4607