Skip to content

Commit

Permalink
[PATCH] splice: speedups and optimizations
Browse files Browse the repository at this point in the history
- 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: Jens Axboe <axboe@suse.de>
  • Loading branch information
Jens Axboe committed Apr 11, 2006
1 parent 923f4f2 commit 6f767b0
Showing 1 changed file with 13 additions and 20 deletions.
33 changes: 13 additions & 20 deletions fs/splice.c
Original file line number Diff line number Diff line change
Expand Up @@ -150,18 +150,15 @@ 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)
ret = -EPIPE;
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;
Expand All @@ -174,8 +171,9 @@ 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;
do_wakeup = 1;
pipe->nrbufs++;
if (pipe->inode)
do_wakeup = 1;

ret += this_len;
len -= this_len;
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -606,10 +601,10 @@ 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;
do_wakeup = 1;
pipe->curbuf = (pipe->curbuf + 1) & (PIPE_BUFFERS - 1);
pipe->nrbufs--;
if (pipe->inode)
do_wakeup = 1;
}

sd.pos += sd.len;
Expand All @@ -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;
Expand Down Expand Up @@ -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;

}
Expand Down

0 comments on commit 6f767b0

Please sign in to comment.