Author: mjg
Date: Wed Nov 25 21:41:23 2020
New Revision: 368038
URL: https://svnweb.freebsd.org/changeset/base/368038

Log:
  pipe: drop spurious pipeunlock/pipelock cycle on write

Modified:
  head/sys/kern/sys_pipe.c

Modified: head/sys/kern/sys_pipe.c
==============================================================================
--- head/sys/kern/sys_pipe.c    Wed Nov 25 21:25:17 2020        (r368037)
+++ head/sys/kern/sys_pipe.c    Wed Nov 25 21:41:23 2020        (r368038)
@@ -979,12 +979,8 @@ pipe_direct_write(struct pipe *wpipe, struct uio *uio)
 
 retry:
        PIPE_LOCK_ASSERT(wpipe, MA_OWNED);
-       error = pipelock(wpipe, 1);
-       if (error != 0)
-               goto error1;
        if ((wpipe->pipe_state & PIPE_EOF) != 0) {
                error = EPIPE;
-               pipeunlock(wpipe);
                goto error1;
        }
        if (wpipe->pipe_state & PIPE_DIRECTW) {
@@ -997,10 +993,9 @@ retry:
                pipeunlock(wpipe);
                error = msleep(wpipe, PIPE_MTX(wpipe),
                    PRIBIO | PCATCH, "pipdww", 0);
+               pipelock(wpipe, 0);
                if (error)
                        goto error1;
-               else
-                       goto retry;
        }
        if (wpipe->pipe_buffer.cnt > 0) {
                if (wpipe->pipe_state & PIPE_WANTR) {
@@ -1012,6 +1007,7 @@ retry:
                pipeunlock(wpipe);
                error = msleep(wpipe, PIPE_MTX(wpipe),
                    PRIBIO | PCATCH, "pipdwc", 0);
+               pipelock(wpipe, 0);
                if (error)
                        goto error1;
                else
@@ -1020,7 +1016,6 @@ retry:
 
        error = pipe_build_write_buffer(wpipe, uio);
        if (error) {
-               pipeunlock(wpipe);
                goto error1;
        }
 
@@ -1050,7 +1045,6 @@ retry:
        } else {
                pipe_destroy_write_buffer(wpipe);
        }
-       pipeunlock(wpipe);
        KASSERT((wpipe->pipe_state & PIPE_DIRECTW) == 0,
            ("pipe %p leaked PIPE_DIRECTW", wpipe));
        return (error);
@@ -1124,16 +1118,12 @@ pipe_write(struct file *fp, struct uio *uio, struct uc
        }
        MPASS(wpipe->pipe_buffer.size != 0);
 
-       pipeunlock(wpipe);
-
        orig_resid = uio->uio_resid;
 
        while (uio->uio_resid) {
                int space;
 
-               pipelock(wpipe, 0);
                if (wpipe->pipe_state & PIPE_EOF) {
-                       pipeunlock(wpipe);
                        error = EPIPE;
                        break;
                }
@@ -1151,7 +1141,6 @@ pipe_write(struct file *fp, struct uio *uio, struct uc
                    uio->uio_iov->iov_len >= PIPE_MINDIRECT &&
                    wpipe->pipe_buffer.size >= PIPE_MINDIRECT &&
                    (fp->f_flag & FNONBLOCK) == 0) {
-                       pipeunlock(wpipe);
                        error = pipe_direct_write(wpipe, uio);
                        if (error)
                                break;
@@ -1176,6 +1165,7 @@ pipe_write(struct file *fp, struct uio *uio, struct uc
                        pipeunlock(wpipe);
                        error = msleep(wpipe, PIPE_MTX(rpipe), PRIBIO | PCATCH,
                            "pipbww", 0);
+                       pipelock(wpipe, 0);
                        if (error)
                                break;
                        else
@@ -1251,7 +1241,6 @@ pipe_write(struct file *fp, struct uio *uio, struct uc
                                        wpipe->pipe_buffer.size,
                                        ("Pipe buffer overflow"));
                        }
-                       pipeunlock(wpipe);
                        if (error != 0)
                                break;
                } else {
@@ -1268,7 +1257,6 @@ pipe_write(struct file *fp, struct uio *uio, struct uc
                         */
                        if (fp->f_flag & FNONBLOCK) {
                                error = EAGAIN;
-                               pipeunlock(wpipe);
                                break;
                        }
 
@@ -1282,12 +1270,13 @@ pipe_write(struct file *fp, struct uio *uio, struct uc
                        pipeunlock(wpipe);
                        error = msleep(wpipe, PIPE_MTX(rpipe),
                            PRIBIO | PCATCH, "pipewr", 0);
+                       pipelock(wpipe, 0);
                        if (error != 0)
                                break;
+                       continue;
                }
        }
 
-       pipelock(wpipe, 0);
        --wpipe->pipe_busy;
 
        if ((wpipe->pipe_busy == 0) && (wpipe->pipe_state & PIPE_WANT)) {
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to