Loading kernel/trace/trace.c +55 −41 Original line number Diff line number Diff line Loading @@ -2546,6 +2546,40 @@ static struct pipe_buf_operations tracing_pipe_buf_ops = { .get = generic_pipe_buf_get, }; static size_t tracing_fill_pipe_page(struct page *pages, size_t rem, struct trace_iterator *iter) { size_t count; int ret; /* Seq buffer is page-sized, exactly what we need. */ for (;;) { count = iter->seq.len; ret = print_trace_line(iter); count = iter->seq.len - count; if (rem < count) { rem = 0; iter->seq.len -= count; break; } if (ret == TRACE_TYPE_PARTIAL_LINE) { iter->seq.len -= count; break; } trace_consume(iter); rem -= count; if (!find_next_entry_inc(iter)) { rem = 0; iter->ent = NULL; break; } } return rem; } static ssize_t tracing_splice_read_pipe(struct file *filp, loff_t *ppos, struct pipe_inode_info *pipe, Loading @@ -2564,7 +2598,7 @@ static ssize_t tracing_splice_read_pipe(struct file *filp, .spd_release = tracing_spd_release_pipe, }; ssize_t ret; size_t count, rem; size_t rem; unsigned int i; mutex_lock(&trace_types_lock); Loading @@ -2573,45 +2607,25 @@ static ssize_t tracing_splice_read_pipe(struct file *filp, ret = iter->trace->splice_read(iter, filp, ppos, pipe, len, flags); if (ret) goto out; goto out_err; } ret = tracing_wait_pipe(filp); if (ret <= 0) goto out; goto out_err; if (!iter->ent && !find_next_entry_inc(iter)) { ret = -EFAULT; goto out; goto out_err; } /* Fill as many pages as possible. */ for (i = 0, rem = len; i < PIPE_BUFFERS && rem; i++) { pages[i] = alloc_page(GFP_KERNEL); /* Seq buffer is page-sized, exactly what we need. */ for (;;) { count = iter->seq.len; ret = print_trace_line(iter); count = iter->seq.len - count; if (rem < count) { rem = 0; iter->seq.len -= count; if (!pages[i]) break; } if (ret == TRACE_TYPE_PARTIAL_LINE) { iter->seq.len -= count; break; } trace_consume(iter); rem -= count; if (!find_next_entry_inc(iter)) { rem = 0; iter->ent = NULL; break; } } rem = tracing_fill_pipe_page(pages[i], rem, iter); /* Copy the data into the page, so we can start over. */ ret = trace_seq_to_buffer(&iter->seq, Loading @@ -2633,7 +2647,7 @@ static ssize_t tracing_splice_read_pipe(struct file *filp, return splice_to_pipe(pipe, &spd); out: out_err: mutex_unlock(&trace_types_lock); return ret; Loading Loading
kernel/trace/trace.c +55 −41 Original line number Diff line number Diff line Loading @@ -2546,6 +2546,40 @@ static struct pipe_buf_operations tracing_pipe_buf_ops = { .get = generic_pipe_buf_get, }; static size_t tracing_fill_pipe_page(struct page *pages, size_t rem, struct trace_iterator *iter) { size_t count; int ret; /* Seq buffer is page-sized, exactly what we need. */ for (;;) { count = iter->seq.len; ret = print_trace_line(iter); count = iter->seq.len - count; if (rem < count) { rem = 0; iter->seq.len -= count; break; } if (ret == TRACE_TYPE_PARTIAL_LINE) { iter->seq.len -= count; break; } trace_consume(iter); rem -= count; if (!find_next_entry_inc(iter)) { rem = 0; iter->ent = NULL; break; } } return rem; } static ssize_t tracing_splice_read_pipe(struct file *filp, loff_t *ppos, struct pipe_inode_info *pipe, Loading @@ -2564,7 +2598,7 @@ static ssize_t tracing_splice_read_pipe(struct file *filp, .spd_release = tracing_spd_release_pipe, }; ssize_t ret; size_t count, rem; size_t rem; unsigned int i; mutex_lock(&trace_types_lock); Loading @@ -2573,45 +2607,25 @@ static ssize_t tracing_splice_read_pipe(struct file *filp, ret = iter->trace->splice_read(iter, filp, ppos, pipe, len, flags); if (ret) goto out; goto out_err; } ret = tracing_wait_pipe(filp); if (ret <= 0) goto out; goto out_err; if (!iter->ent && !find_next_entry_inc(iter)) { ret = -EFAULT; goto out; goto out_err; } /* Fill as many pages as possible. */ for (i = 0, rem = len; i < PIPE_BUFFERS && rem; i++) { pages[i] = alloc_page(GFP_KERNEL); /* Seq buffer is page-sized, exactly what we need. */ for (;;) { count = iter->seq.len; ret = print_trace_line(iter); count = iter->seq.len - count; if (rem < count) { rem = 0; iter->seq.len -= count; if (!pages[i]) break; } if (ret == TRACE_TYPE_PARTIAL_LINE) { iter->seq.len -= count; break; } trace_consume(iter); rem -= count; if (!find_next_entry_inc(iter)) { rem = 0; iter->ent = NULL; break; } } rem = tracing_fill_pipe_page(pages[i], rem, iter); /* Copy the data into the page, so we can start over. */ ret = trace_seq_to_buffer(&iter->seq, Loading @@ -2633,7 +2647,7 @@ static ssize_t tracing_splice_read_pipe(struct file *filp, return splice_to_pipe(pipe, &spd); out: out_err: mutex_unlock(&trace_types_lock); return ret; Loading