Commit 27ae9234 authored by Ye Bin's avatar Ye Bin Committed by Zheng Zengkai
Browse files

blktrace: introduce 'blk_trace_{start,stop}' helper

mainline inclusion
from mainline-v6.1-rc2
commit 60a9bb90
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I5ZI04
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?h=v6.1-rc3&id=60a9bb9048f9e95029df10a9bc346f6b066c593c



--------------------------------

Introduce 'blk_trace_{start,stop}' helper. No functional changed.

Signed-off-by: default avatarYe Bin <yebin10@huawei.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20221019033602.752383-2-yebin@huaweicloud.com


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>

conflicts:
kernel/trace/blktrace.c

Signed-off-by: default avatarYe Bin <yebin@huaweicloud.com>
Reviewed-by: default avatarJason Yan <yanaijie@huawei.com>
Signed-off-by: default avatarZheng Zengkai <zhengzengkai@huawei.com>
parent 6f182d68
Loading
Loading
Loading
Loading
+36 −38
Original line number Diff line number Diff line
@@ -337,6 +337,37 @@ static void put_probe_ref(void)
	mutex_unlock(&blk_probe_mutex);
}

static int blk_trace_start(struct blk_trace *bt)
{
	if (bt->trace_state != Blktrace_setup &&
	    bt->trace_state != Blktrace_stopped)
		return -EINVAL;

	blktrace_seq++;
	smp_mb();
	bt->trace_state = Blktrace_running;
	spin_lock_irq(&running_trace_lock);
	list_add(&bt->running_list, &running_trace_list);
	spin_unlock_irq(&running_trace_lock);
	trace_note_time(bt);

	return 0;
}

static int blk_trace_stop(struct blk_trace *bt)
{
	if (bt->trace_state != Blktrace_running)
		return -EINVAL;

	bt->trace_state = Blktrace_stopped;
	spin_lock_irq(&running_trace_lock);
	list_del_init(&bt->running_list);
	spin_unlock_irq(&running_trace_lock);
	relay_flush(bt->rchan);

	return 0;
}

static void blk_trace_cleanup(struct blk_trace *bt)
{
	synchronize_rcu();
@@ -656,7 +687,6 @@ static int compat_blk_trace_setup(struct request_queue *q, char *name,

static int __blk_trace_startstop(struct request_queue *q, int start)
{
	int ret;
	struct blk_trace *bt;

	bt = rcu_dereference_protected(q->blk_trace,
@@ -664,36 +694,10 @@ static int __blk_trace_startstop(struct request_queue *q, int start)
	if (bt == NULL)
		return -EINVAL;

	/*
	 * For starting a trace, we can transition from a setup or stopped
	 * trace. For stopping a trace, the state must be running
	 */
	ret = -EINVAL;
	if (start) {
		if (bt->trace_state == Blktrace_setup ||
		    bt->trace_state == Blktrace_stopped) {
			blktrace_seq++;
			smp_mb();
			bt->trace_state = Blktrace_running;
			spin_lock_irq(&running_trace_lock);
			list_add(&bt->running_list, &running_trace_list);
			spin_unlock_irq(&running_trace_lock);

			trace_note_time(bt);
			ret = 0;
		}
	} else {
		if (bt->trace_state == Blktrace_running) {
			bt->trace_state = Blktrace_stopped;
			spin_lock_irq(&running_trace_lock);
			list_del_init(&bt->running_list);
			spin_unlock_irq(&running_trace_lock);
			relay_flush(bt->rchan);
			ret = 0;
		}
	}

	return ret;
	if (start)
		return blk_trace_start(bt);
	else
		return blk_trace_stop(bt);
}

int blk_trace_startstop(struct request_queue *q, int start)
@@ -1671,13 +1675,7 @@ static int blk_trace_remove_queue(struct request_queue *q)
	if (bt == NULL)
		return -EINVAL;

	if (bt->trace_state == Blktrace_running) {
		bt->trace_state = Blktrace_stopped;
		spin_lock_irq(&running_trace_lock);
		list_del_init(&bt->running_list);
		spin_unlock_irq(&running_trace_lock);
		relay_flush(bt->rchan);
	}
	blk_trace_stop(bt);

	put_probe_ref();
	synchronize_rcu();