Skip to content

Commit

Permalink
block: fix stacked driver stats init and free
Browse files Browse the repository at this point in the history
If a driver allocates a queue for stacked usage, then it does
not currently get stats allocated. This causes the later init
of, eg, writeback throttling to blow up. Move the init to the
queue allocation instead.

Additionally, allow a NULL callback unregistration. This avoids
having the caller check for that, fixing another oops on
removal of a block device that doesn't have poll stats allocated.

Fixes: 34dbad5 ("blk-stat: convert to callback-based statistics reporting")
Signed-off-by: Jens Axboe <axboe@fb.com>
  • Loading branch information
Jens Axboe committed Mar 21, 2017
1 parent 34dbad5 commit a83b576
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 5 deletions.
10 changes: 6 additions & 4 deletions block/blk-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -720,6 +720,10 @@ struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id)
if (!q->backing_dev_info)
goto fail_split;

q->stats = blk_alloc_queue_stats();
if (!q->stats)
goto fail_stats;

q->backing_dev_info->ra_pages =
(VM_MAX_READAHEAD * 1024) / PAGE_SIZE;
q->backing_dev_info->capabilities = BDI_CAP_CGROUP_WRITEBACK;
Expand Down Expand Up @@ -776,6 +780,8 @@ struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id)
fail_ref:
percpu_ref_exit(&q->q_usage_counter);
fail_bdi:
blk_free_queue_stats(q->stats);
fail_stats:
bdi_put(q->backing_dev_info);
fail_split:
bioset_free(q->bio_split);
Expand Down Expand Up @@ -852,10 +858,6 @@ static blk_qc_t blk_queue_bio(struct request_queue *q, struct bio *bio);

int blk_init_allocated_queue(struct request_queue *q)
{
q->stats = blk_alloc_queue_stats();
if (!q->stats)
return -ENOMEM;

q->fq = blk_alloc_flush_queue(q, NUMA_NO_NODE, q->cmd_size);
if (!q->fq)
return -ENOMEM;
Expand Down
3 changes: 2 additions & 1 deletion block/blk-stat.c
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,8 @@ static void blk_stat_free_callback_rcu(struct rcu_head *head)

void blk_stat_free_callback(struct blk_stat_callback *cb)
{
call_rcu(&cb->rcu, blk_stat_free_callback_rcu);
if (cb)
call_rcu(&cb->rcu, blk_stat_free_callback_rcu);
}
EXPORT_SYMBOL_GPL(blk_stat_free_callback);

Expand Down

0 comments on commit a83b576

Please sign in to comment.