Skip to content

Commit e11d80a

Browse files
htejunaxboe
authored andcommitted
blk-stat: make q->stats->lock irqsafe
blk-iocost calls blk_stat_enable_accounting() while holding an irqsafe lock which triggers a lockdep splat because q->stats->lock isn't irqsafe. Let's make it irqsafe. Signed-off-by: Tejun Heo <tj@kernel.org> Fixes: cd00650 ("blk-iocost: account for IO size when testing latencies") Cc: stable@vger.kernel.org # v5.8+ Signed-off-by: Jens Axboe <axboe@kernel.dk>
1 parent 5aeac7c commit e11d80a

File tree

1 file changed

+11
-6
lines changed

1 file changed

+11
-6
lines changed

block/blk-stat.c

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ void blk_stat_add_callback(struct request_queue *q,
137137
struct blk_stat_callback *cb)
138138
{
139139
unsigned int bucket;
140+
unsigned long flags;
140141
int cpu;
141142

142143
for_each_possible_cpu(cpu) {
@@ -147,20 +148,22 @@ void blk_stat_add_callback(struct request_queue *q,
147148
blk_rq_stat_init(&cpu_stat[bucket]);
148149
}
149150

150-
spin_lock(&q->stats->lock);
151+
spin_lock_irqsave(&q->stats->lock, flags);
151152
list_add_tail_rcu(&cb->list, &q->stats->callbacks);
152153
blk_queue_flag_set(QUEUE_FLAG_STATS, q);
153-
spin_unlock(&q->stats->lock);
154+
spin_unlock_irqrestore(&q->stats->lock, flags);
154155
}
155156

156157
void blk_stat_remove_callback(struct request_queue *q,
157158
struct blk_stat_callback *cb)
158159
{
159-
spin_lock(&q->stats->lock);
160+
unsigned long flags;
161+
162+
spin_lock_irqsave(&q->stats->lock, flags);
160163
list_del_rcu(&cb->list);
161164
if (list_empty(&q->stats->callbacks) && !q->stats->enable_accounting)
162165
blk_queue_flag_clear(QUEUE_FLAG_STATS, q);
163-
spin_unlock(&q->stats->lock);
166+
spin_unlock_irqrestore(&q->stats->lock, flags);
164167

165168
del_timer_sync(&cb->timer);
166169
}
@@ -183,10 +186,12 @@ void blk_stat_free_callback(struct blk_stat_callback *cb)
183186

184187
void blk_stat_enable_accounting(struct request_queue *q)
185188
{
186-
spin_lock(&q->stats->lock);
189+
unsigned long flags;
190+
191+
spin_lock_irqsave(&q->stats->lock, flags);
187192
q->stats->enable_accounting = true;
188193
blk_queue_flag_set(QUEUE_FLAG_STATS, q);
189-
spin_unlock(&q->stats->lock);
194+
spin_unlock_irqrestore(&q->stats->lock, flags);
190195
}
191196
EXPORT_SYMBOL_GPL(blk_stat_enable_accounting);
192197

0 commit comments

Comments
 (0)