Lines Matching refs:lim

35 void blk_set_stacking_limits(struct queue_limits *lim)  in blk_set_stacking_limits()  argument
37 memset(lim, 0, sizeof(*lim)); in blk_set_stacking_limits()
38 lim->logical_block_size = SECTOR_SIZE; in blk_set_stacking_limits()
39 lim->physical_block_size = SECTOR_SIZE; in blk_set_stacking_limits()
40 lim->io_min = SECTOR_SIZE; in blk_set_stacking_limits()
41 lim->discard_granularity = SECTOR_SIZE; in blk_set_stacking_limits()
42 lim->dma_alignment = SECTOR_SIZE - 1; in blk_set_stacking_limits()
43 lim->seg_boundary_mask = BLK_SEG_BOUNDARY_MASK; in blk_set_stacking_limits()
46 lim->max_segments = USHRT_MAX; in blk_set_stacking_limits()
47 lim->max_discard_segments = USHRT_MAX; in blk_set_stacking_limits()
48 lim->max_hw_sectors = UINT_MAX; in blk_set_stacking_limits()
49 lim->max_segment_size = UINT_MAX; in blk_set_stacking_limits()
50 lim->max_sectors = UINT_MAX; in blk_set_stacking_limits()
51 lim->max_dev_sectors = UINT_MAX; in blk_set_stacking_limits()
52 lim->max_write_zeroes_sectors = UINT_MAX; in blk_set_stacking_limits()
53 lim->max_zone_append_sectors = UINT_MAX; in blk_set_stacking_limits()
54 lim->max_user_discard_sectors = UINT_MAX; in blk_set_stacking_limits()
59 struct queue_limits *lim) in blk_apply_bdi_limits() argument
65 bdi->ra_pages = max(lim->io_opt * 2 / PAGE_SIZE, VM_READAHEAD_PAGES); in blk_apply_bdi_limits()
66 bdi->io_pages = lim->max_sectors >> PAGE_SECTORS_SHIFT; in blk_apply_bdi_limits()
69 static int blk_validate_zoned_limits(struct queue_limits *lim) in blk_validate_zoned_limits() argument
71 if (!(lim->features & BLK_FEAT_ZONED)) { in blk_validate_zoned_limits()
72 if (WARN_ON_ONCE(lim->max_open_zones) || in blk_validate_zoned_limits()
73 WARN_ON_ONCE(lim->max_active_zones) || in blk_validate_zoned_limits()
74 WARN_ON_ONCE(lim->zone_write_granularity) || in blk_validate_zoned_limits()
75 WARN_ON_ONCE(lim->max_zone_append_sectors)) in blk_validate_zoned_limits()
87 if (lim->max_active_zones && in blk_validate_zoned_limits()
88 lim->max_open_zones > lim->max_active_zones) in blk_validate_zoned_limits()
91 if (lim->zone_write_granularity < lim->logical_block_size) in blk_validate_zoned_limits()
92 lim->zone_write_granularity = lim->logical_block_size; in blk_validate_zoned_limits()
94 if (lim->max_zone_append_sectors) { in blk_validate_zoned_limits()
99 lim->max_zone_append_sectors = in blk_validate_zoned_limits()
100 min3(lim->max_hw_sectors, in blk_validate_zoned_limits()
101 lim->max_zone_append_sectors, in blk_validate_zoned_limits()
102 lim->chunk_sectors); in blk_validate_zoned_limits()
108 static int blk_validate_integrity_limits(struct queue_limits *lim) in blk_validate_integrity_limits() argument
110 struct blk_integrity *bi = &lim->integrity; in blk_validate_integrity_limits()
133 bi->interval_exp = ilog2(lim->logical_block_size); in blk_validate_integrity_limits()
145 static unsigned int blk_queue_max_guaranteed_bio(struct queue_limits *lim) in blk_queue_max_guaranteed_bio() argument
147 unsigned int max_segments = min(BIO_MAX_VECS, lim->max_segments); in blk_queue_max_guaranteed_bio()
150 length = min(max_segments, 2) * lim->logical_block_size; in blk_queue_max_guaranteed_bio()
157 static void blk_atomic_writes_update_limits(struct queue_limits *lim) in blk_atomic_writes_update_limits() argument
159 unsigned int unit_limit = min(lim->max_hw_sectors << SECTOR_SHIFT, in blk_atomic_writes_update_limits()
160 blk_queue_max_guaranteed_bio(lim)); in blk_atomic_writes_update_limits()
164 lim->atomic_write_max_sectors = in blk_atomic_writes_update_limits()
165 min(lim->atomic_write_hw_max >> SECTOR_SHIFT, in blk_atomic_writes_update_limits()
166 lim->max_hw_sectors); in blk_atomic_writes_update_limits()
167 lim->atomic_write_unit_min = in blk_atomic_writes_update_limits()
168 min(lim->atomic_write_hw_unit_min, unit_limit); in blk_atomic_writes_update_limits()
169 lim->atomic_write_unit_max = in blk_atomic_writes_update_limits()
170 min(lim->atomic_write_hw_unit_max, unit_limit); in blk_atomic_writes_update_limits()
171 lim->atomic_write_boundary_sectors = in blk_atomic_writes_update_limits()
172 lim->atomic_write_hw_boundary >> SECTOR_SHIFT; in blk_atomic_writes_update_limits()
175 static void blk_validate_atomic_write_limits(struct queue_limits *lim) in blk_validate_atomic_write_limits() argument
179 if (!lim->atomic_write_hw_max) in blk_validate_atomic_write_limits()
182 boundary_sectors = lim->atomic_write_hw_boundary >> SECTOR_SHIFT; in blk_validate_atomic_write_limits()
198 if (WARN_ON_ONCE(lim->chunk_sectors % boundary_sectors)) in blk_validate_atomic_write_limits()
212 blk_atomic_writes_update_limits(lim); in blk_validate_atomic_write_limits()
216 lim->atomic_write_max_sectors = 0; in blk_validate_atomic_write_limits()
217 lim->atomic_write_boundary_sectors = 0; in blk_validate_atomic_write_limits()
218 lim->atomic_write_unit_min = 0; in blk_validate_atomic_write_limits()
219 lim->atomic_write_unit_max = 0; in blk_validate_atomic_write_limits()
226 static int blk_validate_limits(struct queue_limits *lim) in blk_validate_limits() argument
236 if (!lim->logical_block_size) in blk_validate_limits()
237 lim->logical_block_size = SECTOR_SIZE; in blk_validate_limits()
238 else if (blk_validate_block_size(lim->logical_block_size)) { in blk_validate_limits()
239 pr_warn("Invalid logical block size (%d)\n", lim->logical_block_size); in blk_validate_limits()
242 if (lim->physical_block_size < lim->logical_block_size) in blk_validate_limits()
243 lim->physical_block_size = lim->logical_block_size; in blk_validate_limits()
249 if (lim->io_min < lim->physical_block_size) in blk_validate_limits()
250 lim->io_min = lim->physical_block_size; in blk_validate_limits()
261 if (!lim->max_hw_sectors) in blk_validate_limits()
262 lim->max_hw_sectors = BLK_SAFE_MAX_SECTORS; in blk_validate_limits()
263 if (WARN_ON_ONCE(lim->max_hw_sectors < PAGE_SECTORS)) in blk_validate_limits()
265 logical_block_sectors = lim->logical_block_size >> SECTOR_SHIFT; in blk_validate_limits()
266 if (WARN_ON_ONCE(logical_block_sectors > lim->max_hw_sectors)) in blk_validate_limits()
268 lim->max_hw_sectors = round_down(lim->max_hw_sectors, in blk_validate_limits()
277 max_hw_sectors = min_not_zero(lim->max_hw_sectors, in blk_validate_limits()
278 lim->max_dev_sectors); in blk_validate_limits()
279 if (lim->max_user_sectors) { in blk_validate_limits()
280 if (lim->max_user_sectors < PAGE_SIZE / SECTOR_SIZE) in blk_validate_limits()
282 lim->max_sectors = min(max_hw_sectors, lim->max_user_sectors); in blk_validate_limits()
283 } else if (lim->io_opt > (BLK_DEF_MAX_SECTORS_CAP << SECTOR_SHIFT)) { in blk_validate_limits()
284 lim->max_sectors = in blk_validate_limits()
285 min(max_hw_sectors, lim->io_opt >> SECTOR_SHIFT); in blk_validate_limits()
286 } else if (lim->io_min > (BLK_DEF_MAX_SECTORS_CAP << SECTOR_SHIFT)) { in blk_validate_limits()
287 lim->max_sectors = in blk_validate_limits()
288 min(max_hw_sectors, lim->io_min >> SECTOR_SHIFT); in blk_validate_limits()
290 lim->max_sectors = min(max_hw_sectors, BLK_DEF_MAX_SECTORS_CAP); in blk_validate_limits()
292 lim->max_sectors = round_down(lim->max_sectors, in blk_validate_limits()
299 if (!lim->max_segments) in blk_validate_limits()
300 lim->max_segments = BLK_MAX_SEGMENTS; in blk_validate_limits()
302 lim->max_discard_sectors = in blk_validate_limits()
303 min(lim->max_hw_discard_sectors, lim->max_user_discard_sectors); in blk_validate_limits()
305 if (!lim->max_discard_segments) in blk_validate_limits()
306 lim->max_discard_segments = 1; in blk_validate_limits()
308 if (lim->discard_granularity < lim->physical_block_size) in blk_validate_limits()
309 lim->discard_granularity = lim->physical_block_size; in blk_validate_limits()
316 if (!lim->seg_boundary_mask) in blk_validate_limits()
317 lim->seg_boundary_mask = BLK_SEG_BOUNDARY_MASK; in blk_validate_limits()
318 if (WARN_ON_ONCE(lim->seg_boundary_mask < PAGE_SIZE - 1)) in blk_validate_limits()
328 if (lim->virt_boundary_mask) { in blk_validate_limits()
329 if (!lim->max_segment_size) in blk_validate_limits()
330 lim->max_segment_size = UINT_MAX; in blk_validate_limits()
337 if (!lim->max_segment_size) in blk_validate_limits()
338 lim->max_segment_size = BLK_MAX_SEGMENT_SIZE; in blk_validate_limits()
339 if (WARN_ON_ONCE(lim->max_segment_size < PAGE_SIZE)) in blk_validate_limits()
349 if (!lim->dma_alignment) in blk_validate_limits()
350 lim->dma_alignment = SECTOR_SIZE - 1; in blk_validate_limits()
351 if (WARN_ON_ONCE(lim->dma_alignment > PAGE_SIZE)) in blk_validate_limits()
354 if (lim->alignment_offset) { in blk_validate_limits()
355 lim->alignment_offset &= (lim->physical_block_size - 1); in blk_validate_limits()
356 lim->flags &= ~BLK_FLAG_MISALIGNED; in blk_validate_limits()
359 if (!(lim->features & BLK_FEAT_WRITE_CACHE)) in blk_validate_limits()
360 lim->features &= ~BLK_FEAT_FUA; in blk_validate_limits()
362 blk_validate_atomic_write_limits(lim); in blk_validate_limits()
364 err = blk_validate_integrity_limits(lim); in blk_validate_limits()
367 return blk_validate_zoned_limits(lim); in blk_validate_limits()
375 int blk_set_default_limits(struct queue_limits *lim) in blk_set_default_limits() argument
382 lim->max_user_discard_sectors = UINT_MAX; in blk_set_default_limits()
383 return blk_validate_limits(lim); in blk_set_default_limits()
397 struct queue_limits *lim) in queue_limits_commit_update() argument
401 error = blk_validate_limits(lim); in queue_limits_commit_update()
406 if (q->crypto_profile && lim->integrity.tag_size) { in queue_limits_commit_update()
413 q->limits = *lim; in queue_limits_commit_update()
415 blk_apply_bdi_limits(q->disk->bdi, lim); in queue_limits_commit_update()
433 int queue_limits_set(struct request_queue *q, struct queue_limits *lim) in queue_limits_set() argument
436 return queue_limits_commit_update(q, lim); in queue_limits_set()
440 static int queue_limit_alignment_offset(const struct queue_limits *lim, in queue_limit_alignment_offset() argument
443 unsigned int granularity = max(lim->physical_block_size, lim->io_min); in queue_limit_alignment_offset()
447 return (granularity + lim->alignment_offset - alignment) % granularity; in queue_limit_alignment_offset()
451 const struct queue_limits *lim, sector_t sector) in queue_limit_discard_alignment() argument
455 if (!lim->max_discard_sectors) in queue_limit_discard_alignment()
459 alignment = lim->discard_alignment >> SECTOR_SHIFT; in queue_limit_discard_alignment()
460 granularity = lim->discard_granularity >> SECTOR_SHIFT; in queue_limit_discard_alignment()