aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin K. Petersen <martin.petersen@oracle.com>2012-01-11 10:27:11 -0500
committerJens Axboe <axboe@kernel.dk>2012-01-11 10:27:11 -0500
commitb1bd055d397e09f99dcef9b138ed104ff1812fcb (patch)
treee8e1d3d0b6a33859392bcba516933aff256dc4b4
parentc98b2cc29af8e84e7364b53e9bb4cc7cfaf62555 (diff)
block: Introduce blk_set_stacking_limits function
Stacking driver queue limits are typically bounded exclusively by the capabilities of the low level devices, not by the stacking driver itself. This patch introduces blk_set_stacking_limits() which has more liberal metrics than the default queue limits function. This allows us to inherit topology parameters from bottom devices without manually tweaking the default limits in each driver prior to calling the stacking function. Since there is now a clear distinction between stacking and low-level devices, blk_set_default_limits() has been modified to carry the more conservative values that we used to manually set in blk_queue_make_request(). Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Acked-by: Mike Snitzer <snitzer@redhat.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r--block/blk-settings.c32
-rw-r--r--drivers/md/dm-table.c6
-rw-r--r--drivers/md/md.c1
-rw-r--r--include/linux/blkdev.h1
4 files changed, 29 insertions, 11 deletions
diff --git a/block/blk-settings.c b/block/blk-settings.c
index fa1eb0449a05..d3234fc494ad 100644
--- a/block/blk-settings.c
+++ b/block/blk-settings.c
@@ -104,9 +104,7 @@ EXPORT_SYMBOL_GPL(blk_queue_lld_busy);
104 * @lim: the queue_limits structure to reset 104 * @lim: the queue_limits structure to reset
105 * 105 *
106 * Description: 106 * Description:
107 * Returns a queue_limit struct to its default state. Can be used by 107 * Returns a queue_limit struct to its default state.
108 * stacking drivers like DM that stage table swaps and reuse an
109 * existing device queue.
110 */ 108 */
111void blk_set_default_limits(struct queue_limits *lim) 109void blk_set_default_limits(struct queue_limits *lim)
112{ 110{
@@ -114,13 +112,12 @@ void blk_set_default_limits(struct queue_limits *lim)
114 lim->max_integrity_segments = 0; 112 lim->max_integrity_segments = 0;
115 lim->seg_boundary_mask = BLK_SEG_BOUNDARY_MASK; 113 lim->seg_boundary_mask = BLK_SEG_BOUNDARY_MASK;
116 lim->max_segment_size = BLK_MAX_SEGMENT_SIZE; 114 lim->max_segment_size = BLK_MAX_SEGMENT_SIZE;
117 lim->max_sectors = BLK_DEF_MAX_SECTORS; 115 lim->max_sectors = lim->max_hw_sectors = BLK_SAFE_MAX_SECTORS;
118 lim->max_hw_sectors = INT_MAX;
119 lim->max_discard_sectors = 0; 116 lim->max_discard_sectors = 0;
120 lim->discard_granularity = 0; 117 lim->discard_granularity = 0;
121 lim->discard_alignment = 0; 118 lim->discard_alignment = 0;
122 lim->discard_misaligned = 0; 119 lim->discard_misaligned = 0;
123 lim->discard_zeroes_data = 1; 120 lim->discard_zeroes_data = 0;
124 lim->logical_block_size = lim->physical_block_size = lim->io_min = 512; 121 lim->logical_block_size = lim->physical_block_size = lim->io_min = 512;
125 lim->bounce_pfn = (unsigned long)(BLK_BOUNCE_ANY >> PAGE_SHIFT); 122 lim->bounce_pfn = (unsigned long)(BLK_BOUNCE_ANY >> PAGE_SHIFT);
126 lim->alignment_offset = 0; 123 lim->alignment_offset = 0;
@@ -131,6 +128,27 @@ void blk_set_default_limits(struct queue_limits *lim)
131EXPORT_SYMBOL(blk_set_default_limits); 128EXPORT_SYMBOL(blk_set_default_limits);
132 129
133/** 130/**
131 * blk_set_stacking_limits - set default limits for stacking devices
132 * @lim: the queue_limits structure to reset
133 *
134 * Description:
135 * Returns a queue_limit struct to its default state. Should be used
136 * by stacking drivers like DM that have no internal limits.
137 */
138void blk_set_stacking_limits(struct queue_limits *lim)
139{
140 blk_set_default_limits(lim);
141
142 /* Inherit limits from component devices */
143 lim->discard_zeroes_data = 1;
144 lim->max_segments = USHRT_MAX;
145 lim->max_hw_sectors = UINT_MAX;
146
147 lim->max_sectors = BLK_DEF_MAX_SECTORS;
148}
149EXPORT_SYMBOL(blk_set_stacking_limits);
150
151/**
134 * blk_queue_make_request - define an alternate make_request function for a device 152 * blk_queue_make_request - define an alternate make_request function for a device
135 * @q: the request queue for the device to be affected 153 * @q: the request queue for the device to be affected
136 * @mfn: the alternate make_request function 154 * @mfn: the alternate make_request function
@@ -165,8 +183,6 @@ void blk_queue_make_request(struct request_queue *q, make_request_fn *mfn)
165 q->nr_batching = BLK_BATCH_REQ; 183 q->nr_batching = BLK_BATCH_REQ;
166 184
167 blk_set_default_limits(&q->limits); 185 blk_set_default_limits(&q->limits);
168 blk_queue_max_hw_sectors(q, BLK_SAFE_MAX_SECTORS);
169 q->limits.discard_zeroes_data = 0;
170 186
171 /* 187 /*
172 * by default assume old behaviour and bounce for any highmem page 188 * by default assume old behaviour and bounce for any highmem page
diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c
index 8e9132130142..63cc54289aff 100644
--- a/drivers/md/dm-table.c
+++ b/drivers/md/dm-table.c
@@ -699,7 +699,7 @@ static int validate_hardware_logical_block_alignment(struct dm_table *table,
699 while (i < dm_table_get_num_targets(table)) { 699 while (i < dm_table_get_num_targets(table)) {
700 ti = dm_table_get_target(table, i++); 700 ti = dm_table_get_target(table, i++);
701 701
702 blk_set_default_limits(&ti_limits); 702 blk_set_stacking_limits(&ti_limits);
703 703
704 /* combine all target devices' limits */ 704 /* combine all target devices' limits */
705 if (ti->type->iterate_devices) 705 if (ti->type->iterate_devices)
@@ -1221,10 +1221,10 @@ int dm_calculate_queue_limits(struct dm_table *table,
1221 struct queue_limits ti_limits; 1221 struct queue_limits ti_limits;
1222 unsigned i = 0; 1222 unsigned i = 0;
1223 1223
1224 blk_set_default_limits(limits); 1224 blk_set_stacking_limits(limits);
1225 1225
1226 while (i < dm_table_get_num_targets(table)) { 1226 while (i < dm_table_get_num_targets(table)) {
1227 blk_set_default_limits(&ti_limits); 1227 blk_set_stacking_limits(&ti_limits);
1228 1228
1229 ti = dm_table_get_target(table, i++); 1229 ti = dm_table_get_target(table, i++);
1230 1230
diff --git a/drivers/md/md.c b/drivers/md/md.c
index ee981737edfc..114ba155af87 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -4622,6 +4622,7 @@ static int md_alloc(dev_t dev, char *name)
4622 mddev->queue->queuedata = mddev; 4622 mddev->queue->queuedata = mddev;
4623 4623
4624 blk_queue_make_request(mddev->queue, md_make_request); 4624 blk_queue_make_request(mddev->queue, md_make_request);
4625 blk_set_stacking_limits(&mddev->queue->limits);
4625 4626
4626 disk = alloc_disk(1 << shift); 4627 disk = alloc_disk(1 << shift);
4627 if (!disk) { 4628 if (!disk) {
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index 8bca04873f53..adc34133a56a 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -844,6 +844,7 @@ extern void blk_queue_io_min(struct request_queue *q, unsigned int min);
844extern void blk_limits_io_opt(struct queue_limits *limits, unsigned int opt); 844extern void blk_limits_io_opt(struct queue_limits *limits, unsigned int opt);
845extern void blk_queue_io_opt(struct request_queue *q, unsigned int opt); 845extern void blk_queue_io_opt(struct request_queue *q, unsigned int opt);
846extern void blk_set_default_limits(struct queue_limits *lim); 846extern void blk_set_default_limits(struct queue_limits *lim);
847extern void blk_set_stacking_limits(struct queue_limits *lim);
847extern int blk_stack_limits(struct queue_limits *t, struct queue_limits *b, 848extern int blk_stack_limits(struct queue_limits *t, struct queue_limits *b,
848 sector_t offset); 849 sector_t offset);
849extern int bdev_stack_limits(struct queue_limits *t, struct block_device *bdev, 850extern int bdev_stack_limits(struct queue_limits *t, struct block_device *bdev,