Unverified Commit c4df3531 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!2377 tracing: Backport bugfixes

Merge Pull Request from: @ci-robot 
 
PR sync from: Zheng Yejian <zhengyejian1@huawei.com>
https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/UMN7NGAYHWGX24DTB4MLALCKEPKYXWNK/ 
Chen Lin (1):
  ring-buffer: Do not swap cpu_buffer during resize process

Steven Rostedt (Google) (1):
  ring-buffer: Do not attempt to read past "commit"


-- 
2.25.1
 
https://gitee.com/openeuler/kernel/issues/I86Q1D 
 
Link:https://gitee.com/openeuler/kernel/pulls/2377

 

Reviewed-by: default avatarXu Kuohai <xukuohai@huawei.com>
Signed-off-by: default avatarJialin Zhang <zhangjialin11@huawei.com>
parents cfc785ec cd497548
Loading
Loading
Loading
Loading
+18 −1
Original line number Diff line number Diff line
@@ -539,6 +539,7 @@ struct trace_buffer {
	unsigned			flags;
	int				cpus;
	atomic_t			record_disabled;
	atomic_t			resizing;
	cpumask_var_t			cpumask;

	struct lock_class_key		*reader_lock_key;
@@ -2038,7 +2039,7 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,

	/* prevent another thread from changing buffer sizes */
	mutex_lock(&buffer->mutex);

	atomic_inc(&buffer->resizing);

	if (cpu_id == RING_BUFFER_ALL_CPUS) {
		/*
@@ -2181,6 +2182,7 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
		atomic_dec(&buffer->record_disabled);
	}

	atomic_dec(&buffer->resizing);
	mutex_unlock(&buffer->mutex);
	return 0;

@@ -2201,6 +2203,7 @@ int ring_buffer_resize(struct trace_buffer *buffer, unsigned long size,
		}
	}
 out_err_unlock:
	atomic_dec(&buffer->resizing);
	mutex_unlock(&buffer->mutex);
	return err;
}
@@ -2252,6 +2255,11 @@ rb_iter_head_event(struct ring_buffer_iter *iter)
	 */
	commit = rb_page_commit(iter_head_page);
	smp_rmb();

	/* An event needs to be at least 8 bytes in size */
	if (iter->head > commit - 8)
		goto reset;

	event = __rb_page_index(iter_head_page, iter->head);
	length = rb_event_length(event);

@@ -5237,6 +5245,15 @@ int ring_buffer_swap_cpu(struct trace_buffer *buffer_a,
	if (local_read(&cpu_buffer_b->committing))
		goto out_dec;

	/*
	 * When resize is in progress, we cannot swap it because
	 * it will mess the state of the cpu buffer.
	 */
	if (atomic_read(&buffer_a->resizing))
		goto out_dec;
	if (atomic_read(&buffer_b->resizing))
		goto out_dec;

	buffer_a->buffers[cpu] = cpu_buffer_b;
	buffer_b->buffers[cpu] = cpu_buffer_a;

+2 −1
Original line number Diff line number Diff line
@@ -1876,9 +1876,10 @@ update_max_tr_single(struct trace_array *tr, struct task_struct *tsk, int cpu)
		 * place on this CPU. We fail to record, but we reset
		 * the max trace buffer (no one writes directly to it)
		 * and flag that it failed.
		 * Another reason is resize is in progress.
		 */
		trace_array_printk_buf(tr->max_buffer.buffer, _THIS_IP_,
			"Failed to swap buffers due to commit in progress\n");
			"Failed to swap buffers due to commit or resize in progress\n");
	}

	WARN_ON_ONCE(ret && ret != -EAGAIN && ret != -EBUSY);