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

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.comSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent d4347d50
...@@ -346,6 +346,37 @@ static void put_probe_ref(void) ...@@ -346,6 +346,37 @@ static void put_probe_ref(void)
mutex_unlock(&blk_probe_mutex); 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) static void blk_trace_cleanup(struct request_queue *q, struct blk_trace *bt)
{ {
synchronize_rcu(); synchronize_rcu();
...@@ -658,7 +689,6 @@ static int compat_blk_trace_setup(struct request_queue *q, char *name, ...@@ -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) static int __blk_trace_startstop(struct request_queue *q, int start)
{ {
int ret;
struct blk_trace *bt; struct blk_trace *bt;
bt = rcu_dereference_protected(q->blk_trace, bt = rcu_dereference_protected(q->blk_trace,
...@@ -666,36 +696,10 @@ static int __blk_trace_startstop(struct request_queue *q, int start) ...@@ -666,36 +696,10 @@ static int __blk_trace_startstop(struct request_queue *q, int start)
if (bt == NULL) if (bt == NULL)
return -EINVAL; return -EINVAL;
/* if (start)
* For starting a trace, we can transition from a setup or stopped return blk_trace_start(bt);
* trace. For stopping a trace, the state must be running else
*/ return blk_trace_stop(bt);
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;
} }
int blk_trace_startstop(struct request_queue *q, int start) int blk_trace_startstop(struct request_queue *q, int start)
...@@ -1614,13 +1618,7 @@ static int blk_trace_remove_queue(struct request_queue *q) ...@@ -1614,13 +1618,7 @@ static int blk_trace_remove_queue(struct request_queue *q)
if (bt == NULL) if (bt == NULL)
return -EINVAL; return -EINVAL;
if (bt->trace_state == Blktrace_running) { blk_trace_stop(bt);
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);
}
put_probe_ref(); put_probe_ref();
synchronize_rcu(); synchronize_rcu();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment