Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 162934de authored by Zach Brown's avatar Zach Brown Committed by Linus Torvalds
Browse files

char: add aio_{read,write} to /dev/{null,zero}



These are handy for measuring the cost of the aio infrastructure with
operations that do very little and complete immediately.

Signed-off-by: default avatarZach Brown <zab@redhat.com>
Signed-off-by: default avatarKent Overstreet <koverstreet@google.com>
Cc: Felipe Balbi <balbi@ti.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Mark Fasheh <mfasheh@suse.com>
Cc: Joel Becker <jlbec@evilplan.org>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Asai Thambi S P <asamymuthupa@micron.com>
Cc: Selvan Mani <smani@micron.com>
Cc: Sam Bradshaw <sbradshaw@micron.com>
Acked-by: default avatarJeff Moyer <jmoyer@redhat.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Benjamin LaHaise <bcrl@kvack.org>
Reviewed-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 41003a7b
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -627,6 +627,18 @@ static ssize_t write_null(struct file *file, const char __user *buf,
	return count;
}

static ssize_t aio_read_null(struct kiocb *iocb, const struct iovec *iov,
			     unsigned long nr_segs, loff_t pos)
{
	return 0;
}

static ssize_t aio_write_null(struct kiocb *iocb, const struct iovec *iov,
			      unsigned long nr_segs, loff_t pos)
{
	return iov_length(iov, nr_segs);
}

static int pipe_to_null(struct pipe_inode_info *info, struct pipe_buffer *buf,
			struct splice_desc *sd)
{
@@ -670,6 +682,24 @@ static ssize_t read_zero(struct file *file, char __user *buf,
	return written ? written : -EFAULT;
}

static ssize_t aio_read_zero(struct kiocb *iocb, const struct iovec *iov,
			     unsigned long nr_segs, loff_t pos)
{
	size_t written = 0;
	unsigned long i;
	ssize_t ret;

	for (i = 0; i < nr_segs; i++) {
		ret = read_zero(iocb->ki_filp, iov[i].iov_base, iov[i].iov_len,
				&pos);
		if (ret < 0)
			break;
		written += ret;
	}

	return written ? written : -EFAULT;
}

static int mmap_zero(struct file *file, struct vm_area_struct *vma)
{
#ifndef CONFIG_MMU
@@ -738,6 +768,7 @@ static int open_port(struct inode *inode, struct file *filp)
#define full_lseek      null_lseek
#define write_zero	write_null
#define read_full       read_zero
#define aio_write_zero	aio_write_null
#define open_mem	open_port
#define open_kmem	open_mem
#define open_oldmem	open_mem
@@ -766,6 +797,8 @@ static const struct file_operations null_fops = {
	.llseek		= null_lseek,
	.read		= read_null,
	.write		= write_null,
	.aio_read	= aio_read_null,
	.aio_write	= aio_write_null,
	.splice_write	= splice_write_null,
};

@@ -782,6 +815,8 @@ static const struct file_operations zero_fops = {
	.llseek		= zero_lseek,
	.read		= read_zero,
	.write		= write_zero,
	.aio_read	= aio_read_zero,
	.aio_write	= aio_write_zero,
	.mmap		= mmap_zero,
};