svn commit: r368038 - head/sys/kern
Mateusz Guzik
mjg at FreeBSD.org
Wed Nov 25 21:41:24 UTC 2020
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)) {
More information about the svn-src-head
mailing list