Lines Matching refs:pipe

62 static void pipe_lock_nested(struct pipe_inode_info *pipe, int subclass)  in pipe_lock_nested()  argument
64 if (pipe->files) in pipe_lock_nested()
65 mutex_lock_nested(&pipe->mutex, subclass); in pipe_lock_nested()
68 void pipe_lock(struct pipe_inode_info *pipe) in pipe_lock() argument
73 pipe_lock_nested(pipe, I_MUTEX_PARENT); in pipe_lock()
77 void pipe_unlock(struct pipe_inode_info *pipe) in pipe_unlock() argument
79 if (pipe->files) in pipe_unlock()
80 mutex_unlock(&pipe->mutex); in pipe_unlock()
84 static inline void __pipe_lock(struct pipe_inode_info *pipe) in __pipe_lock() argument
86 mutex_lock_nested(&pipe->mutex, I_MUTEX_PARENT); in __pipe_lock()
89 static inline void __pipe_unlock(struct pipe_inode_info *pipe) in __pipe_unlock() argument
91 mutex_unlock(&pipe->mutex); in __pipe_unlock()
109 void pipe_wait(struct pipe_inode_info *pipe) in pipe_wait() argument
117 prepare_to_wait(&pipe->wait, &wait, TASK_INTERRUPTIBLE); in pipe_wait()
118 pipe_unlock(pipe); in pipe_wait()
120 finish_wait(&pipe->wait, &wait); in pipe_wait()
121 pipe_lock(pipe); in pipe_wait()
124 static void anon_pipe_buf_release(struct pipe_inode_info *pipe, in anon_pipe_buf_release() argument
134 if (page_count(page) == 1 && !pipe->tmp_page) in anon_pipe_buf_release()
135 pipe->tmp_page = page; in anon_pipe_buf_release()
152 int generic_pipe_buf_steal(struct pipe_inode_info *pipe, in generic_pipe_buf_steal() argument
181 void generic_pipe_buf_get(struct pipe_inode_info *pipe, struct pipe_buffer *buf) in generic_pipe_buf_get() argument
211 void generic_pipe_buf_release(struct pipe_inode_info *pipe, in generic_pipe_buf_release() argument
239 struct pipe_inode_info *pipe = filp->private_data; in pipe_read() local
249 __pipe_lock(pipe); in pipe_read()
251 int bufs = pipe->nrbufs; in pipe_read()
253 int curbuf = pipe->curbuf; in pipe_read()
254 struct pipe_buffer *buf = pipe->bufs + curbuf; in pipe_read()
263 error = ops->confirm(pipe, buf); in pipe_read()
288 ops->release(pipe, buf); in pipe_read()
289 curbuf = (curbuf + 1) & (pipe->buffers - 1); in pipe_read()
290 pipe->curbuf = curbuf; in pipe_read()
291 pipe->nrbufs = --bufs; in pipe_read()
300 if (!pipe->writers) in pipe_read()
302 if (!pipe->waiting_writers) { in pipe_read()
321 wake_up_interruptible_sync_poll(&pipe->wait, POLLOUT | POLLWRNORM); in pipe_read()
322 kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); in pipe_read()
324 pipe_wait(pipe); in pipe_read()
326 __pipe_unlock(pipe); in pipe_read()
330 wake_up_interruptible_sync_poll(&pipe->wait, POLLOUT | POLLWRNORM); in pipe_read()
331 kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); in pipe_read()
347 struct pipe_inode_info *pipe = filp->private_data; in pipe_write() local
357 __pipe_lock(pipe); in pipe_write()
359 if (!pipe->readers) { in pipe_write()
367 if (pipe->nrbufs && chars != 0) { in pipe_write()
368 int lastbuf = (pipe->curbuf + pipe->nrbufs - 1) & in pipe_write()
369 (pipe->buffers - 1); in pipe_write()
370 struct pipe_buffer *buf = pipe->bufs + lastbuf; in pipe_write()
375 ret = ops->confirm(pipe, buf); in pipe_write()
394 if (!pipe->readers) { in pipe_write()
400 bufs = pipe->nrbufs; in pipe_write()
401 if (bufs < pipe->buffers) { in pipe_write()
402 int newbuf = (pipe->curbuf + bufs) & (pipe->buffers-1); in pipe_write()
403 struct pipe_buffer *buf = pipe->bufs + newbuf; in pipe_write()
404 struct page *page = pipe->tmp_page; in pipe_write()
413 pipe->tmp_page = page; in pipe_write()
439 pipe->nrbufs = ++bufs; in pipe_write()
440 pipe->tmp_page = NULL; in pipe_write()
445 if (bufs < pipe->buffers) in pipe_write()
458 wake_up_interruptible_sync_poll(&pipe->wait, POLLIN | POLLRDNORM); in pipe_write()
459 kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); in pipe_write()
462 pipe->waiting_writers++; in pipe_write()
463 pipe_wait(pipe); in pipe_write()
464 pipe->waiting_writers--; in pipe_write()
467 __pipe_unlock(pipe); in pipe_write()
469 wake_up_interruptible_sync_poll(&pipe->wait, POLLIN | POLLRDNORM); in pipe_write()
470 kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); in pipe_write()
483 struct pipe_inode_info *pipe = filp->private_data; in pipe_ioctl() local
488 __pipe_lock(pipe); in pipe_ioctl()
490 buf = pipe->curbuf; in pipe_ioctl()
491 nrbufs = pipe->nrbufs; in pipe_ioctl()
493 count += pipe->bufs[buf].len; in pipe_ioctl()
494 buf = (buf+1) & (pipe->buffers - 1); in pipe_ioctl()
496 __pipe_unlock(pipe); in pipe_ioctl()
509 struct pipe_inode_info *pipe = filp->private_data; in pipe_poll() local
512 poll_wait(filp, &pipe->wait, wait); in pipe_poll()
515 nrbufs = pipe->nrbufs; in pipe_poll()
519 if (!pipe->writers && filp->f_version != pipe->w_counter) in pipe_poll()
524 mask |= (nrbufs < pipe->buffers) ? POLLOUT | POLLWRNORM : 0; in pipe_poll()
529 if (!pipe->readers) in pipe_poll()
536 static void put_pipe_info(struct inode *inode, struct pipe_inode_info *pipe) in put_pipe_info() argument
541 if (!--pipe->files) { in put_pipe_info()
548 free_pipe_info(pipe); in put_pipe_info()
554 struct pipe_inode_info *pipe = file->private_data; in pipe_release() local
556 __pipe_lock(pipe); in pipe_release()
558 pipe->readers--; in pipe_release()
560 pipe->writers--; in pipe_release()
562 if (pipe->readers || pipe->writers) { in pipe_release()
563 …wake_up_interruptible_sync_poll(&pipe->wait, POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM | POLLERR … in pipe_release()
564 kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); in pipe_release()
565 kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); in pipe_release()
567 __pipe_unlock(pipe); in pipe_release()
569 put_pipe_info(inode, pipe); in pipe_release()
576 struct pipe_inode_info *pipe = filp->private_data; in pipe_fasync() local
579 __pipe_lock(pipe); in pipe_fasync()
581 retval = fasync_helper(fd, filp, on, &pipe->fasync_readers); in pipe_fasync()
583 retval = fasync_helper(fd, filp, on, &pipe->fasync_writers); in pipe_fasync()
586 fasync_helper(-1, filp, 0, &pipe->fasync_readers); in pipe_fasync()
588 __pipe_unlock(pipe); in pipe_fasync()
592 static void account_pipe_buffers(struct pipe_inode_info *pipe, in account_pipe_buffers() argument
595 atomic_long_add(new - old, &pipe->user->pipe_bufs); in account_pipe_buffers()
612 struct pipe_inode_info *pipe; in alloc_pipe_info() local
614 pipe = kzalloc(sizeof(struct pipe_inode_info), GFP_KERNEL); in alloc_pipe_info()
615 if (pipe) { in alloc_pipe_info()
622 pipe->bufs = kzalloc(sizeof(struct pipe_buffer) * pipe_bufs, GFP_KERNEL); in alloc_pipe_info()
625 if (pipe->bufs) { in alloc_pipe_info()
626 init_waitqueue_head(&pipe->wait); in alloc_pipe_info()
627 pipe->r_counter = pipe->w_counter = 1; in alloc_pipe_info()
628 pipe->buffers = pipe_bufs; in alloc_pipe_info()
629 pipe->user = user; in alloc_pipe_info()
630 account_pipe_buffers(pipe, 0, pipe_bufs); in alloc_pipe_info()
631 mutex_init(&pipe->mutex); in alloc_pipe_info()
632 return pipe; in alloc_pipe_info()
635 kfree(pipe); in alloc_pipe_info()
641 void free_pipe_info(struct pipe_inode_info *pipe) in free_pipe_info() argument
645 account_pipe_buffers(pipe, pipe->buffers, 0); in free_pipe_info()
646 free_uid(pipe->user); in free_pipe_info()
647 for (i = 0; i < pipe->buffers; i++) { in free_pipe_info()
648 struct pipe_buffer *buf = pipe->bufs + i; in free_pipe_info()
650 buf->ops->release(pipe, buf); in free_pipe_info()
652 if (pipe->tmp_page) in free_pipe_info()
653 __free_page(pipe->tmp_page); in free_pipe_info()
654 kfree(pipe->bufs); in free_pipe_info()
655 kfree(pipe); in free_pipe_info()
676 struct pipe_inode_info *pipe; in get_pipe_inode() local
683 pipe = alloc_pipe_info(); in get_pipe_inode()
684 if (!pipe) in get_pipe_inode()
687 inode->i_pipe = pipe; in get_pipe_inode()
688 pipe->files = 2; in get_pipe_inode()
689 pipe->readers = pipe->writers = 1; in get_pipe_inode()
838 SYSCALL_DEFINE1(pipe, int __user *, fildes) in SYSCALL_DEFINE1() argument
843 static int wait_for_partner(struct pipe_inode_info *pipe, unsigned int *cnt) in wait_for_partner() argument
848 pipe_wait(pipe); in wait_for_partner()
855 static void wake_up_partner(struct pipe_inode_info *pipe) in wake_up_partner() argument
857 wake_up_interruptible(&pipe->wait); in wake_up_partner()
862 struct pipe_inode_info *pipe; in fifo_open() local
870 pipe = inode->i_pipe; in fifo_open()
871 pipe->files++; in fifo_open()
875 pipe = alloc_pipe_info(); in fifo_open()
876 if (!pipe) in fifo_open()
878 pipe->files = 1; in fifo_open()
883 free_pipe_info(pipe); in fifo_open()
884 pipe = inode->i_pipe; in fifo_open()
886 inode->i_pipe = pipe; in fifo_open()
890 filp->private_data = pipe; in fifo_open()
893 __pipe_lock(pipe); in fifo_open()
905 pipe->r_counter++; in fifo_open()
906 if (pipe->readers++ == 0) in fifo_open()
907 wake_up_partner(pipe); in fifo_open()
909 if (!is_pipe && !pipe->writers) { in fifo_open()
913 filp->f_version = pipe->w_counter; in fifo_open()
915 if (wait_for_partner(pipe, &pipe->w_counter)) in fifo_open()
928 if (!is_pipe && (filp->f_flags & O_NONBLOCK) && !pipe->readers) in fifo_open()
931 pipe->w_counter++; in fifo_open()
932 if (!pipe->writers++) in fifo_open()
933 wake_up_partner(pipe); in fifo_open()
935 if (!is_pipe && !pipe->readers) { in fifo_open()
936 if (wait_for_partner(pipe, &pipe->r_counter)) in fifo_open()
949 pipe->readers++; in fifo_open()
950 pipe->writers++; in fifo_open()
951 pipe->r_counter++; in fifo_open()
952 pipe->w_counter++; in fifo_open()
953 if (pipe->readers == 1 || pipe->writers == 1) in fifo_open()
954 wake_up_partner(pipe); in fifo_open()
963 __pipe_unlock(pipe); in fifo_open()
967 if (!--pipe->readers) in fifo_open()
968 wake_up_interruptible(&pipe->wait); in fifo_open()
973 if (!--pipe->writers) in fifo_open()
974 wake_up_interruptible(&pipe->wait); in fifo_open()
979 __pipe_unlock(pipe); in fifo_open()
981 put_pipe_info(inode, pipe); in fifo_open()
1000 static long pipe_set_size(struct pipe_inode_info *pipe, unsigned long nr_pages) in pipe_set_size() argument
1010 if (nr_pages < pipe->nrbufs) in pipe_set_size()
1021 if (pipe->nrbufs) { in pipe_set_size()
1025 tail = pipe->curbuf + pipe->nrbufs; in pipe_set_size()
1026 if (tail < pipe->buffers) in pipe_set_size()
1029 tail &= (pipe->buffers - 1); in pipe_set_size()
1031 head = pipe->nrbufs - tail; in pipe_set_size()
1033 memcpy(bufs, pipe->bufs + pipe->curbuf, head * sizeof(struct pipe_buffer)); in pipe_set_size()
1035 memcpy(bufs + head, pipe->bufs, tail * sizeof(struct pipe_buffer)); in pipe_set_size()
1038 account_pipe_buffers(pipe, pipe->buffers, nr_pages); in pipe_set_size()
1039 pipe->curbuf = 0; in pipe_set_size()
1040 kfree(pipe->bufs); in pipe_set_size()
1041 pipe->bufs = bufs; in pipe_set_size()
1042 pipe->buffers = nr_pages; in pipe_set_size()
1087 struct pipe_inode_info *pipe; in pipe_fcntl() local
1090 pipe = get_pipe_info(file); in pipe_fcntl()
1091 if (!pipe) in pipe_fcntl()
1094 __pipe_lock(pipe); in pipe_fcntl()
1110 } else if ((too_many_pipe_buffers_hard(pipe->user) || in pipe_fcntl()
1111 too_many_pipe_buffers_soft(pipe->user)) && in pipe_fcntl()
1116 ret = pipe_set_size(pipe, nr_pages); in pipe_fcntl()
1120 ret = pipe->buffers * PAGE_SIZE; in pipe_fcntl()
1128 __pipe_unlock(pipe); in pipe_fcntl()