Commit 60a9bb90 authored by Ye Bin's avatar Ye Bin Committed by Jens Axboe
Browse files

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



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>
parent d4347d50
Loading
Loading
Loading
Loading
+36 −38
Original line number Diff line number Diff line
@@ -346,6 +346,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;
	raw_spin_lock_irq(&running_trace_lock);
	list_add(&bt->running_list, &running_trace_list);
	raw_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;
	raw_spin_lock_irq(&running_trace_lock);
	list_del_init(&bt->running_list);
	raw_spin_unlock_irq(&running_trace_lock);
	relay_flush(bt->rchan);

	return 0;
}

static void blk_trace_cleanup(struct request_queue *q, struct blk_trace *bt)
{
	synchronize_rcu();
@@ -658,7 +689,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,
@@ -666,36 +696,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;
			raw_spin_lock_irq(&running_trace_lock);
			list_add(&bt->running_list, &running_trace_list);
			raw_spin_unlock_irq(&running_trace_lock);

			trace_note_time(bt);
			ret = 0;
		}
	} else {
		if (bt->trace_state == Blktrace_running) {
			bt->trace_state = Blktrace_stopped;
			raw_spin_lock_irq(&running_trace_lock);
			list_del_init(&bt->running_list);
			raw_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)
@@ -1614,13 +1618,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;
		raw_spin_lock_irq(&running_trace_lock);
		list_del_init(&bt->running_list);
		raw_spin_unlock_irq(&running_trace_lock);
		relay_flush(bt->rchan);
	}
	blk_trace_stop(bt);

	put_probe_ref();
	synchronize_rcu();