blk-stat.c (ea68a3e9d14e9e0bf017d178fb4bd53b6deb1482) blk-stat.c (20de765f6d9da0c47b756429c60b41063b990a10)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Block stat tracking code
4 *
5 * Copyright (C) 2016 Jens Axboe
6 */
7#include <linux/kernel.h>
8#include <linux/rculist.h>

--- 176 unchanged lines hidden (view full) ---

185 call_rcu(&cb->rcu, blk_stat_free_callback_rcu);
186}
187
188void blk_stat_disable_accounting(struct request_queue *q)
189{
190 unsigned long flags;
191
192 spin_lock_irqsave(&q->stats->lock, flags);
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Block stat tracking code
4 *
5 * Copyright (C) 2016 Jens Axboe
6 */
7#include <linux/kernel.h>
8#include <linux/rculist.h>

--- 176 unchanged lines hidden (view full) ---

185 call_rcu(&cb->rcu, blk_stat_free_callback_rcu);
186}
187
188void blk_stat_disable_accounting(struct request_queue *q)
189{
190 unsigned long flags;
191
192 spin_lock_irqsave(&q->stats->lock, flags);
193 if (!--q->stats->accounting)
193 if (!--q->stats->accounting && list_empty(&q->stats->callbacks))
194 blk_queue_flag_clear(QUEUE_FLAG_STATS, q);
195 spin_unlock_irqrestore(&q->stats->lock, flags);
196}
197EXPORT_SYMBOL_GPL(blk_stat_disable_accounting);
198
199void blk_stat_enable_accounting(struct request_queue *q)
200{
201 unsigned long flags;
202
203 spin_lock_irqsave(&q->stats->lock, flags);
194 blk_queue_flag_clear(QUEUE_FLAG_STATS, q);
195 spin_unlock_irqrestore(&q->stats->lock, flags);
196}
197EXPORT_SYMBOL_GPL(blk_stat_disable_accounting);
198
199void blk_stat_enable_accounting(struct request_queue *q)
200{
201 unsigned long flags;
202
203 spin_lock_irqsave(&q->stats->lock, flags);
204 if (!q->stats->accounting++)
204 if (!q->stats->accounting++ && list_empty(&q->stats->callbacks))
205 blk_queue_flag_set(QUEUE_FLAG_STATS, q);
206 spin_unlock_irqrestore(&q->stats->lock, flags);
207}
208EXPORT_SYMBOL_GPL(blk_stat_enable_accounting);
209
210struct blk_queue_stats *blk_alloc_queue_stats(void)
211{
212 struct blk_queue_stats *stats;

--- 13 unchanged lines hidden (view full) ---

226{
227 if (!stats)
228 return;
229
230 WARN_ON(!list_empty(&stats->callbacks));
231
232 kfree(stats);
233}
205 blk_queue_flag_set(QUEUE_FLAG_STATS, q);
206 spin_unlock_irqrestore(&q->stats->lock, flags);
207}
208EXPORT_SYMBOL_GPL(blk_stat_enable_accounting);
209
210struct blk_queue_stats *blk_alloc_queue_stats(void)
211{
212 struct blk_queue_stats *stats;

--- 13 unchanged lines hidden (view full) ---

226{
227 if (!stats)
228 return;
229
230 WARN_ON(!list_empty(&stats->callbacks));
231
232 kfree(stats);
233}
234
235bool blk_stats_alloc_enable(struct request_queue *q)
236{
237 struct blk_rq_stat *poll_stat;
238
239 poll_stat = kcalloc(BLK_MQ_POLL_STATS_BKTS, sizeof(*poll_stat),
240 GFP_ATOMIC);
241 if (!poll_stat)
242 return false;
243
244 if (cmpxchg(&q->poll_stat, NULL, poll_stat) != NULL) {
245 kfree(poll_stat);
246 return true;
247 }
248
249 blk_stat_add_callback(q, q->poll_cb);
250 return false;
251}