> On 4/18/21 10:49 PM, Changheun Lee wrote: > >>> @@ -167,6 +168,7 @@ void blk_queue_max_hw_sectors(struct request_queue *q, unsigned int max_hw_secto > >>> max_sectors = round_down(max_sectors, > >>> limits->logical_block_size >> SECTOR_SHIFT); > >>> limits->max_sectors = max_sectors; > >>> + limits->bio_max_bytes = max_sectors << SECTOR_SHIFT; > >>> > >>> q->backing_dev_info->io_pages = max_sectors >> (PAGE_SHIFT - 9); > >>> } > >> > >> Can the new shift operation overflow? If so, how about using > >> check_shl_overflow()? > > > > Actually, overflow might be not heppen in case of physical device. > > But I modified as below. feedback about this. > > > > @@ -168,6 +169,9 @@ void blk_queue_max_hw_sectors(struct request_queue *q, unsigned int max_hw_secto > > limits->logical_block_size >> SECTOR_SHIFT); > > limits->max_sectors = max_sectors; > > > > + limits->bio_max_bytes = check_shl_overflow(max_sectors, SECTOR_SHIFT, > > + &limits->bio_max_bytes) ? UINT_MAX : max_sectors << SECTOR_SHIFT; > > + > > q->backing_dev_info->io_pages = max_sectors >> (PAGE_SHIFT - 9); > > } > > EXPORT_SYMBOL(blk_queue_max_hw_sectors); > > If no overflow occurs, check_shl_overflow() stores the result in the > memory location the third argument points at. So the above expression > can be simplified into the following: > > if (check_shl_overflow(max_sectors, SECTOR_SHIFT, &limits->bio_max_bytes)) { > limits->bio_max_bytes = UINT_MAX; > } OK. No problem. It might be more readable. > > >>> diff --git a/include/linux/bio.h b/include/linux/bio.h > >>> index d0246c92a6e8..e5add63da3af 100644 > >>> --- a/include/linux/bio.h > >>> +++ b/include/linux/bio.h > >>> @@ -106,6 +106,8 @@ static inline void *bio_data(struct bio *bio) > >>> return NULL; > >>> } > >>> > >>> +extern unsigned int bio_max_size(struct bio *bio); > >> > >> You may want to define bio_max_size() as an inline function in bio.h > >> such that no additional function calls are introduced in the hot path. > > > > I tried, but it is not easy. because request_queue structure of blkdev.h > > should be referred in bio.h. I think it's not good to apply as a inline function. > > Please don't worry about this. Inlining bio_max_size() is not a big > concern to me. > > Thanks, > > Bart. I think removing of UINT_MAX setting in blk_stack_limits() might be good. Because default queue limits for stacking device will be set in blk_set_stacking_limits(), and blk_set_default_limits() will be called automatically. So setting of UINT_MAX in blk_stack_limits() is not needed. And setting in blk_stack_limits() can overwrite bio_max_bytes as a default after stacking driver set to proper bio_max_bytes value. Thanks, Changheun Lee.