fs/splice: Use pipe_buf() helper to retrieve pipe buffer
authorK Prateek Nayak <kprateek.nayak@amd.com>
Fri, 7 Mar 2025 05:29:19 +0000 (05:29 +0000)
committerChristian Brauner <brauner@kernel.org>
Mon, 10 Mar 2025 07:55:05 +0000 (08:55 +0100)
Use pipe_buf() helper to retrieve the pipe buffer throughout the file
replacing the open-coded the logic.

Suggested-by: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: K Prateek Nayak <kprateek.nayak@amd.com>
Link: https://lore.kernel.org/r/20250307052919.34542-5-kprateek.nayak@amd.com
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/splice.c

index 23fa5561b9441969c0c998a377d5cd1b42942ea2..90d464241f151ce22c304526a71ada45015c3d13 100644 (file)
@@ -200,7 +200,6 @@ ssize_t splice_to_pipe(struct pipe_inode_info *pipe,
        unsigned int spd_pages = spd->nr_pages;
        unsigned int tail = pipe->tail;
        unsigned int head = pipe->head;
-       unsigned int mask = pipe->ring_size - 1;
        ssize_t ret = 0;
        int page_nr = 0;
 
@@ -214,7 +213,7 @@ ssize_t splice_to_pipe(struct pipe_inode_info *pipe,
        }
 
        while (!pipe_full(head, tail, pipe->max_usage)) {
-               struct pipe_buffer *buf = &pipe->bufs[head & mask];
+               struct pipe_buffer *buf = pipe_buf(pipe, head);
 
                buf->page = spd->pages[page_nr];
                buf->offset = spd->partial[page_nr].offset;
@@ -247,7 +246,6 @@ ssize_t add_to_pipe(struct pipe_inode_info *pipe, struct pipe_buffer *buf)
 {
        unsigned int head = pipe->head;
        unsigned int tail = pipe->tail;
-       unsigned int mask = pipe->ring_size - 1;
        int ret;
 
        if (unlikely(!pipe->readers)) {
@@ -256,7 +254,7 @@ ssize_t add_to_pipe(struct pipe_inode_info *pipe, struct pipe_buffer *buf)
        } else if (pipe_full(head, tail, pipe->max_usage)) {
                ret = -EAGAIN;
        } else {
-               pipe->bufs[head & mask] = *buf;
+               *pipe_buf(pipe, head) = *buf;
                pipe->head = head + 1;
                return buf->len;
        }
@@ -447,11 +445,10 @@ static int splice_from_pipe_feed(struct pipe_inode_info *pipe, struct splice_des
 {
        unsigned int head = pipe->head;
        unsigned int tail = pipe->tail;
-       unsigned int mask = pipe->ring_size - 1;
        int ret;
 
        while (!pipe_empty(head, tail)) {
-               struct pipe_buffer *buf = &pipe->bufs[tail & mask];
+               struct pipe_buffer *buf = pipe_buf(pipe, tail);
 
                sd->len = buf->len;
                if (sd->len > sd->total_len)
@@ -495,8 +492,7 @@ static int splice_from_pipe_feed(struct pipe_inode_info *pipe, struct splice_des
 static inline bool eat_empty_buffer(struct pipe_inode_info *pipe)
 {
        unsigned int tail = pipe->tail;
-       unsigned int mask = pipe->ring_size - 1;
-       struct pipe_buffer *buf = &pipe->bufs[tail & mask];
+       struct pipe_buffer *buf = pipe_buf(pipe, tail);
 
        if (unlikely(!buf->len)) {
                pipe_buf_release(pipe, buf);
@@ -690,7 +686,7 @@ iter_file_splice_write(struct pipe_inode_info *pipe, struct file *out,
        while (sd.total_len) {
                struct kiocb kiocb;
                struct iov_iter from;
-               unsigned int head, tail, mask;
+               unsigned int head, tail;
                size_t left;
                int n;
 
@@ -711,12 +707,11 @@ iter_file_splice_write(struct pipe_inode_info *pipe, struct file *out,
 
                head = pipe->head;
                tail = pipe->tail;
-               mask = pipe->ring_size - 1;
 
                /* build the vector */
                left = sd.total_len;
                for (n = 0; !pipe_empty(head, tail) && left && n < nbufs; tail++) {
-                       struct pipe_buffer *buf = &pipe->bufs[tail & mask];
+                       struct pipe_buffer *buf = pipe_buf(pipe, tail);
                        size_t this_len = buf->len;
 
                        /* zero-length bvecs are not supported, skip them */
@@ -752,7 +747,7 @@ iter_file_splice_write(struct pipe_inode_info *pipe, struct file *out,
                /* dismiss the fully eaten buffers, adjust the partial one */
                tail = pipe->tail;
                while (ret) {
-                       struct pipe_buffer *buf = &pipe->bufs[tail & mask];
+                       struct pipe_buffer *buf = pipe_buf(pipe, tail);
                        if (ret >= buf->len) {
                                ret -= buf->len;
                                buf->len = 0;
@@ -809,7 +804,7 @@ ssize_t splice_to_socket(struct pipe_inode_info *pipe, struct file *out,
        pipe_lock(pipe);
 
        while (len > 0) {
-               unsigned int head, tail, mask, bc = 0;
+               unsigned int head, tail, bc = 0;
                size_t remain = len;
 
                /*
@@ -846,10 +841,9 @@ ssize_t splice_to_socket(struct pipe_inode_info *pipe, struct file *out,
 
                head = pipe->head;
                tail = pipe->tail;
-               mask = pipe->ring_size - 1;
 
                while (!pipe_empty(head, tail)) {
-                       struct pipe_buffer *buf = &pipe->bufs[tail & mask];
+                       struct pipe_buffer *buf = pipe_buf(pipe, tail);
                        size_t seg;
 
                        if (!buf->len) {
@@ -894,7 +888,7 @@ ssize_t splice_to_socket(struct pipe_inode_info *pipe, struct file *out,
                len -= ret;
                tail = pipe->tail;
                while (ret > 0) {
-                       struct pipe_buffer *buf = &pipe->bufs[tail & mask];
+                       struct pipe_buffer *buf = pipe_buf(pipe, tail);
                        size_t seg = min_t(size_t, ret, buf->len);
 
                        buf->offset += seg;
@@ -1725,7 +1719,6 @@ static int splice_pipe_to_pipe(struct pipe_inode_info *ipipe,
        struct pipe_buffer *ibuf, *obuf;
        unsigned int i_head, o_head;
        unsigned int i_tail, o_tail;
-       unsigned int i_mask, o_mask;
        int ret = 0;
        bool input_wakeup = false;
 
@@ -1747,9 +1740,7 @@ retry:
        pipe_double_lock(ipipe, opipe);
 
        i_tail = ipipe->tail;
-       i_mask = ipipe->ring_size - 1;
        o_head = opipe->head;
-       o_mask = opipe->ring_size - 1;
 
        do {
                size_t o_len;
@@ -1792,8 +1783,8 @@ retry:
                        goto retry;
                }
 
-               ibuf = &ipipe->bufs[i_tail & i_mask];
-               obuf = &opipe->bufs[o_head & o_mask];
+               ibuf = pipe_buf(ipipe, i_tail);
+               obuf = pipe_buf(opipe, o_head);
 
                if (len >= ibuf->len) {
                        /*
@@ -1862,7 +1853,6 @@ static ssize_t link_pipe(struct pipe_inode_info *ipipe,
        struct pipe_buffer *ibuf, *obuf;
        unsigned int i_head, o_head;
        unsigned int i_tail, o_tail;
-       unsigned int i_mask, o_mask;
        ssize_t ret = 0;
 
        /*
@@ -1873,9 +1863,7 @@ static ssize_t link_pipe(struct pipe_inode_info *ipipe,
        pipe_double_lock(ipipe, opipe);
 
        i_tail = ipipe->tail;
-       i_mask = ipipe->ring_size - 1;
        o_head = opipe->head;
-       o_mask = opipe->ring_size - 1;
 
        do {
                if (!opipe->readers) {
@@ -1896,8 +1884,8 @@ static ssize_t link_pipe(struct pipe_inode_info *ipipe,
                    pipe_full(o_head, o_tail, opipe->max_usage))
                        break;
 
-               ibuf = &ipipe->bufs[i_tail & i_mask];
-               obuf = &opipe->bufs[o_head & o_mask];
+               ibuf = pipe_buf(ipipe, i_tail);
+               obuf = pipe_buf(opipe, o_head);
 
                /*
                 * Get a reference to this pipe buffer,