Skip to content

Commit f09313c

Browse files
committed
block: cache inode size in bdev
Reading the inode size brings in a new cacheline for IO submit, and it's in the hot path being checked for every single IO. When doing millions of IOs per core per second, this is noticeable overhead. Cache the nr_sectors in the bdev itself. Reviewed-by: Christoph Hellwig <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
1 parent e4ae473 commit f09313c

File tree

4 files changed

+7
-4
lines changed

4 files changed

+7
-4
lines changed

block/genhd.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ void set_capacity(struct gendisk *disk, sector_t sectors)
5858

5959
spin_lock(&bdev->bd_size_lock);
6060
i_size_write(bdev->bd_inode, (loff_t)sectors << SECTOR_SHIFT);
61+
bdev->bd_nr_sectors = sectors;
6162
spin_unlock(&bdev->bd_size_lock);
6263
}
6364
EXPORT_SYMBOL(set_capacity);

block/partitions/core.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ static void bdev_set_nr_sectors(struct block_device *bdev, sector_t sectors)
9191
{
9292
spin_lock(&bdev->bd_size_lock);
9393
i_size_write(bdev->bd_inode, (loff_t)sectors << SECTOR_SHIFT);
94+
bdev->bd_nr_sectors = sectors;
9495
spin_unlock(&bdev->bd_size_lock);
9596
}
9697

include/linux/blk_types.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ struct bio_crypt_ctx;
3939

4040
struct block_device {
4141
sector_t bd_start_sect;
42+
sector_t bd_nr_sectors;
4243
struct disk_stats __percpu *bd_stats;
4344
unsigned long bd_stamp;
4445
bool bd_read_only; /* read-only policy */

include/linux/genhd.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -236,14 +236,14 @@ static inline sector_t get_start_sect(struct block_device *bdev)
236236
return bdev->bd_start_sect;
237237
}
238238

239-
static inline loff_t bdev_nr_bytes(struct block_device *bdev)
239+
static inline sector_t bdev_nr_sectors(struct block_device *bdev)
240240
{
241-
return i_size_read(bdev->bd_inode);
241+
return bdev->bd_nr_sectors;
242242
}
243243

244-
static inline sector_t bdev_nr_sectors(struct block_device *bdev)
244+
static inline loff_t bdev_nr_bytes(struct block_device *bdev)
245245
{
246-
return bdev_nr_bytes(bdev) >> SECTOR_SHIFT;
246+
return bdev_nr_sectors(bdev) << SECTOR_SHIFT;
247247
}
248248

249249
static inline sector_t get_capacity(struct gendisk *disk)

0 commit comments

Comments
 (0)