diff options
| author | David S. Miller <[email protected]> | 2019-05-02 22:14:21 -0400 | 
|---|---|---|
| committer | David S. Miller <[email protected]> | 2019-05-02 22:14:21 -0400 | 
| commit | ff24e4980a68d83090a02fda081741a410fe8eef (patch) | |
| tree | 4d874dfcaf2bb8c3abc2446af9447a983402c0ae /kernel/trace/trace.c | |
| parent | 26f146ed971c0e4a264ce525d7a66a71ef73690d (diff) | |
| parent | ea9866793d1e925b4d320eaea409263b2a568f38 (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Three trivial overlapping conflicts.
Signed-off-by: David S. Miller <[email protected]>
Diffstat (limited to 'kernel/trace/trace.c')
| -rw-r--r-- | kernel/trace/trace.c | 35 | 
1 files changed, 19 insertions, 16 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 6c24755655c7..ca1ee656d6d8 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -496,8 +496,10 @@ int trace_pid_write(struct trace_pid_list *filtered_pids,  	 * not modified.  	 */  	pid_list = kmalloc(sizeof(*pid_list), GFP_KERNEL); -	if (!pid_list) +	if (!pid_list) { +		trace_parser_put(&parser);  		return -ENOMEM; +	}  	pid_list->pid_max = READ_ONCE(pid_max); @@ -507,6 +509,7 @@ int trace_pid_write(struct trace_pid_list *filtered_pids,  	pid_list->pids = vzalloc((pid_list->pid_max + 7) >> 3);  	if (!pid_list->pids) { +		trace_parser_put(&parser);  		kfree(pid_list);  		return -ENOMEM;  	} @@ -7025,19 +7028,23 @@ struct buffer_ref {  	struct ring_buffer	*buffer;  	void			*page;  	int			cpu; -	int			ref; +	refcount_t		refcount;  }; +static void buffer_ref_release(struct buffer_ref *ref) +{ +	if (!refcount_dec_and_test(&ref->refcount)) +		return; +	ring_buffer_free_read_page(ref->buffer, ref->cpu, ref->page); +	kfree(ref); +} +  static void buffer_pipe_buf_release(struct pipe_inode_info *pipe,  				    struct pipe_buffer *buf)  {  	struct buffer_ref *ref = (struct buffer_ref *)buf->private; -	if (--ref->ref) -		return; - -	ring_buffer_free_read_page(ref->buffer, ref->cpu, ref->page); -	kfree(ref); +	buffer_ref_release(ref);  	buf->private = 0;  } @@ -7046,10 +7053,10 @@ static bool buffer_pipe_buf_get(struct pipe_inode_info *pipe,  {  	struct buffer_ref *ref = (struct buffer_ref *)buf->private; -	if (ref->ref > INT_MAX/2) +	if (refcount_read(&ref->refcount) > INT_MAX/2)  		return false; -	ref->ref++; +	refcount_inc(&ref->refcount);  	return true;  } @@ -7057,7 +7064,7 @@ static bool buffer_pipe_buf_get(struct pipe_inode_info *pipe,  static const struct pipe_buf_operations buffer_pipe_buf_ops = {  	.confirm		= generic_pipe_buf_confirm,  	.release		= buffer_pipe_buf_release, -	.steal			= generic_pipe_buf_steal, +	.steal			= generic_pipe_buf_nosteal,  	.get			= buffer_pipe_buf_get,  }; @@ -7070,11 +7077,7 @@ static void buffer_spd_release(struct splice_pipe_desc *spd, unsigned int i)  	struct buffer_ref *ref =  		(struct buffer_ref *)spd->partial[i].private; -	if (--ref->ref) -		return; - -	ring_buffer_free_read_page(ref->buffer, ref->cpu, ref->page); -	kfree(ref); +	buffer_ref_release(ref);  	spd->partial[i].private = 0;  } @@ -7129,7 +7132,7 @@ tracing_buffers_splice_read(struct file *file, loff_t *ppos,  			break;  		} -		ref->ref = 1; +		refcount_set(&ref->refcount, 1);  		ref->buffer = iter->trace_buffer->buffer;  		ref->page = ring_buffer_alloc_read_page(ref->buffer, iter->cpu_file);  		if (IS_ERR(ref->page)) {  |