| From 7fe6e38e478bd2a35810470b0a2c811a3925312a Mon Sep 17 00:00:00 2001 |
| From: Hou Tao <houtao1@huawei.com> |
| Date: Tue, 3 Mar 2020 16:45:01 +0800 |
| Subject: [PATCH] dm: fix congested_fn for request-based device |
| |
| commit 974f51e8633f0f3f33e8f86bbb5ae66758aa63c7 upstream. |
| |
| We neither assign congested_fn for requested-based blk-mq device nor |
| implement it correctly. So fix both. |
| |
| Also, remove incorrect comment from dm_init_normal_md_queue and rename |
| it to dm_init_congested_fn. |
| |
| Fixes: 4aa9c692e052 ("bdi: separate out congested state into a separate struct") |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Hou Tao <houtao1@huawei.com> |
| Signed-off-by: Mike Snitzer <snitzer@redhat.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/md/dm.c b/drivers/md/dm.c |
| index 14ca75ae68b5..d7c278748593 100644 |
| --- a/drivers/md/dm.c |
| +++ b/drivers/md/dm.c |
| @@ -1811,7 +1811,8 @@ static int dm_any_congested(void *congested_data, int bdi_bits) |
| * With request-based DM we only need to check the |
| * top-level queue for congestion. |
| */ |
| - r = md->queue->backing_dev_info->wb.state & bdi_bits; |
| + struct backing_dev_info *bdi = md->queue->backing_dev_info; |
| + r = bdi->wb.congested->state & bdi_bits; |
| } else { |
| map = dm_get_live_table_fast(md); |
| if (map) |
| @@ -1877,15 +1878,6 @@ static const struct dax_operations dm_dax_ops; |
| |
| static void dm_wq_work(struct work_struct *work); |
| |
| -static void dm_init_normal_md_queue(struct mapped_device *md) |
| -{ |
| - /* |
| - * Initialize aspects of queue that aren't relevant for blk-mq |
| - */ |
| - md->queue->backing_dev_info->congested_data = md; |
| - md->queue->backing_dev_info->congested_fn = dm_any_congested; |
| -} |
| - |
| static void cleanup_mapped_device(struct mapped_device *md) |
| { |
| if (md->wq) |
| @@ -2271,6 +2263,12 @@ struct queue_limits *dm_get_queue_limits(struct mapped_device *md) |
| } |
| EXPORT_SYMBOL_GPL(dm_get_queue_limits); |
| |
| +static void dm_init_congested_fn(struct mapped_device *md) |
| +{ |
| + md->queue->backing_dev_info->congested_data = md; |
| + md->queue->backing_dev_info->congested_fn = dm_any_congested; |
| +} |
| + |
| /* |
| * Setup the DM device's queue based on md's type |
| */ |
| @@ -2287,11 +2285,12 @@ int dm_setup_md_queue(struct mapped_device *md, struct dm_table *t) |
| DMERR("Cannot initialize queue for request-based dm-mq mapped device"); |
| return r; |
| } |
| + dm_init_congested_fn(md); |
| break; |
| case DM_TYPE_BIO_BASED: |
| case DM_TYPE_DAX_BIO_BASED: |
| case DM_TYPE_NVME_BIO_BASED: |
| - dm_init_normal_md_queue(md); |
| + dm_init_congested_fn(md); |
| break; |
| case DM_TYPE_NONE: |
| WARN_ON_ONCE(true); |
| -- |
| 2.7.4 |
| |