David Laight <David.Laight@xxxxxxxxxx> wrote: > > > Some measurements can be made using readv() and writev() > > > on /dev/zero and /dev/null. > > > > Forget /dev/null; that doesn't actually engage any iteration code. The same > > for writing to /dev/zero. Reading from /dev/zero does its own iteration thing > > rather than using iterate_and_advance(), presumably because it checks for > > signals and resched. > > Using /dev/null does exercise the 'copy iov from user' code. Ummm.... Not really: static ssize_t read_null(struct file *file, char __user *buf, size_t count, loff_t *ppos) { return 0; } static ssize_t write_null(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { return count; } static ssize_t read_iter_null(struct kiocb *iocb, struct iov_iter *to) { return 0; } static ssize_t write_iter_null(struct kiocb *iocb, struct iov_iter *from) { size_t count = iov_iter_count(from); iov_iter_advance(from, count); return count; } David