| From 974f51e8633f0f3f33e8f86bbb5ae66758aa63c7 Mon Sep 17 00:00:00 2001 |
| From: Hou Tao <houtao1@huawei.com> |
| Date: Tue, 3 Mar 2020 16:45:01 +0800 |
| Subject: dm: fix congested_fn for request-based device |
| |
| From: Hou Tao <houtao1@huawei.com> |
| |
| 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: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/md/dm.c | 21 ++++++++++----------- |
| 1 file changed, 10 insertions(+), 11 deletions(-) |
| |
| --- a/drivers/md/dm.c |
| +++ b/drivers/md/dm.c |
| @@ -1788,7 +1788,8 @@ static int dm_any_congested(void *conges |
| * 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) |
| @@ -1854,15 +1855,6 @@ static const struct dax_operations dm_da |
| |
| 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) |
| @@ -2249,6 +2241,12 @@ struct queue_limits *dm_get_queue_limits |
| } |
| 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 |
| */ |
| @@ -2265,11 +2263,12 @@ int dm_setup_md_queue(struct mapped_devi |
| 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); |