@@ -137,6 +137,7 @@ void blk_stat_add_callback(struct request_queue *q,
137
137
struct blk_stat_callback * cb )
138
138
{
139
139
unsigned int bucket ;
140
+ unsigned long flags ;
140
141
int cpu ;
141
142
142
143
for_each_possible_cpu (cpu ) {
@@ -147,20 +148,22 @@ void blk_stat_add_callback(struct request_queue *q,
147
148
blk_rq_stat_init (& cpu_stat [bucket ]);
148
149
}
149
150
150
- spin_lock (& q -> stats -> lock );
151
+ spin_lock_irqsave (& q -> stats -> lock , flags );
151
152
list_add_tail_rcu (& cb -> list , & q -> stats -> callbacks );
152
153
blk_queue_flag_set (QUEUE_FLAG_STATS , q );
153
- spin_unlock (& q -> stats -> lock );
154
+ spin_unlock_irqrestore (& q -> stats -> lock , flags );
154
155
}
155
156
156
157
void blk_stat_remove_callback (struct request_queue * q ,
157
158
struct blk_stat_callback * cb )
158
159
{
159
- spin_lock (& q -> stats -> lock );
160
+ unsigned long flags ;
161
+
162
+ spin_lock_irqsave (& q -> stats -> lock , flags );
160
163
list_del_rcu (& cb -> list );
161
164
if (list_empty (& q -> stats -> callbacks ) && !q -> stats -> enable_accounting )
162
165
blk_queue_flag_clear (QUEUE_FLAG_STATS , q );
163
- spin_unlock (& q -> stats -> lock );
166
+ spin_unlock_irqrestore (& q -> stats -> lock , flags );
164
167
165
168
del_timer_sync (& cb -> timer );
166
169
}
@@ -183,10 +186,12 @@ void blk_stat_free_callback(struct blk_stat_callback *cb)
183
186
184
187
void blk_stat_enable_accounting (struct request_queue * q )
185
188
{
186
- spin_lock (& q -> stats -> lock );
189
+ unsigned long flags ;
190
+
191
+ spin_lock_irqsave (& q -> stats -> lock , flags );
187
192
q -> stats -> enable_accounting = true;
188
193
blk_queue_flag_set (QUEUE_FLAG_STATS , q );
189
- spin_unlock (& q -> stats -> lock );
194
+ spin_unlock_irqrestore (& q -> stats -> lock , flags );
190
195
}
191
196
EXPORT_SYMBOL_GPL (blk_stat_enable_accounting );
192
197
0 commit comments