On Fri, May 18, 2018 at 06:47:56PM +0200, Christoph Hellwig wrote: > Hi all, > > this series adds support for buffered I/O without buffer heads to > the iomap and XFS code. > > For now this series only contains support for block size == PAGE_SIZE, > with the 4k support split into a separate series. > > > A git tree is available at: > > git://git.infradead.org/users/hch/xfs.git xfs-iomap-read.2 > > Gitweb: > > http://git.infradead.org/users/hch/xfs.git/shortlog/refs/heads/xfs-iomap-read.2 Hmm, so I pulled this and ran my trivial stupid benchmark on for-next. It's a stupid VM with a 2G of RAM and a 12GB virtio-scsi disk backed by tmpfs: # mkfs.xfs -f -m rmapbt=0,reflink=1 /dev/sda meta-data=/dev/sda isize=512 agcount=4, agsize=823296 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=1 = reflink=1 data = bsize=4096 blocks=3293184, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=3693, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 # mount /dev/sda /mnt # xfs_io -f -c 'pwrite -W -S 0x64 -b 83886080 0 734003200' /mnt/a wrote 734003200/734003200 bytes at offset 0 700 MiB, 9 ops; 0:00:01.06 (655.500 MiB/sec and 8.4279 ops/sec) # cp --reflink=always /mnt/a /mnt/b # xfs_io -f -c 'pwrite -W -S 0x65 -b 83886080 0 734003200' /mnt/b wrote 734003200/734003200 bytes at offset 0 700 MiB, 9 ops; 0.9620 sec (727.615 MiB/sec and 9.3551 ops/sec) Then I applied your series (not including the blocksize < pagesize series) and saw this big regression: # mkfs.xfs -f -m rmapbt=0,reflink=1 /dev/sda meta-data=/dev/sda isize=512 agcount=4, agsize=823296 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=1 = reflink=1 data = bsize=4096 blocks=3293184, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0, ftype=1 log =internal log bsize=4096 blocks=3693, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 # mount /dev/sda /mnt # xfs_io -f -c 'pwrite -W -S 0x64 -b 83886080 0 734003200' /mnt/a wrote 734003200/734003200 bytes at offset 0 700 MiB, 9 ops; 0:00:08.04 (87.031 MiB/sec and 1.1190 ops/sec) # cp --reflink=always /mnt/a /mnt/b # xfs_io -f -c 'pwrite -W -S 0x65 -b 83886080 0 734003200' /mnt/b wrote 734003200/734003200 bytes at offset 0 700 MiB, 9 ops; 0:00:21.61 (32.389 MiB/sec and 0.4164 ops/sec) I'll see if I can spot the problem while I read through the v2 code... --D > > Changes since v1: > - fix the iomap_readpages error handling > - use unsigned file offsets in a few places to avoid arithmetic overflows > - allocate a iomap_page in iomap_page_mkwrite to fix generic/095 > - improve a few comments > - add more asserts > - warn about truncated block numbers from ->bmap > - new patch to change the __do_page_cache_readahead return value to > unsigned int > - remove an incorrectly added empty line > - make inline data an explicit iomap type instead of a flag > - add a IOMAP_F_BUFFER_HEAD flag to force use of buffers heads for gfs2, > and keep the basic buffer head infrastructure around for now.