Lines Matching refs:pipe

129 static void	pipeclose(struct pipe *);
130 static void pipe_free_kmem(struct pipe *);
131 static int pipe_create(struct pipe **, pool_cache_t, struct timespec *);
132 static int pipelock(struct pipe *, bool);
133 static inline void pipeunlock(struct pipe *);
134 static void pipeselwakeup(struct pipe *, struct pipe *, int);
135 static int pipespace(struct pipe *, int);
147 pipe_wr_cache = pool_cache_init(sizeof(struct pipe), 0, 0, 0, "pipewr", in pipe_init()
152 pipe_rd_cache = pool_cache_init(sizeof(struct pipe), 0, 0, 0, "piperd", in pipe_init()
160 struct pipe *pipe; in pipe_ctor() local
163 pipe = obj; in pipe_ctor()
165 memset(pipe, 0, sizeof(struct pipe)); in pipe_ctor()
171 pipe->pipe_kmem = va; in pipe_ctor()
174 cv_init(&pipe->pipe_rcv, "pipe_rd"); in pipe_ctor()
175 cv_init(&pipe->pipe_wcv, "pipe_wr"); in pipe_ctor()
176 cv_init(&pipe->pipe_draincv, "pipe_drn"); in pipe_ctor()
177 cv_init(&pipe->pipe_lkcv, "pipe_lk"); in pipe_ctor()
178 selinit(&pipe->pipe_sel); in pipe_ctor()
179 pipe->pipe_state = PIPE_SIGNALR; in pipe_ctor()
187 struct pipe *pipe; in pipe_dtor() local
189 pipe = obj; in pipe_dtor()
191 cv_destroy(&pipe->pipe_rcv); in pipe_dtor()
192 cv_destroy(&pipe->pipe_wcv); in pipe_dtor()
193 cv_destroy(&pipe->pipe_draincv); in pipe_dtor()
194 cv_destroy(&pipe->pipe_lkcv); in pipe_dtor()
195 seldestroy(&pipe->pipe_sel); in pipe_dtor()
196 if (pipe->pipe_kmem != 0) { in pipe_dtor()
197 uvm_km_free(kernel_map, pipe->pipe_kmem, PIPE_SIZE, in pipe_dtor()
209 struct pipe *rpipe, *wpipe; in pipe1()
272 pipespace(struct pipe *pipe, int size) in pipespace() argument
280 if (size == PIPE_SIZE && pipe->pipe_kmem != 0) { in pipespace()
281 buffer = (void *)pipe->pipe_kmem; in pipespace()
291 pipe_free_kmem(pipe); in pipespace()
292 pipe->pipe_buffer.buffer = buffer; in pipespace()
293 pipe->pipe_buffer.size = size; in pipespace()
294 pipe->pipe_buffer.in = 0; in pipespace()
295 pipe->pipe_buffer.out = 0; in pipespace()
296 pipe->pipe_buffer.cnt = 0; in pipespace()
304 pipe_create(struct pipe **pipep, pool_cache_t cache, struct timespec *nt) in pipe_create()
306 struct pipe *pipe; in pipe_create() local
309 pipe = pool_cache_get(cache, PR_WAITOK); in pipe_create()
310 KASSERT(pipe != NULL); in pipe_create()
311 *pipep = pipe; in pipe_create()
313 pipe->pipe_atime = pipe->pipe_mtime = pipe->pipe_btime = *nt; in pipe_create()
314 pipe->pipe_lock = NULL; in pipe_create()
316 error = pipespace(pipe, PIPE_SIZE); in pipe_create()
318 pipe->pipe_buffer.buffer = NULL; in pipe_create()
319 pipe->pipe_buffer.size = 0; in pipe_create()
320 pipe->pipe_buffer.in = 0; in pipe_create()
321 pipe->pipe_buffer.out = 0; in pipe_create()
322 pipe->pipe_buffer.cnt = 0; in pipe_create()
332 pipelock(struct pipe *pipe, bool catch_p) in pipelock() argument
336 KASSERT(mutex_owned(pipe->pipe_lock)); in pipelock()
338 while (pipe->pipe_state & PIPE_LOCKFL) { in pipelock()
340 error = cv_wait_sig(&pipe->pipe_lkcv, pipe->pipe_lock); in pipelock()
345 cv_wait(&pipe->pipe_lkcv, pipe->pipe_lock); in pipelock()
348 pipe->pipe_state |= PIPE_LOCKFL; in pipelock()
357 pipeunlock(struct pipe *pipe) in pipeunlock() argument
360 KASSERT(pipe->pipe_state & PIPE_LOCKFL); in pipeunlock()
362 pipe->pipe_state &= ~PIPE_LOCKFL; in pipeunlock()
363 cv_signal(&pipe->pipe_lkcv); in pipeunlock()
371 pipeselwakeup(struct pipe *selp, struct pipe *sigp, int code) in pipeselwakeup()
408 struct pipe *rpipe = fp->f_pipe; in pipe_read()
565 struct pipe *wpipe, *rpipe; in pipe_write()
756 struct pipe *pipe = fp->f_pipe; in pipe_ioctl() local
757 kmutex_t *lock = pipe->pipe_lock; in pipe_ioctl()
767 pipe->pipe_state |= PIPE_ASYNC; in pipe_ioctl()
769 pipe->pipe_state &= ~PIPE_ASYNC; in pipe_ioctl()
776 *(int *)data = pipe->pipe_buffer.cnt; in pipe_ioctl()
783 pipe = pipe->pipe_peer; in pipe_ioctl()
784 if (pipe == NULL) in pipe_ioctl()
787 *(int *)data = pipe->pipe_buffer.cnt; in pipe_ioctl()
794 pipe = pipe->pipe_peer; in pipe_ioctl()
795 if (pipe == NULL) in pipe_ioctl()
798 *(int *)data = pipe->pipe_buffer.size - in pipe_ioctl()
799 pipe->pipe_buffer.cnt; in pipe_ioctl()
805 return fsetown(&pipe->pipe_pgid, cmd, data); in pipe_ioctl()
809 return fgetown(pipe->pipe_pgid, cmd, data); in pipe_ioctl()
818 struct pipe *rpipe = fp->f_pipe; in pipe_poll()
819 struct pipe *wpipe; in pipe_poll()
862 struct pipe *pipe = fp->f_pipe; in pipe_stat() local
864 mutex_enter(pipe->pipe_lock); in pipe_stat()
867 ub->st_blksize = pipe->pipe_buffer.size; in pipe_stat()
868 if (ub->st_blksize == 0 && pipe->pipe_peer) in pipe_stat()
869 ub->st_blksize = pipe->pipe_peer->pipe_buffer.size; in pipe_stat()
870 ub->st_size = pipe->pipe_buffer.cnt; in pipe_stat()
872 ub->st_atimespec = pipe->pipe_atime; in pipe_stat()
873 ub->st_mtimespec = pipe->pipe_mtime; in pipe_stat()
874 ub->st_ctimespec = ub->st_birthtimespec = pipe->pipe_btime; in pipe_stat()
882 mutex_exit(pipe->pipe_lock); in pipe_stat()
889 struct pipe *pipe = fp->f_pipe; in pipe_close() local
892 pipeclose(pipe); in pipe_close()
899 struct pipe *pipe = fp->f_pipe; in pipe_restart() local
906 mutex_enter(pipe->pipe_lock); in pipe_restart()
907 pipe->pipe_state |= PIPE_RESTART; in pipe_restart()
910 cv_broadcast(&pipe->pipe_rcv); in pipe_restart()
911 cv_broadcast(&pipe->pipe_wcv); in pipe_restart()
912 mutex_exit(pipe->pipe_lock); in pipe_restart()
936 pipe_free_kmem(struct pipe *pipe) in pipe_free_kmem() argument
939 if (pipe->pipe_buffer.buffer != NULL) { in pipe_free_kmem()
940 if (pipe->pipe_buffer.size > PIPE_SIZE) { in pipe_free_kmem()
943 if (pipe->pipe_buffer.buffer != (void *)pipe->pipe_kmem) { in pipe_free_kmem()
945 (vaddr_t)pipe->pipe_buffer.buffer, in pipe_free_kmem()
946 pipe->pipe_buffer.size, UVM_KMF_PAGEABLE); in pipe_free_kmem()
948 -pipe->pipe_buffer.size); in pipe_free_kmem()
950 pipe->pipe_buffer.buffer = NULL; in pipe_free_kmem()
958 pipeclose(struct pipe *pipe) in pipeclose() argument
961 struct pipe *ppipe; in pipeclose()
963 if (pipe == NULL) in pipeclose()
966 KASSERT(cv_is_valid(&pipe->pipe_rcv)); in pipeclose()
967 KASSERT(cv_is_valid(&pipe->pipe_wcv)); in pipeclose()
968 KASSERT(cv_is_valid(&pipe->pipe_draincv)); in pipeclose()
969 KASSERT(cv_is_valid(&pipe->pipe_lkcv)); in pipeclose()
971 lock = pipe->pipe_lock; in pipeclose()
977 pipeselwakeup(pipe, pipe, POLL_HUP); in pipeclose()
983 pipe->pipe_state |= PIPE_EOF; in pipeclose()
984 if (pipe->pipe_busy) { in pipeclose()
985 while (pipe->pipe_busy) { in pipeclose()
986 cv_broadcast(&pipe->pipe_wcv); in pipeclose()
987 cv_wait_sig(&pipe->pipe_draincv, lock); in pipeclose()
994 if ((ppipe = pipe->pipe_peer) != NULL) { in pipeclose()
1008 SLIST_INIT(&pipe->pipe_sel.sel_klist); in pipeclose()
1010 KASSERT((pipe->pipe_state & PIPE_LOCKFL) == 0); in pipeclose()
1018 pipe->pipe_pgid = 0; in pipeclose()
1019 pipe->pipe_state = PIPE_SIGNALR; in pipeclose()
1020 pipe->pipe_peer = NULL; in pipeclose()
1021 pipe->pipe_lock = NULL; in pipeclose()
1022 pipe_free_kmem(pipe); in pipeclose()
1023 if (pipe->pipe_kmem != 0) { in pipeclose()
1024 pool_cache_put(pipe_rd_cache, pipe); in pipeclose()
1026 pool_cache_put(pipe_wr_cache, pipe); in pipeclose()
1033 struct pipe *pipe; in filt_pipedetach() local
1036 pipe = ((file_t *)kn->kn_obj)->f_pipe; in filt_pipedetach()
1037 lock = pipe->pipe_lock; in filt_pipedetach()
1044 pipe = pipe->pipe_peer; in filt_pipedetach()
1047 if (pipe == NULL) { in filt_pipedetach()
1058 KASSERT(kn->kn_hook == pipe); in filt_pipedetach()
1059 selremove_knote(&pipe->pipe_sel, kn); in filt_pipedetach()
1066 struct pipe *rpipe = ((file_t *)kn->kn_obj)->f_pipe; in filt_piperead()
1067 struct pipe *wpipe; in filt_piperead()
1093 struct pipe *rpipe = ((file_t *)kn->kn_obj)->f_pipe; in filt_pipewrite()
1094 struct pipe *wpipe; in filt_pipewrite()
1134 struct pipe *pipe; in pipe_kqfilter() local
1137 pipe = ((file_t *)kn->kn_obj)->f_pipe; in pipe_kqfilter()
1138 lock = pipe->pipe_lock; in pipe_kqfilter()
1148 pipe = pipe->pipe_peer; in pipe_kqfilter()
1149 if (pipe == NULL) { in pipe_kqfilter()
1160 kn->kn_hook = pipe; in pipe_kqfilter()
1161 selrecord_knote(&pipe->pipe_sel, kn); in pipe_kqfilter()