From: Miklos S. <mi...@sz...> - 2010-11-10 12:08:41
|
...fuse_bufvec based high level interfaces for read and write are now also in the git tree. A little background for those who haven't been following the development: people have been asking for zero copy interfaces for a long time. I didn't think it was quite as important as some believed, because memory copies are quite fast. The effect of memory copies is usually negligible compared to other bottlenecks. But in some cases it does make a difference, especially if CPU cycles and CPU cache is scarce. These new interfaces allow the number of memory copies to be reduced when transferring data to or from the kernel's file cache, and in some cases no copies are necessary. The interfaces themselves are generic and not tied to the method of data transfer. One such zero copy case is when data is transferred unchanged from a backing file to the fuse filesystem (such as the fusexmp* family of example filesystems). The fusexmp_fh filesystem has been modified to demonstrate the new interfaces. The other direction, when writing back file data to the backing file, does currently require a memory copy. This is not a limitation of the interface, but the implementation of fuse and the backing filesystem. Zero copy data transfer is implemented using the Linux specific splice(2) system call. To aid portability it is not necessary, and not recommended, to use this system call from filesystems. The new interfaces allow simple access to this functionality without having to worry about support in the operating system. Splice support on the fuse device is available in Linux kernels 2.6.36 and later. On earlier kernels fuse falls back to using read and write on the fuse device. The splice functionality can also be selectively turned off with mount options (no_splice_write, no_splice_move, no_splice_read). Note, that somewhat confusingly "no_splice_write" disables zero copy for reads while "no_splice_read" disables zero copy for writes. Comments, bug reports are welcome. Thanks, Miklos |