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

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'trace-v5.1-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace

Pull tracing fixes from Steven Rostedt:
"Three tracing fixes:

- Use "nosteal" for ring buffer splice pages

- Memory leak fix in error path of trace_pid_write()

- Fix preempt_enable_no_resched() (use preempt_enable()) in ring
buffer code"

* tag 'trace-v5.1-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace:
trace: Fix preempt_enable_no_resched() abuse
tracing: Fix a memory leak by early error exit in trace_pid_write()
tracing: Fix buffer_ref pipe ops

+23 -19
+2 -2
fs/splice.c
··· 330 330 .get = generic_pipe_buf_get, 331 331 }; 332 332 333 - static int generic_pipe_buf_nosteal(struct pipe_inode_info *pipe, 334 - struct pipe_buffer *buf) 333 + int generic_pipe_buf_nosteal(struct pipe_inode_info *pipe, 334 + struct pipe_buffer *buf) 335 335 { 336 336 return 1; 337 337 }
+1
include/linux/pipe_fs_i.h
··· 176 176 bool generic_pipe_buf_get(struct pipe_inode_info *, struct pipe_buffer *); 177 177 int generic_pipe_buf_confirm(struct pipe_inode_info *, struct pipe_buffer *); 178 178 int generic_pipe_buf_steal(struct pipe_inode_info *, struct pipe_buffer *); 179 + int generic_pipe_buf_nosteal(struct pipe_inode_info *, struct pipe_buffer *); 179 180 void generic_pipe_buf_release(struct pipe_inode_info *, struct pipe_buffer *); 180 181 void pipe_buf_mark_unmergeable(struct pipe_buffer *buf); 181 182
+1 -1
kernel/trace/ring_buffer.c
··· 762 762 763 763 preempt_disable_notrace(); 764 764 time = rb_time_stamp(buffer); 765 - preempt_enable_no_resched_notrace(); 765 + preempt_enable_notrace(); 766 766 767 767 return time; 768 768 }
+19 -16
kernel/trace/trace.c
··· 496 496 * not modified. 497 497 */ 498 498 pid_list = kmalloc(sizeof(*pid_list), GFP_KERNEL); 499 - if (!pid_list) 499 + if (!pid_list) { 500 + trace_parser_put(&parser); 500 501 return -ENOMEM; 502 + } 501 503 502 504 pid_list->pid_max = READ_ONCE(pid_max); 503 505 ··· 509 507 510 508 pid_list->pids = vzalloc((pid_list->pid_max + 7) >> 3); 511 509 if (!pid_list->pids) { 510 + trace_parser_put(&parser); 512 511 kfree(pid_list); 513 512 return -ENOMEM; 514 513 } ··· 7028 7025 struct ring_buffer *buffer; 7029 7026 void *page; 7030 7027 int cpu; 7031 - int ref; 7028 + refcount_t refcount; 7032 7029 }; 7030 + 7031 + static void buffer_ref_release(struct buffer_ref *ref) 7032 + { 7033 + if (!refcount_dec_and_test(&ref->refcount)) 7034 + return; 7035 + ring_buffer_free_read_page(ref->buffer, ref->cpu, ref->page); 7036 + kfree(ref); 7037 + } 7033 7038 7034 7039 static void buffer_pipe_buf_release(struct pipe_inode_info *pipe, 7035 7040 struct pipe_buffer *buf) 7036 7041 { 7037 7042 struct buffer_ref *ref = (struct buffer_ref *)buf->private; 7038 7043 7039 - if (--ref->ref) 7040 - return; 7041 - 7042 - ring_buffer_free_read_page(ref->buffer, ref->cpu, ref->page); 7043 - kfree(ref); 7044 + buffer_ref_release(ref); 7044 7045 buf->private = 0; 7045 7046 } 7046 7047 ··· 7053 7046 { 7054 7047 struct buffer_ref *ref = (struct buffer_ref *)buf->private; 7055 7048 7056 - if (ref->ref > INT_MAX/2) 7049 + if (refcount_read(&ref->refcount) > INT_MAX/2) 7057 7050 return false; 7058 7051 7059 - ref->ref++; 7052 + refcount_inc(&ref->refcount); 7060 7053 return true; 7061 7054 } 7062 7055 ··· 7064 7057 static const struct pipe_buf_operations buffer_pipe_buf_ops = { 7065 7058 .confirm = generic_pipe_buf_confirm, 7066 7059 .release = buffer_pipe_buf_release, 7067 - .steal = generic_pipe_buf_steal, 7060 + .steal = generic_pipe_buf_nosteal, 7068 7061 .get = buffer_pipe_buf_get, 7069 7062 }; 7070 7063 ··· 7077 7070 struct buffer_ref *ref = 7078 7071 (struct buffer_ref *)spd->partial[i].private; 7079 7072 7080 - if (--ref->ref) 7081 - return; 7082 - 7083 - ring_buffer_free_read_page(ref->buffer, ref->cpu, ref->page); 7084 - kfree(ref); 7073 + buffer_ref_release(ref); 7085 7074 spd->partial[i].private = 0; 7086 7075 } 7087 7076 ··· 7132 7129 break; 7133 7130 } 7134 7131 7135 - ref->ref = 1; 7132 + refcount_set(&ref->refcount, 1); 7136 7133 ref->buffer = iter->trace_buffer->buffer; 7137 7134 ref->page = ring_buffer_alloc_read_page(ref->buffer, iter->cpu_file); 7138 7135 if (IS_ERR(ref->page)) {