• Home
  • Raw
  • Download

Lines Matching full:pipe

3  *  linux/fs/pipe.c
33 * The max size that a non-root user is allowed to grow the pipe. Can
34 * be set by root in /proc/sys/fs/pipe-max-size
59 static void pipe_lock_nested(struct pipe_inode_info *pipe, int subclass) in pipe_lock_nested() argument
61 if (pipe->files) in pipe_lock_nested()
62 mutex_lock_nested(&pipe->mutex, subclass); in pipe_lock_nested()
65 void pipe_lock(struct pipe_inode_info *pipe) in pipe_lock() argument
68 * pipe_lock() nests non-pipe inode locks (for writing to a file) in pipe_lock()
70 pipe_lock_nested(pipe, I_MUTEX_PARENT); in pipe_lock()
74 void pipe_unlock(struct pipe_inode_info *pipe) in pipe_unlock() argument
76 if (pipe->files) in pipe_unlock()
77 mutex_unlock(&pipe->mutex); in pipe_unlock()
81 static inline void __pipe_lock(struct pipe_inode_info *pipe) in __pipe_lock() argument
83 mutex_lock_nested(&pipe->mutex, I_MUTEX_PARENT); in __pipe_lock()
86 static inline void __pipe_unlock(struct pipe_inode_info *pipe) in __pipe_unlock() argument
88 mutex_unlock(&pipe->mutex); in __pipe_unlock()
105 /* Drop the inode semaphore and wait for a pipe event, atomically */
106 void pipe_wait(struct pipe_inode_info *pipe) in pipe_wait() argument
114 prepare_to_wait(&pipe->wait, &wait, TASK_INTERRUPTIBLE); in pipe_wait()
115 pipe_unlock(pipe); in pipe_wait()
117 finish_wait(&pipe->wait, &wait); in pipe_wait()
118 pipe_lock(pipe); in pipe_wait()
121 static void anon_pipe_buf_release(struct pipe_inode_info *pipe, in anon_pipe_buf_release() argument
131 if (page_count(page) == 1 && !pipe->tmp_page) in anon_pipe_buf_release()
132 pipe->tmp_page = page; in anon_pipe_buf_release()
137 static int anon_pipe_buf_steal(struct pipe_inode_info *pipe, in anon_pipe_buf_steal() argument
153 * @pipe: the pipe that the buffer belongs to
163 int generic_pipe_buf_steal(struct pipe_inode_info *pipe, in generic_pipe_buf_steal() argument
184 * @pipe: the pipe that the buffer belongs to
190 * pipe into another.
192 bool generic_pipe_buf_get(struct pipe_inode_info *pipe, struct pipe_buffer *buf) in generic_pipe_buf_get() argument
199 * generic_pipe_buf_confirm - verify contents of the pipe buffer
200 * @info: the pipe that the buffer belongs to
204 * This function does nothing, because the generic pipe code uses
205 * pages that are always good when inserted into the pipe.
216 * @pipe: the pipe that the buffer belongs to
222 void generic_pipe_buf_release(struct pipe_inode_info *pipe, in generic_pipe_buf_release() argument
264 struct pipe_inode_info *pipe = filp->private_data; in pipe_read() local
274 __pipe_lock(pipe); in pipe_read()
276 int bufs = pipe->nrbufs; in pipe_read()
278 int curbuf = pipe->curbuf; in pipe_read()
279 struct pipe_buffer *buf = pipe->bufs + curbuf; in pipe_read()
287 error = pipe_buf_confirm(pipe, buf); in pipe_read()
311 pipe_buf_release(pipe, buf); in pipe_read()
312 curbuf = (curbuf + 1) & (pipe->buffers - 1); in pipe_read()
313 pipe->curbuf = curbuf; in pipe_read()
314 pipe->nrbufs = --bufs; in pipe_read()
323 if (!pipe->writers) in pipe_read()
325 if (!pipe->waiting_writers) { in pipe_read()
344 wake_up_interruptible_sync_poll(&pipe->wait, EPOLLOUT | EPOLLWRNORM); in pipe_read()
345 kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); in pipe_read()
347 pipe_wait(pipe); in pipe_read()
349 __pipe_unlock(pipe); in pipe_read()
353 wake_up_interruptible_sync_poll(&pipe->wait, EPOLLOUT | EPOLLWRNORM); in pipe_read()
354 kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); in pipe_read()
370 struct pipe_inode_info *pipe = filp->private_data; in pipe_write() local
380 __pipe_lock(pipe); in pipe_write()
382 if (!pipe->readers) { in pipe_write()
390 if (pipe->nrbufs && chars != 0) { in pipe_write()
391 int lastbuf = (pipe->curbuf + pipe->nrbufs - 1) & in pipe_write()
392 (pipe->buffers - 1); in pipe_write()
393 struct pipe_buffer *buf = pipe->bufs + lastbuf; in pipe_write()
397 ret = pipe_buf_confirm(pipe, buf); in pipe_write()
416 if (!pipe->readers) { in pipe_write()
422 bufs = pipe->nrbufs; in pipe_write()
423 if (bufs < pipe->buffers) { in pipe_write()
424 int newbuf = (pipe->curbuf + bufs) & (pipe->buffers-1); in pipe_write()
425 struct pipe_buffer *buf = pipe->bufs + newbuf; in pipe_write()
426 struct page *page = pipe->tmp_page; in pipe_write()
435 pipe->tmp_page = page; in pipe_write()
461 pipe->nrbufs = ++bufs; in pipe_write()
462 pipe->tmp_page = NULL; in pipe_write()
467 if (bufs < pipe->buffers) in pipe_write()
480 wake_up_interruptible_sync_poll(&pipe->wait, EPOLLIN | EPOLLRDNORM); in pipe_write()
481 kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); in pipe_write()
484 pipe->waiting_writers++; in pipe_write()
485 pipe_wait(pipe); in pipe_write()
486 pipe->waiting_writers--; in pipe_write()
489 __pipe_unlock(pipe); in pipe_write()
491 wake_up_interruptible_sync_poll(&pipe->wait, EPOLLIN | EPOLLRDNORM); in pipe_write()
492 kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); in pipe_write()
505 struct pipe_inode_info *pipe = filp->private_data; in pipe_ioctl() local
510 __pipe_lock(pipe); in pipe_ioctl()
512 buf = pipe->curbuf; in pipe_ioctl()
513 nrbufs = pipe->nrbufs; in pipe_ioctl()
515 count += pipe->bufs[buf].len; in pipe_ioctl()
516 buf = (buf+1) & (pipe->buffers - 1); in pipe_ioctl()
518 __pipe_unlock(pipe); in pipe_ioctl()
531 struct pipe_inode_info *pipe = filp->private_data; in pipe_poll() local
534 poll_wait(filp, &pipe->wait, wait); in pipe_poll()
537 nrbufs = pipe->nrbufs; in pipe_poll()
541 if (!pipe->writers && filp->f_version != pipe->w_counter) in pipe_poll()
546 mask |= (nrbufs < pipe->buffers) ? EPOLLOUT | EPOLLWRNORM : 0; in pipe_poll()
551 if (!pipe->readers) in pipe_poll()
558 static void put_pipe_info(struct inode *inode, struct pipe_inode_info *pipe) in put_pipe_info() argument
563 if (!--pipe->files) { in put_pipe_info()
570 free_pipe_info(pipe); in put_pipe_info()
576 struct pipe_inode_info *pipe = file->private_data; in pipe_release() local
578 __pipe_lock(pipe); in pipe_release()
580 pipe->readers--; in pipe_release()
582 pipe->writers--; in pipe_release()
584 if (pipe->readers || pipe->writers) { in pipe_release()
585 …wake_up_interruptible_sync_poll(&pipe->wait, EPOLLIN | EPOLLOUT | EPOLLRDNORM | EPOLLWRNORM | EPOL… in pipe_release()
586 kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); in pipe_release()
587 kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); in pipe_release()
589 __pipe_unlock(pipe); in pipe_release()
591 put_pipe_info(inode, pipe); in pipe_release()
598 struct pipe_inode_info *pipe = filp->private_data; in pipe_fasync() local
601 __pipe_lock(pipe); in pipe_fasync()
603 retval = fasync_helper(fd, filp, on, &pipe->fasync_readers); in pipe_fasync()
605 retval = fasync_helper(fd, filp, on, &pipe->fasync_writers); in pipe_fasync()
608 fasync_helper(-1, filp, 0, &pipe->fasync_readers); in pipe_fasync()
610 __pipe_unlock(pipe); in pipe_fasync()
641 struct pipe_inode_info *pipe; in alloc_pipe_info() local
647 pipe = kzalloc(sizeof(struct pipe_inode_info), GFP_KERNEL_ACCOUNT); in alloc_pipe_info()
648 if (pipe == NULL) in alloc_pipe_info()
664 pipe->bufs = kcalloc(pipe_bufs, sizeof(struct pipe_buffer), in alloc_pipe_info()
667 if (pipe->bufs) { in alloc_pipe_info()
668 init_waitqueue_head(&pipe->wait); in alloc_pipe_info()
669 pipe->r_counter = pipe->w_counter = 1; in alloc_pipe_info()
670 pipe->buffers = pipe_bufs; in alloc_pipe_info()
671 pipe->user = user; in alloc_pipe_info()
672 mutex_init(&pipe->mutex); in alloc_pipe_info()
673 return pipe; in alloc_pipe_info()
678 kfree(pipe); in alloc_pipe_info()
684 void free_pipe_info(struct pipe_inode_info *pipe) in free_pipe_info() argument
688 (void) account_pipe_buffers(pipe->user, pipe->buffers, 0); in free_pipe_info()
689 free_uid(pipe->user); in free_pipe_info()
690 for (i = 0; i < pipe->buffers; i++) { in free_pipe_info()
691 struct pipe_buffer *buf = pipe->bufs + i; in free_pipe_info()
693 pipe_buf_release(pipe, buf); in free_pipe_info()
695 if (pipe->tmp_page) in free_pipe_info()
696 __free_page(pipe->tmp_page); in free_pipe_info()
697 kfree(pipe->bufs); in free_pipe_info()
698 kfree(pipe); in free_pipe_info()
708 return dynamic_dname(dentry, buffer, buflen, "pipe:[%lu]", in pipefs_dname()
719 struct pipe_inode_info *pipe; in get_pipe_inode() local
726 pipe = alloc_pipe_info(); in get_pipe_inode()
727 if (!pipe) in get_pipe_inode()
730 inode->i_pipe = pipe; in get_pipe_inode()
731 pipe->files = 2; in get_pipe_inode()
732 pipe->readers = pipe->writers = 1; in get_pipe_inode()
835 * a pipe. It's not the way Unix traditionally does this, though.
864 SYSCALL_DEFINE1(pipe, int __user *, fildes) in SYSCALL_DEFINE1() argument
869 static int wait_for_partner(struct pipe_inode_info *pipe, unsigned int *cnt) in wait_for_partner() argument
874 pipe_wait(pipe); in wait_for_partner()
881 static void wake_up_partner(struct pipe_inode_info *pipe) in wake_up_partner() argument
883 wake_up_interruptible(&pipe->wait); in wake_up_partner()
888 struct pipe_inode_info *pipe; in fifo_open() local
896 pipe = inode->i_pipe; in fifo_open()
897 pipe->files++; in fifo_open()
901 pipe = alloc_pipe_info(); in fifo_open()
902 if (!pipe) in fifo_open()
904 pipe->files = 1; in fifo_open()
909 free_pipe_info(pipe); in fifo_open()
910 pipe = inode->i_pipe; in fifo_open()
912 inode->i_pipe = pipe; in fifo_open()
916 filp->private_data = pipe; in fifo_open()
917 /* OK, we have a pipe and it's pinned down */ in fifo_open()
919 __pipe_lock(pipe); in fifo_open()
931 pipe->r_counter++; in fifo_open()
932 if (pipe->readers++ == 0) in fifo_open()
933 wake_up_partner(pipe); in fifo_open()
935 if (!is_pipe && !pipe->writers) { in fifo_open()
939 filp->f_version = pipe->w_counter; in fifo_open()
941 if (wait_for_partner(pipe, &pipe->w_counter)) in fifo_open()
954 if (!is_pipe && (filp->f_flags & O_NONBLOCK) && !pipe->readers) in fifo_open()
957 pipe->w_counter++; in fifo_open()
958 if (!pipe->writers++) in fifo_open()
959 wake_up_partner(pipe); in fifo_open()
961 if (!is_pipe && !pipe->readers) { in fifo_open()
962 if (wait_for_partner(pipe, &pipe->r_counter)) in fifo_open()
975 pipe->readers++; in fifo_open()
976 pipe->writers++; in fifo_open()
977 pipe->r_counter++; in fifo_open()
978 pipe->w_counter++; in fifo_open()
979 if (pipe->readers == 1 || pipe->writers == 1) in fifo_open()
980 wake_up_partner(pipe); in fifo_open()
989 __pipe_unlock(pipe); in fifo_open()
993 if (!--pipe->readers) in fifo_open()
994 wake_up_interruptible(&pipe->wait); in fifo_open()
999 if (!--pipe->writers) in fifo_open()
1000 wake_up_interruptible(&pipe->wait); in fifo_open()
1005 __pipe_unlock(pipe); in fifo_open()
1007 put_pipe_info(inode, pipe); in fifo_open()
1023 * Currently we rely on the pipe array holding a power-of-2 number
1031 /* Minimum pipe size, as required by POSIX */ in round_pipe_size()
1039 * Allocate a new array of pipe buffers and copy the info over. Returns the
1040 * pipe size if successful, or return -ERROR on error.
1042 static long pipe_set_size(struct pipe_inode_info *pipe, unsigned long arg) in pipe_set_size() argument
1056 * If trying to increase the pipe capacity, check that an in pipe_set_size()
1059 * Decreasing the pipe capacity is always permitted, even in pipe_set_size()
1062 if (nr_pages > pipe->buffers && in pipe_set_size()
1066 user_bufs = account_pipe_buffers(pipe->user, pipe->buffers, nr_pages); in pipe_set_size()
1068 if (nr_pages > pipe->buffers && in pipe_set_size()
1077 * We can shrink the pipe, if arg >= pipe->nrbufs. Since we don't in pipe_set_size()
1079 * again like we would do for growing. If the pipe currently in pipe_set_size()
1082 if (nr_pages < pipe->nrbufs) { in pipe_set_size()
1095 * The pipe array wraps around, so just start the new one at zero in pipe_set_size()
1098 if (pipe->nrbufs) { in pipe_set_size()
1102 tail = pipe->curbuf + pipe->nrbufs; in pipe_set_size()
1103 if (tail < pipe->buffers) in pipe_set_size()
1106 tail &= (pipe->buffers - 1); in pipe_set_size()
1108 head = pipe->nrbufs - tail; in pipe_set_size()
1110 memcpy(bufs, pipe->bufs + pipe->curbuf, head * sizeof(struct pipe_buffer)); in pipe_set_size()
1112 memcpy(bufs + head, pipe->bufs, tail * sizeof(struct pipe_buffer)); in pipe_set_size()
1115 pipe->curbuf = 0; in pipe_set_size()
1116 kfree(pipe->bufs); in pipe_set_size()
1117 pipe->bufs = bufs; in pipe_set_size()
1118 pipe->buffers = nr_pages; in pipe_set_size()
1122 (void) account_pipe_buffers(pipe->user, nr_pages, pipe->buffers); in pipe_set_size()
1129 * pipe.
1138 struct pipe_inode_info *pipe; in pipe_fcntl() local
1141 pipe = get_pipe_info(file); in pipe_fcntl()
1142 if (!pipe) in pipe_fcntl()
1145 __pipe_lock(pipe); in pipe_fcntl()
1149 ret = pipe_set_size(pipe, arg); in pipe_fcntl()
1152 ret = pipe->buffers * PAGE_SIZE; in pipe_fcntl()
1159 __pipe_unlock(pipe); in pipe_fcntl()
1172 * d_name - pipe: will go nicely and kill the special-casing in procfs.
1177 return mount_pseudo(fs_type, "pipe:", &pipefs_ops, in pipefs_mount()