Commit 11d8a6e3 authored by NeilBrown's avatar NeilBrown

md/raid5: export is_congested test

the dm module will need this for dm-raid45.

Also only access ->queue->backing_dev_info->congested_fn
if ->queue actually exists.  It won't in a dm target.
Signed-off-by: default avatarNeilBrown <neilb@suse.de>
parent 4a5add49
...@@ -3678,17 +3678,14 @@ static void raid5_unplug_device(struct request_queue *q) ...@@ -3678,17 +3678,14 @@ static void raid5_unplug_device(struct request_queue *q)
unplug_slaves(mddev); unplug_slaves(mddev);
} }
static int raid5_congested(void *data, int bits) int md_raid5_congested(mddev_t *mddev, int bits)
{ {
mddev_t *mddev = data;
raid5_conf_t *conf = mddev->private; raid5_conf_t *conf = mddev->private;
/* No difference between reads and writes. Just check /* No difference between reads and writes. Just check
* how busy the stripe_cache is * how busy the stripe_cache is
*/ */
if (mddev_congested(mddev, bits))
return 1;
if (conf->inactive_blocked) if (conf->inactive_blocked)
return 1; return 1;
if (conf->quiesce) if (conf->quiesce)
...@@ -3698,6 +3695,15 @@ static int raid5_congested(void *data, int bits) ...@@ -3698,6 +3695,15 @@ static int raid5_congested(void *data, int bits)
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(md_raid5_congested);
static int raid5_congested(void *data, int bits)
{
mddev_t *mddev = data;
return mddev_congested(mddev, bits) ||
md_raid5_congested(mddev, bits);
}
/* We want read requests to align with chunks where possible, /* We want read requests to align with chunks where possible,
* but write requests don't need to. * but write requests don't need to.
...@@ -5184,13 +5190,14 @@ static int run(mddev_t *mddev) ...@@ -5184,13 +5190,14 @@ static int run(mddev_t *mddev)
mddev->queue->backing_dev_info.ra_pages = 2 * stripe; mddev->queue->backing_dev_info.ra_pages = 2 * stripe;
blk_queue_merge_bvec(mddev->queue, raid5_mergeable_bvec); blk_queue_merge_bvec(mddev->queue, raid5_mergeable_bvec);
mddev->queue->backing_dev_info.congested_data = mddev;
mddev->queue->backing_dev_info.congested_fn = raid5_congested;
} }
mddev->queue->queue_lock = &conf->device_lock; mddev->queue->queue_lock = &conf->device_lock;
mddev->queue->unplug_fn = raid5_unplug_device; mddev->queue->unplug_fn = raid5_unplug_device;
mddev->queue->backing_dev_info.congested_data = mddev;
mddev->queue->backing_dev_info.congested_fn = raid5_congested;
chunk_size = mddev->chunk_sectors << 9; chunk_size = mddev->chunk_sectors << 9;
blk_queue_io_min(mddev->queue, chunk_size); blk_queue_io_min(mddev->queue, chunk_size);
...@@ -5220,7 +5227,8 @@ static int stop(mddev_t *mddev) ...@@ -5220,7 +5227,8 @@ static int stop(mddev_t *mddev)
md_unregister_thread(mddev->thread); md_unregister_thread(mddev->thread);
mddev->thread = NULL; mddev->thread = NULL;
mddev->queue->backing_dev_info.congested_fn = NULL; if (mddev->queue)
mddev->queue->backing_dev_info.congested_fn = NULL;
blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/ blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/
free_conf(conf); free_conf(conf);
mddev->private = NULL; mddev->private = NULL;
......
...@@ -497,5 +497,7 @@ static inline int algorithm_is_DDF(int layout) ...@@ -497,5 +497,7 @@ static inline int algorithm_is_DDF(int layout)
{ {
return layout >= 8 && layout <= 10; return layout >= 8 && layout <= 10;
} }
extern int md_raid5_congested(mddev_t *mddev, int bits);
extern int raid5_set_cache_size(mddev_t *mddev, int size); extern int raid5_set_cache_size(mddev_t *mddev, int size);
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment