summaryrefslogtreecommitdiffstats
path: root/block/blk-stat.c
diff options
context:
space:
mode:
authorJens Axboe <axboe@kernel.dk>2021-11-13 14:03:26 -0700
committerJens Axboe <axboe@kernel.dk>2021-11-29 06:38:35 -0700
commit48b5c1fbcd8c5bc6b91a56399a5257b801391dd8 (patch)
treeca7326ec1b162e4e8cc3701ea620b6b13012798b /block/blk-stat.c
parent25c4b5e058578066db56d757ad3a7adeaff35856 (diff)
downloadlinux-48b5c1fbcd8c5bc6b91a56399a5257b801391dd8.tar.bz2
block: only allocate poll_stats if there's a user of them
This is essentially never used, yet it's about 1/3rd of the total queue size. Allocate it when needed, and don't embed it in the queue. Kill the queue flag for this while at it, since we can just check the assigned pointer now. Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block/blk-stat.c')
-rw-r--r--block/blk-stat.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/block/blk-stat.c b/block/blk-stat.c
index ae3dd1fb8e61..efb2a80db906 100644
--- a/block/blk-stat.c
+++ b/block/blk-stat.c
@@ -219,3 +219,21 @@ void blk_free_queue_stats(struct blk_queue_stats *stats)
kfree(stats);
}
+
+bool blk_stats_alloc_enable(struct request_queue *q)
+{
+ struct blk_rq_stat *poll_stat;
+
+ poll_stat = kcalloc(BLK_MQ_POLL_STATS_BKTS, sizeof(*poll_stat),
+ GFP_ATOMIC);
+ if (!poll_stat)
+ return false;
+
+ if (cmpxchg(&q->poll_stat, NULL, poll_stat) != NULL) {
+ kfree(poll_stat);
+ return true;
+ }
+
+ blk_stat_add_callback(q, q->poll_cb);
+ return false;
+}