Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ext2: perform dax_device lookup at mount

The ->iomap_begin() operation is a hot path, so cache the
fs_dax_get_by_host() result at mount time to avoid the incurring the
hash lookup overhead on a per-i/o basis.

Cc: "Theodore Ts'o" <tytso@mit.edu>
Cc: Andreas Dilger <adilger.kernel@dilger.ca>
Reviewed-by: Jan Kara <jack@suse.cz>
Reported-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>

+8 -8
+1
fs/ext2/ext2.h
··· 114 114 */ 115 115 spinlock_t s_lock; 116 116 struct mb_cache *s_ea_block_cache; 117 + struct dax_device *s_daxdev; 117 118 }; 118 119 119 120 static inline spinlock_t *
+3 -8
fs/ext2/inode.c
··· 800 800 static int ext2_iomap_begin(struct inode *inode, loff_t offset, loff_t length, 801 801 unsigned flags, struct iomap *iomap) 802 802 { 803 - struct block_device *bdev; 804 803 unsigned int blkbits = inode->i_blkbits; 805 804 unsigned long first_block = offset >> blkbits; 806 805 unsigned long max_blocks = (length + (1 << blkbits) - 1) >> blkbits; 806 + struct ext2_sb_info *sbi = EXT2_SB(inode->i_sb); 807 807 bool new = false, boundary = false; 808 808 u32 bno; 809 809 int ret; ··· 814 814 return ret; 815 815 816 816 iomap->flags = 0; 817 - bdev = inode->i_sb->s_bdev; 818 - iomap->bdev = bdev; 817 + iomap->bdev = inode->i_sb->s_bdev; 819 818 iomap->offset = (u64)first_block << blkbits; 820 - if (blk_queue_dax(bdev->bd_queue)) 821 - iomap->dax_dev = fs_dax_get_by_host(bdev->bd_disk->disk_name); 822 - else 823 - iomap->dax_dev = NULL; 819 + iomap->dax_dev = sbi->s_daxdev; 824 820 825 821 if (ret == 0) { 826 822 iomap->type = IOMAP_HOLE; ··· 838 842 ext2_iomap_end(struct inode *inode, loff_t offset, loff_t length, 839 843 ssize_t written, unsigned flags, struct iomap *iomap) 840 844 { 841 - fs_put_dax(iomap->dax_dev); 842 845 if (iomap->type == IOMAP_MAPPED && 843 846 written < length && 844 847 (flags & IOMAP_WRITE))
+4
fs/ext2/super.c
··· 171 171 brelse (sbi->s_sbh); 172 172 sb->s_fs_info = NULL; 173 173 kfree(sbi->s_blockgroup_lock); 174 + fs_put_dax(sbi->s_daxdev); 174 175 kfree(sbi); 175 176 } 176 177 ··· 814 813 815 814 static int ext2_fill_super(struct super_block *sb, void *data, int silent) 816 815 { 816 + struct dax_device *dax_dev = fs_dax_get_by_bdev(sb->s_bdev); 817 817 struct buffer_head * bh; 818 818 struct ext2_sb_info * sbi; 819 819 struct ext2_super_block * es; ··· 844 842 } 845 843 sb->s_fs_info = sbi; 846 844 sbi->s_sb_block = sb_block; 845 + sbi->s_daxdev = dax_dev; 847 846 848 847 spin_lock_init(&sbi->s_lock); 849 848 ··· 1203 1200 kfree(sbi->s_blockgroup_lock); 1204 1201 kfree(sbi); 1205 1202 failed: 1203 + fs_put_dax(dax_dev); 1206 1204 return ret; 1207 1205 } 1208 1206