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

Commit 6f767b04 authored by Jens Axboe's avatar Jens Axboe
Browse files

[PATCH] splice: speedups and optimizations



- Kill the local variables that cache ->nrbufs, they just take up space.

- Only set do_wakeup for a real pipe. This is a big win for direct splicing.

- Kill i_mutex lock around ->f_pos update, regular io paths don't do this
  either.

Signed-off-by: default avatarJens Axboe <axboe@suse.de>
parent 923f4f23
Loading
Loading
Loading
Loading
+13 −20
Original line number Diff line number Diff line
@@ -150,8 +150,6 @@ static ssize_t move_to_pipe(struct pipe_inode_info *pipe, struct page **pages,
		mutex_lock(&pipe->inode->i_mutex);

	for (;;) {
		int bufs;

		if (!pipe->readers) {
			send_sig(SIGPIPE, current, 0);
			if (!ret)
@@ -159,9 +157,8 @@ static ssize_t move_to_pipe(struct pipe_inode_info *pipe, struct page **pages,
			break;
		}

		bufs = pipe->nrbufs;
		if (bufs < PIPE_BUFFERS) {
			int newbuf = (pipe->curbuf + bufs) & (PIPE_BUFFERS - 1);
		if (pipe->nrbufs < PIPE_BUFFERS) {
			int newbuf = (pipe->curbuf + pipe->nrbufs) & (PIPE_BUFFERS - 1);
			struct pipe_buffer *buf = pipe->bufs + newbuf;
			struct page *page = pages[i++];
			unsigned long this_len;
@@ -174,7 +171,8 @@ static ssize_t move_to_pipe(struct pipe_inode_info *pipe, struct page **pages,
			buf->offset = offset;
			buf->len = this_len;
			buf->ops = &page_cache_pipe_buf_ops;
			pipe->nrbufs = ++bufs;
			pipe->nrbufs++;
			if (pipe->inode)
				do_wakeup = 1;

			ret += this_len;
@@ -184,7 +182,7 @@ static ssize_t move_to_pipe(struct pipe_inode_info *pipe, struct page **pages,
				break;
			if (!len)
				break;
			if (bufs < PIPE_BUFFERS)
			if (pipe->nrbufs < PIPE_BUFFERS)
				continue;

			break;
@@ -581,11 +579,8 @@ static ssize_t move_from_pipe(struct pipe_inode_info *pipe, struct file *out,
		mutex_lock(&pipe->inode->i_mutex);

	for (;;) {
		int bufs = pipe->nrbufs;

		if (bufs) {
			int curbuf = pipe->curbuf;
			struct pipe_buffer *buf = pipe->bufs + curbuf;
		if (pipe->nrbufs) {
			struct pipe_buffer *buf = pipe->bufs + pipe->curbuf;
			struct pipe_buf_operations *ops = buf->ops;

			sd.len = buf->len;
@@ -606,9 +601,9 @@ static ssize_t move_from_pipe(struct pipe_inode_info *pipe, struct file *out,
			if (!buf->len) {
				buf->ops = NULL;
				ops->release(pipe, buf);
				curbuf = (curbuf + 1) & (PIPE_BUFFERS - 1);
				pipe->curbuf = curbuf;
				pipe->nrbufs = --bufs;
				pipe->curbuf = (pipe->curbuf + 1) & (PIPE_BUFFERS - 1);
				pipe->nrbufs--;
				if (pipe->inode)
					do_wakeup = 1;
			}

@@ -618,7 +613,7 @@ static ssize_t move_from_pipe(struct pipe_inode_info *pipe, struct file *out,
				break;
		}

		if (bufs)
		if (pipe->nrbufs)
			continue;
		if (!pipe->writers)
			break;
@@ -660,9 +655,7 @@ static ssize_t move_from_pipe(struct pipe_inode_info *pipe, struct file *out,
		kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);
	}

	mutex_lock(&out->f_mapping->host->i_mutex);
	out->f_pos = sd.pos;
	mutex_unlock(&out->f_mapping->host->i_mutex);
	return ret;

}