Lines Matching refs:pipe
60 static void pipe_lock_nested(struct pipe_inode_info *pipe, int subclass) in pipe_lock_nested() argument
62 if (pipe->files) in pipe_lock_nested()
63 mutex_lock_nested(&pipe->mutex, subclass); in pipe_lock_nested()
66 void pipe_lock(struct pipe_inode_info *pipe) in pipe_lock() argument
71 pipe_lock_nested(pipe, I_MUTEX_PARENT); in pipe_lock()
75 void pipe_unlock(struct pipe_inode_info *pipe) in pipe_unlock() argument
77 if (pipe->files) in pipe_unlock()
78 mutex_unlock(&pipe->mutex); in pipe_unlock()
82 static inline void __pipe_lock(struct pipe_inode_info *pipe) in __pipe_lock() argument
84 mutex_lock_nested(&pipe->mutex, I_MUTEX_PARENT); in __pipe_lock()
87 static inline void __pipe_unlock(struct pipe_inode_info *pipe) in __pipe_unlock() argument
89 mutex_unlock(&pipe->mutex); in __pipe_unlock()
107 void pipe_wait(struct pipe_inode_info *pipe) in pipe_wait() argument
115 prepare_to_wait(&pipe->wait, &wait, TASK_INTERRUPTIBLE); in pipe_wait()
116 pipe_unlock(pipe); in pipe_wait()
118 finish_wait(&pipe->wait, &wait); in pipe_wait()
119 pipe_lock(pipe); in pipe_wait()
122 static void anon_pipe_buf_release(struct pipe_inode_info *pipe, in anon_pipe_buf_release() argument
132 if (page_count(page) == 1 && !pipe->tmp_page) in anon_pipe_buf_release()
133 pipe->tmp_page = page; in anon_pipe_buf_release()
138 static int anon_pipe_buf_steal(struct pipe_inode_info *pipe, in anon_pipe_buf_steal() argument
163 int generic_pipe_buf_steal(struct pipe_inode_info *pipe, in generic_pipe_buf_steal() argument
192 bool generic_pipe_buf_get(struct pipe_inode_info *pipe, struct pipe_buffer *buf) in generic_pipe_buf_get() argument
222 void generic_pipe_buf_release(struct pipe_inode_info *pipe, in generic_pipe_buf_release() argument
276 struct pipe_inode_info *pipe = filp->private_data; in pipe_read() local
286 __pipe_lock(pipe); in pipe_read()
288 int bufs = pipe->nrbufs; in pipe_read()
290 int curbuf = pipe->curbuf; in pipe_read()
291 struct pipe_buffer *buf = pipe->bufs + curbuf; in pipe_read()
299 error = pipe_buf_confirm(pipe, buf); in pipe_read()
323 pipe_buf_release(pipe, buf); in pipe_read()
324 curbuf = (curbuf + 1) & (pipe->buffers - 1); in pipe_read()
325 pipe->curbuf = curbuf; in pipe_read()
326 pipe->nrbufs = --bufs; in pipe_read()
335 if (!pipe->writers) in pipe_read()
337 if (!pipe->waiting_writers) { in pipe_read()
356 wake_up_interruptible_sync_poll(&pipe->wait, EPOLLOUT | EPOLLWRNORM); in pipe_read()
357 kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); in pipe_read()
359 pipe_wait(pipe); in pipe_read()
361 __pipe_unlock(pipe); in pipe_read()
365 wake_up_interruptible_sync_poll(&pipe->wait, EPOLLOUT | EPOLLWRNORM); in pipe_read()
366 kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); in pipe_read()
382 struct pipe_inode_info *pipe = filp->private_data; in pipe_write() local
392 __pipe_lock(pipe); in pipe_write()
394 if (!pipe->readers) { in pipe_write()
402 if (pipe->nrbufs && chars != 0) { in pipe_write()
403 int lastbuf = (pipe->curbuf + pipe->nrbufs - 1) & in pipe_write()
404 (pipe->buffers - 1); in pipe_write()
405 struct pipe_buffer *buf = pipe->bufs + lastbuf; in pipe_write()
409 ret = pipe_buf_confirm(pipe, buf); in pipe_write()
428 if (!pipe->readers) { in pipe_write()
434 bufs = pipe->nrbufs; in pipe_write()
435 if (bufs < pipe->buffers) { in pipe_write()
436 int newbuf = (pipe->curbuf + bufs) & (pipe->buffers-1); in pipe_write()
437 struct pipe_buffer *buf = pipe->bufs + newbuf; in pipe_write()
438 struct page *page = pipe->tmp_page; in pipe_write()
447 pipe->tmp_page = page; in pipe_write()
473 pipe->nrbufs = ++bufs; in pipe_write()
474 pipe->tmp_page = NULL; in pipe_write()
479 if (bufs < pipe->buffers) in pipe_write()
492 wake_up_interruptible_sync_poll(&pipe->wait, EPOLLIN | EPOLLRDNORM); in pipe_write()
493 kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); in pipe_write()
496 pipe->waiting_writers++; in pipe_write()
497 pipe_wait(pipe); in pipe_write()
498 pipe->waiting_writers--; in pipe_write()
501 __pipe_unlock(pipe); in pipe_write()
503 wake_up_interruptible_sync_poll(&pipe->wait, EPOLLIN | EPOLLRDNORM); in pipe_write()
504 kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); in pipe_write()
517 struct pipe_inode_info *pipe = filp->private_data; in pipe_ioctl() local
522 __pipe_lock(pipe); in pipe_ioctl()
524 buf = pipe->curbuf; in pipe_ioctl()
525 nrbufs = pipe->nrbufs; in pipe_ioctl()
527 count += pipe->bufs[buf].len; in pipe_ioctl()
528 buf = (buf+1) & (pipe->buffers - 1); in pipe_ioctl()
530 __pipe_unlock(pipe); in pipe_ioctl()
543 struct pipe_inode_info *pipe = filp->private_data; in pipe_poll() local
546 poll_wait(filp, &pipe->wait, wait); in pipe_poll()
549 nrbufs = pipe->nrbufs; in pipe_poll()
553 if (!pipe->writers && filp->f_version != pipe->w_counter) in pipe_poll()
558 mask |= (nrbufs < pipe->buffers) ? EPOLLOUT | EPOLLWRNORM : 0; in pipe_poll()
563 if (!pipe->readers) in pipe_poll()
570 static void put_pipe_info(struct inode *inode, struct pipe_inode_info *pipe) in put_pipe_info() argument
575 if (!--pipe->files) { in put_pipe_info()
582 free_pipe_info(pipe); in put_pipe_info()
588 struct pipe_inode_info *pipe = file->private_data; in pipe_release() local
590 __pipe_lock(pipe); in pipe_release()
592 pipe->readers--; in pipe_release()
594 pipe->writers--; in pipe_release()
596 if (pipe->readers || pipe->writers) { in pipe_release()
597 …wake_up_interruptible_sync_poll(&pipe->wait, EPOLLIN | EPOLLOUT | EPOLLRDNORM | EPOLLWRNORM | EPOL… in pipe_release()
598 kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); in pipe_release()
599 kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); in pipe_release()
601 __pipe_unlock(pipe); in pipe_release()
603 put_pipe_info(inode, pipe); in pipe_release()
610 struct pipe_inode_info *pipe = filp->private_data; in pipe_fasync() local
613 __pipe_lock(pipe); in pipe_fasync()
615 retval = fasync_helper(fd, filp, on, &pipe->fasync_readers); in pipe_fasync()
617 retval = fasync_helper(fd, filp, on, &pipe->fasync_writers); in pipe_fasync()
620 fasync_helper(-1, filp, 0, &pipe->fasync_readers); in pipe_fasync()
622 __pipe_unlock(pipe); in pipe_fasync()
653 struct pipe_inode_info *pipe; in alloc_pipe_info() local
659 pipe = kzalloc(sizeof(struct pipe_inode_info), GFP_KERNEL_ACCOUNT); in alloc_pipe_info()
660 if (pipe == NULL) in alloc_pipe_info()
676 pipe->bufs = kcalloc(pipe_bufs, sizeof(struct pipe_buffer), in alloc_pipe_info()
679 if (pipe->bufs) { in alloc_pipe_info()
680 init_waitqueue_head(&pipe->wait); in alloc_pipe_info()
681 pipe->r_counter = pipe->w_counter = 1; in alloc_pipe_info()
682 pipe->buffers = pipe_bufs; in alloc_pipe_info()
683 pipe->user = user; in alloc_pipe_info()
684 mutex_init(&pipe->mutex); in alloc_pipe_info()
685 return pipe; in alloc_pipe_info()
690 kfree(pipe); in alloc_pipe_info()
696 void free_pipe_info(struct pipe_inode_info *pipe) in free_pipe_info() argument
700 (void) account_pipe_buffers(pipe->user, pipe->buffers, 0); in free_pipe_info()
701 free_uid(pipe->user); in free_pipe_info()
702 for (i = 0; i < pipe->buffers; i++) { in free_pipe_info()
703 struct pipe_buffer *buf = pipe->bufs + i; in free_pipe_info()
705 pipe_buf_release(pipe, buf); in free_pipe_info()
707 if (pipe->tmp_page) in free_pipe_info()
708 __free_page(pipe->tmp_page); in free_pipe_info()
709 kfree(pipe->bufs); in free_pipe_info()
710 kfree(pipe); in free_pipe_info()
731 struct pipe_inode_info *pipe; in get_pipe_inode() local
738 pipe = alloc_pipe_info(); in get_pipe_inode()
739 if (!pipe) in get_pipe_inode()
742 inode->i_pipe = pipe; in get_pipe_inode()
743 pipe->files = 2; in get_pipe_inode()
744 pipe->readers = pipe->writers = 1; in get_pipe_inode()
876 SYSCALL_DEFINE1(pipe, int __user *, fildes) in SYSCALL_DEFINE1() argument
881 static int wait_for_partner(struct pipe_inode_info *pipe, unsigned int *cnt) in wait_for_partner() argument
886 pipe_wait(pipe); in wait_for_partner()
893 static void wake_up_partner(struct pipe_inode_info *pipe) in wake_up_partner() argument
895 wake_up_interruptible(&pipe->wait); in wake_up_partner()
900 struct pipe_inode_info *pipe; in fifo_open() local
908 pipe = inode->i_pipe; in fifo_open()
909 pipe->files++; in fifo_open()
913 pipe = alloc_pipe_info(); in fifo_open()
914 if (!pipe) in fifo_open()
916 pipe->files = 1; in fifo_open()
921 free_pipe_info(pipe); in fifo_open()
922 pipe = inode->i_pipe; in fifo_open()
924 inode->i_pipe = pipe; in fifo_open()
928 filp->private_data = pipe; in fifo_open()
931 __pipe_lock(pipe); in fifo_open()
943 pipe->r_counter++; in fifo_open()
944 if (pipe->readers++ == 0) in fifo_open()
945 wake_up_partner(pipe); in fifo_open()
947 if (!is_pipe && !pipe->writers) { in fifo_open()
951 filp->f_version = pipe->w_counter; in fifo_open()
953 if (wait_for_partner(pipe, &pipe->w_counter)) in fifo_open()
966 if (!is_pipe && (filp->f_flags & O_NONBLOCK) && !pipe->readers) in fifo_open()
969 pipe->w_counter++; in fifo_open()
970 if (!pipe->writers++) in fifo_open()
971 wake_up_partner(pipe); in fifo_open()
973 if (!is_pipe && !pipe->readers) { in fifo_open()
974 if (wait_for_partner(pipe, &pipe->r_counter)) in fifo_open()
987 pipe->readers++; in fifo_open()
988 pipe->writers++; in fifo_open()
989 pipe->r_counter++; in fifo_open()
990 pipe->w_counter++; in fifo_open()
991 if (pipe->readers == 1 || pipe->writers == 1) in fifo_open()
992 wake_up_partner(pipe); in fifo_open()
1001 __pipe_unlock(pipe); in fifo_open()
1005 if (!--pipe->readers) in fifo_open()
1006 wake_up_interruptible(&pipe->wait); in fifo_open()
1011 if (!--pipe->writers) in fifo_open()
1012 wake_up_interruptible(&pipe->wait); in fifo_open()
1017 __pipe_unlock(pipe); in fifo_open()
1019 put_pipe_info(inode, pipe); in fifo_open()
1054 static long pipe_set_size(struct pipe_inode_info *pipe, unsigned long arg) in pipe_set_size() argument
1074 if (nr_pages > pipe->buffers && in pipe_set_size()
1078 user_bufs = account_pipe_buffers(pipe->user, pipe->buffers, nr_pages); in pipe_set_size()
1080 if (nr_pages > pipe->buffers && in pipe_set_size()
1094 if (nr_pages < pipe->nrbufs) { in pipe_set_size()
1110 if (pipe->nrbufs) { in pipe_set_size()
1114 tail = pipe->curbuf + pipe->nrbufs; in pipe_set_size()
1115 if (tail < pipe->buffers) in pipe_set_size()
1118 tail &= (pipe->buffers - 1); in pipe_set_size()
1120 head = pipe->nrbufs - tail; in pipe_set_size()
1122 memcpy(bufs, pipe->bufs + pipe->curbuf, head * sizeof(struct pipe_buffer)); in pipe_set_size()
1124 memcpy(bufs + head, pipe->bufs, tail * sizeof(struct pipe_buffer)); in pipe_set_size()
1127 pipe->curbuf = 0; in pipe_set_size()
1128 kfree(pipe->bufs); in pipe_set_size()
1129 pipe->bufs = bufs; in pipe_set_size()
1130 pipe->buffers = nr_pages; in pipe_set_size()
1134 (void) account_pipe_buffers(pipe->user, nr_pages, pipe->buffers); in pipe_set_size()
1150 struct pipe_inode_info *pipe; in pipe_fcntl() local
1153 pipe = get_pipe_info(file); in pipe_fcntl()
1154 if (!pipe) in pipe_fcntl()
1157 __pipe_lock(pipe); in pipe_fcntl()
1161 ret = pipe_set_size(pipe, arg); in pipe_fcntl()
1164 ret = pipe->buffers * PAGE_SIZE; in pipe_fcntl()
1171 __pipe_unlock(pipe); in pipe_fcntl()