blk-stat: don't use this_cpu_ptr() in a preemptable section
If PREEMPT_RCU is enabled, rcu_read_lock() isn't strong enough
for us to use this_cpu_ptr() in that section. Use the safer
get/put_cpu_ptr() variants instead.
Reported-by: Mike Galbraith <efault@gmx.de>
Fixes: 34dbad5d26
("blk-stat: convert to callback-based statistics reporting")
Signed-off-by: Jens Axboe <axboe@fb.com>
This commit is contained in:
parent
340ff32167
commit
d373812398
|
@ -96,13 +96,16 @@ void blk_stat_add(struct request *rq)
|
|||
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(cb, &q->stats->callbacks, list) {
|
||||
if (blk_stat_is_active(cb)) {
|
||||
bucket = cb->bucket_fn(rq);
|
||||
if (bucket < 0)
|
||||
continue;
|
||||
stat = &this_cpu_ptr(cb->cpu_stat)[bucket];
|
||||
__blk_stat_add(stat, value);
|
||||
}
|
||||
if (!blk_stat_is_active(cb))
|
||||
continue;
|
||||
|
||||
bucket = cb->bucket_fn(rq);
|
||||
if (bucket < 0)
|
||||
continue;
|
||||
|
||||
stat = &get_cpu_ptr(cb->cpu_stat)[bucket];
|
||||
__blk_stat_add(stat, value);
|
||||
put_cpu_ptr(cb->cpu_stat);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue