Lines Matching defs:wpipe

237 static int pipe_build_write_buffer(struct pipe *wpipe, struct uio *uio);
238 static void pipe_destroy_write_buffer(struct pipe *wpipe);
239 static int pipe_direct_write(struct pipe *wpipe, struct uio *uio);
240 static void pipe_clone_write_buffer(struct pipe *wpipe);
295 struct pipe *rpipe, *wpipe;
311 wpipe = &pp->pp_wpipe;
312 bzero(wpipe, sizeof(*wpipe));
313 wpipe->pipe_ctime = rpipe->pipe_ctime;
314 wpipe->pipe_atime = wpipe->pipe_mtime = rpipe->pipe_ctime;
316 rpipe->pipe_peer = wpipe;
318 wpipe->pipe_peer = rpipe;
319 wpipe->pipe_pair = pp;
327 wpipe->pipe_present = PIPE_ACTIVE;
368 struct pipe *rpipe, *wpipe;
382 wpipe = &pp->pp_wpipe;
386 knlist_init_mtx(&wpipe->pipe_sel.si_note, PIPE_MTX(wpipe));
395 error = pipe_create(wpipe, false);
411 wpipe->pipe_state |= PIPE_DIRECTOK;
416 knlist_destroy(&wpipe->pipe_sel.si_note);
476 struct pipe *rpipe, *wpipe;
484 wpipe = &pp->pp_wpipe;
488 pipeclose(wpipe);
510 pipeclose(wpipe);
514 finit(wf, fflags, DTYPE_PIPE, wpipe, &pipeops);
942 pipe_build_write_buffer(struct pipe *wpipe, struct uio *uio)
947 PIPE_LOCK_ASSERT(wpipe, MA_OWNED);
948 KASSERT((wpipe->pipe_state & PIPE_DIRECTW) == 0,
949 ("%s: PIPE_DIRECTW set on %p", __func__, wpipe));
950 KASSERT(wpipe->pipe_pages.cnt == 0,
951 ("%s: pipe map for %p contains residual data", __func__, wpipe));
953 if (uio->uio_iov->iov_len > wpipe->pipe_buffer.size)
954 size = wpipe->pipe_buffer.size;
958 wpipe->pipe_state |= PIPE_DIRECTW;
959 PIPE_UNLOCK(wpipe);
962 wpipe->pipe_pages.ms, PIPENPAGES);
963 PIPE_LOCK(wpipe);
965 wpipe->pipe_state &= ~PIPE_DIRECTW;
969 wpipe->pipe_pages.npages = i;
970 wpipe->pipe_pages.pos =
972 wpipe->pipe_pages.cnt = size;
989 pipe_destroy_write_buffer(struct pipe *wpipe)
992 PIPE_LOCK_ASSERT(wpipe, MA_OWNED);
993 KASSERT((wpipe->pipe_state & PIPE_DIRECTW) != 0,
994 ("%s: PIPE_DIRECTW not set on %p", __func__, wpipe));
995 KASSERT(wpipe->pipe_pages.cnt == 0,
996 ("%s: pipe map for %p contains residual data", __func__, wpipe));
998 wpipe->pipe_state &= ~PIPE_DIRECTW;
999 vm_page_unhold_pages(wpipe->pipe_pages.ms, wpipe->pipe_pages.npages);
1000 wpipe->pipe_pages.npages = 0;
1009 pipe_clone_write_buffer(struct pipe *wpipe)
1016 PIPE_LOCK_ASSERT(wpipe, MA_OWNED);
1017 KASSERT((wpipe->pipe_state & PIPE_DIRECTW) != 0,
1018 ("%s: PIPE_DIRECTW not set on %p", __func__, wpipe));
1020 size = wpipe->pipe_pages.cnt;
1021 pos = wpipe->pipe_pages.pos;
1022 wpipe->pipe_pages.cnt = 0;
1024 wpipe->pipe_buffer.in = size;
1025 wpipe->pipe_buffer.out = 0;
1026 wpipe->pipe_buffer.cnt = size;
1028 PIPE_UNLOCK(wpipe);
1029 iov.iov_base = wpipe->pipe_buffer.buffer;
1038 uiomove_fromphys(wpipe->pipe_pages.ms, pos, size, &uio);
1039 PIPE_LOCK(wpipe);
1040 pipe_destroy_write_buffer(wpipe);
1051 pipe_direct_write(struct pipe *wpipe, struct uio *uio)
1056 PIPE_LOCK_ASSERT(wpipe, MA_OWNED);
1057 if ((wpipe->pipe_state & PIPE_EOF) != 0) {
1061 if (wpipe->pipe_state & PIPE_DIRECTW) {
1062 if (wpipe->pipe_state & PIPE_WANTR) {
1063 wpipe->pipe_state &= ~PIPE_WANTR;
1064 wakeup(wpipe);
1066 pipeselwakeup(wpipe);
1067 wpipe->pipe_state |= PIPE_WANTW;
1068 pipeunlock(wpipe);
1069 error = msleep(wpipe, PIPE_MTX(wpipe),
1071 pipelock(wpipe, false);
1076 if (wpipe->pipe_buffer.cnt > 0) {
1077 if (wpipe->pipe_state & PIPE_WANTR) {
1078 wpipe->pipe_state &= ~PIPE_WANTR;
1079 wakeup(wpipe);
1081 pipeselwakeup(wpipe);
1082 wpipe->pipe_state |= PIPE_WANTW;
1083 pipeunlock(wpipe);
1084 error = msleep(wpipe, PIPE_MTX(wpipe),
1086 pipelock(wpipe, false);
1092 error = pipe_build_write_buffer(wpipe, uio);
1097 while (wpipe->pipe_pages.cnt != 0 &&
1098 (wpipe->pipe_state & PIPE_EOF) == 0) {
1099 if (wpipe->pipe_state & PIPE_WANTR) {
1100 wpipe->pipe_state &= ~PIPE_WANTR;
1101 wakeup(wpipe);
1103 pipeselwakeup(wpipe);
1104 wpipe->pipe_state |= PIPE_WANTW;
1105 pipeunlock(wpipe);
1106 error = msleep(wpipe, PIPE_MTX(wpipe), PRIBIO | PCATCH,
1108 pipelock(wpipe, false);
1113 if ((wpipe->pipe_state & PIPE_EOF) != 0) {
1114 wpipe->pipe_pages.cnt = 0;
1115 pipe_destroy_write_buffer(wpipe);
1116 pipeselwakeup(wpipe);
1119 pipe_clone_write_buffer(wpipe);
1121 pipe_destroy_write_buffer(wpipe);
1123 KASSERT((wpipe->pipe_state & PIPE_DIRECTW) == 0,
1124 ("pipe %p leaked PIPE_DIRECTW", wpipe));
1128 wakeup(wpipe);
1137 struct pipe *wpipe, *rpipe;
1142 wpipe = PIPE_PEER(rpipe);
1144 error = pipelock(wpipe, true);
1152 if (wpipe->pipe_present != PIPE_ACTIVE ||
1153 (wpipe->pipe_state & PIPE_EOF)) {
1154 pipeunlock(wpipe);
1159 error = mac_pipe_check_write(active_cred, wpipe->pipe_pair);
1161 pipeunlock(wpipe);
1166 ++wpipe->pipe_busy;
1169 desiredsize = max(SMALL_PIPE_SIZE, wpipe->pipe_buffer.size);
1170 while (desiredsize < wpipe->pipe_buffer.cnt + uio->uio_resid) {
1182 wpipe->pipe_buffer.size > SMALL_PIPE_SIZE &&
1183 wpipe->pipe_buffer.cnt <= SMALL_PIPE_SIZE &&
1188 if (desiredsize != wpipe->pipe_buffer.size &&
1189 (wpipe->pipe_state & PIPE_DIRECTW) == 0) {
1190 PIPE_UNLOCK(wpipe);
1191 pipespace(wpipe, desiredsize);
1192 PIPE_LOCK(wpipe);
1194 MPASS(wpipe->pipe_buffer.size != 0);
1201 if (wpipe->pipe_state & PIPE_EOF) {
1217 wpipe->pipe_buffer.size >= pipe_mindirect &&
1219 error = pipe_direct_write(wpipe, uio);
1233 if (wpipe->pipe_pages.cnt != 0) {
1234 if (wpipe->pipe_state & PIPE_WANTR) {
1235 wpipe->pipe_state &= ~PIPE_WANTR;
1236 wakeup(wpipe);
1238 pipeselwakeup(wpipe);
1239 wpipe->pipe_state |= PIPE_WANTW;
1240 pipeunlock(wpipe);
1241 error = msleep(wpipe, PIPE_MTX(rpipe), PRIBIO | PCATCH,
1243 pipelock(wpipe, false);
1249 space = wpipe->pipe_buffer.size - wpipe->pipe_buffer.cnt;
1274 segsize = wpipe->pipe_buffer.size -
1275 wpipe->pipe_buffer.in;
1282 error = uiomove(&wpipe->pipe_buffer.buffer[wpipe->pipe_buffer.in],
1287 KASSERT(wpipe->pipe_buffer.in + segsize ==
1288 wpipe->pipe_buffer.size,
1298 &wpipe->pipe_buffer.buffer[0],
1303 wpipe->pipe_buffer.in += size;
1304 if (wpipe->pipe_buffer.in >=
1305 wpipe->pipe_buffer.size) {
1306 KASSERT(wpipe->pipe_buffer.in ==
1308 wpipe->pipe_buffer.size,
1310 wpipe->pipe_buffer.in = size - segsize;
1313 wpipe->pipe_buffer.cnt += size;
1314 KASSERT(wpipe->pipe_buffer.cnt <=
1315 wpipe->pipe_buffer.size,
1325 if (wpipe->pipe_state & PIPE_WANTR) {
1326 wpipe->pipe_state &= ~PIPE_WANTR;
1327 wakeup(wpipe);
1342 pipeselwakeup(wpipe);
1344 wpipe->pipe_state |= PIPE_WANTW;
1345 pipeunlock(wpipe);
1346 error = msleep(wpipe, PIPE_MTX(rpipe),
1348 pipelock(wpipe, false);
1355 --wpipe->pipe_busy;
1357 if ((wpipe->pipe_busy == 0) && (wpipe->pipe_state & PIPE_WANT)) {
1358 wpipe->pipe_state &= ~(PIPE_WANT | PIPE_WANTR);
1359 wakeup(wpipe);
1360 } else if (wpipe->pipe_buffer.cnt > 0) {
1365 if (wpipe->pipe_state & PIPE_WANTR) {
1366 wpipe->pipe_state &= ~PIPE_WANTR;
1367 wakeup(wpipe);
1381 pipe_timestamp(&wpipe->pipe_mtime);
1387 if (wpipe->pipe_buffer.cnt)
1388 pipeselwakeup(wpipe);
1390 pipeunlock(wpipe);
1492 struct pipe *wpipe;
1500 wpipe = PIPE_PEER(rpipe);
1512 if (wpipe->pipe_present != PIPE_ACTIVE ||
1513 (wpipe->pipe_state & PIPE_EOF) ||
1514 ((wpipe->pipe_state & PIPE_DIRECTW) == 0 &&
1515 ((wpipe->pipe_buffer.size - wpipe->pipe_buffer.cnt) >= PIPE_BUF ||
1516 wpipe->pipe_buffer.size == 0)))
1529 if (wpipe->pipe_present != PIPE_ACTIVE ||
1530 (wpipe->pipe_state & PIPE_EOF))
1547 wpipe->pipe_present == PIPE_ACTIVE) {
1548 selrecord(td, &wpipe->pipe_sel);
1549 if (SEL_WAITING(&wpipe->pipe_sel))
1550 wpipe->pipe_state |= PIPE_SEL;
1862 struct pipe *wpipe = kn->kn_hook;
1868 if (wpipe->pipe_present == PIPE_ACTIVE ||
1869 (wpipe->pipe_type & PIPE_TYPE_NAMED) != 0) {
1870 PIPE_LOCK_ASSERT(wpipe, MA_OWNED);
1872 if (wpipe->pipe_state & PIPE_DIRECTW) {
1874 } else if (wpipe->pipe_buffer.size > 0) {
1875 kn->kn_data = wpipe->pipe_buffer.size -
1876 wpipe->pipe_buffer.cnt;
1882 if (wpipe->pipe_present != PIPE_ACTIVE ||
1883 (wpipe->pipe_state & PIPE_EOF)) {