Lines Matching refs:pipe
56 static void pipe_lock_nested(struct pipe_inode_info *pipe, int subclass) in pipe_lock_nested() argument
58 if (pipe->files) in pipe_lock_nested()
59 mutex_lock_nested(&pipe->mutex, subclass); in pipe_lock_nested()
62 void pipe_lock(struct pipe_inode_info *pipe) in pipe_lock() argument
67 pipe_lock_nested(pipe, I_MUTEX_PARENT); in pipe_lock()
71 void pipe_unlock(struct pipe_inode_info *pipe) in pipe_unlock() argument
73 if (pipe->files) in pipe_unlock()
74 mutex_unlock(&pipe->mutex); in pipe_unlock()
78 static inline void __pipe_lock(struct pipe_inode_info *pipe) in __pipe_lock() argument
80 mutex_lock_nested(&pipe->mutex, I_MUTEX_PARENT); in __pipe_lock()
83 static inline void __pipe_unlock(struct pipe_inode_info *pipe) in __pipe_unlock() argument
85 mutex_unlock(&pipe->mutex); in __pipe_unlock()
103 void pipe_wait(struct pipe_inode_info *pipe) in pipe_wait() argument
111 prepare_to_wait(&pipe->wait, &wait, TASK_INTERRUPTIBLE); in pipe_wait()
112 pipe_unlock(pipe); in pipe_wait()
114 finish_wait(&pipe->wait, &wait); in pipe_wait()
115 pipe_lock(pipe); in pipe_wait()
118 static void anon_pipe_buf_release(struct pipe_inode_info *pipe, in anon_pipe_buf_release() argument
128 if (page_count(page) == 1 && !pipe->tmp_page) in anon_pipe_buf_release()
129 pipe->tmp_page = page; in anon_pipe_buf_release()
146 int generic_pipe_buf_steal(struct pipe_inode_info *pipe, in generic_pipe_buf_steal() argument
175 void generic_pipe_buf_get(struct pipe_inode_info *pipe, struct pipe_buffer *buf) in generic_pipe_buf_get() argument
205 void generic_pipe_buf_release(struct pipe_inode_info *pipe, in generic_pipe_buf_release() argument
233 struct pipe_inode_info *pipe = filp->private_data; in pipe_read() local
243 __pipe_lock(pipe); in pipe_read()
245 int bufs = pipe->nrbufs; in pipe_read()
247 int curbuf = pipe->curbuf; in pipe_read()
248 struct pipe_buffer *buf = pipe->bufs + curbuf; in pipe_read()
257 error = ops->confirm(pipe, buf); in pipe_read()
282 ops->release(pipe, buf); in pipe_read()
283 curbuf = (curbuf + 1) & (pipe->buffers - 1); in pipe_read()
284 pipe->curbuf = curbuf; in pipe_read()
285 pipe->nrbufs = --bufs; in pipe_read()
294 if (!pipe->writers) in pipe_read()
296 if (!pipe->waiting_writers) { in pipe_read()
315 wake_up_interruptible_sync_poll(&pipe->wait, POLLOUT | POLLWRNORM); in pipe_read()
316 kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); in pipe_read()
318 pipe_wait(pipe); in pipe_read()
320 __pipe_unlock(pipe); in pipe_read()
324 wake_up_interruptible_sync_poll(&pipe->wait, POLLOUT | POLLWRNORM); in pipe_read()
325 kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); in pipe_read()
341 struct pipe_inode_info *pipe = filp->private_data; in pipe_write() local
351 __pipe_lock(pipe); in pipe_write()
353 if (!pipe->readers) { in pipe_write()
361 if (pipe->nrbufs && chars != 0) { in pipe_write()
362 int lastbuf = (pipe->curbuf + pipe->nrbufs - 1) & in pipe_write()
363 (pipe->buffers - 1); in pipe_write()
364 struct pipe_buffer *buf = pipe->bufs + lastbuf; in pipe_write()
369 int error = ops->confirm(pipe, buf); in pipe_write()
389 if (!pipe->readers) { in pipe_write()
395 bufs = pipe->nrbufs; in pipe_write()
396 if (bufs < pipe->buffers) { in pipe_write()
397 int newbuf = (pipe->curbuf + bufs) & (pipe->buffers-1); in pipe_write()
398 struct pipe_buffer *buf = pipe->bufs + newbuf; in pipe_write()
399 struct page *page = pipe->tmp_page; in pipe_write()
408 pipe->tmp_page = page; in pipe_write()
434 pipe->nrbufs = ++bufs; in pipe_write()
435 pipe->tmp_page = NULL; in pipe_write()
440 if (bufs < pipe->buffers) in pipe_write()
453 wake_up_interruptible_sync_poll(&pipe->wait, POLLIN | POLLRDNORM); in pipe_write()
454 kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); in pipe_write()
457 pipe->waiting_writers++; in pipe_write()
458 pipe_wait(pipe); in pipe_write()
459 pipe->waiting_writers--; in pipe_write()
462 __pipe_unlock(pipe); in pipe_write()
464 wake_up_interruptible_sync_poll(&pipe->wait, POLLIN | POLLRDNORM); in pipe_write()
465 kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); in pipe_write()
478 struct pipe_inode_info *pipe = filp->private_data; in pipe_ioctl() local
483 __pipe_lock(pipe); in pipe_ioctl()
485 buf = pipe->curbuf; in pipe_ioctl()
486 nrbufs = pipe->nrbufs; in pipe_ioctl()
488 count += pipe->bufs[buf].len; in pipe_ioctl()
489 buf = (buf+1) & (pipe->buffers - 1); in pipe_ioctl()
491 __pipe_unlock(pipe); in pipe_ioctl()
504 struct pipe_inode_info *pipe = filp->private_data; in pipe_poll() local
507 poll_wait(filp, &pipe->wait, wait); in pipe_poll()
510 nrbufs = pipe->nrbufs; in pipe_poll()
514 if (!pipe->writers && filp->f_version != pipe->w_counter) in pipe_poll()
519 mask |= (nrbufs < pipe->buffers) ? POLLOUT | POLLWRNORM : 0; in pipe_poll()
524 if (!pipe->readers) in pipe_poll()
531 static void put_pipe_info(struct inode *inode, struct pipe_inode_info *pipe) in put_pipe_info() argument
536 if (!--pipe->files) { in put_pipe_info()
543 free_pipe_info(pipe); in put_pipe_info()
549 struct pipe_inode_info *pipe = file->private_data; in pipe_release() local
551 __pipe_lock(pipe); in pipe_release()
553 pipe->readers--; in pipe_release()
555 pipe->writers--; in pipe_release()
557 if (pipe->readers || pipe->writers) { in pipe_release()
558 …wake_up_interruptible_sync_poll(&pipe->wait, POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM | POLLERR … in pipe_release()
559 kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); in pipe_release()
560 kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); in pipe_release()
562 __pipe_unlock(pipe); in pipe_release()
564 put_pipe_info(inode, pipe); in pipe_release()
571 struct pipe_inode_info *pipe = filp->private_data; in pipe_fasync() local
574 __pipe_lock(pipe); in pipe_fasync()
576 retval = fasync_helper(fd, filp, on, &pipe->fasync_readers); in pipe_fasync()
578 retval = fasync_helper(fd, filp, on, &pipe->fasync_writers); in pipe_fasync()
581 fasync_helper(-1, filp, 0, &pipe->fasync_readers); in pipe_fasync()
583 __pipe_unlock(pipe); in pipe_fasync()
589 struct pipe_inode_info *pipe; in alloc_pipe_info() local
591 pipe = kzalloc(sizeof(struct pipe_inode_info), GFP_KERNEL); in alloc_pipe_info()
592 if (pipe) { in alloc_pipe_info()
593 pipe->bufs = kzalloc(sizeof(struct pipe_buffer) * PIPE_DEF_BUFFERS, GFP_KERNEL); in alloc_pipe_info()
594 if (pipe->bufs) { in alloc_pipe_info()
595 init_waitqueue_head(&pipe->wait); in alloc_pipe_info()
596 pipe->r_counter = pipe->w_counter = 1; in alloc_pipe_info()
597 pipe->buffers = PIPE_DEF_BUFFERS; in alloc_pipe_info()
598 mutex_init(&pipe->mutex); in alloc_pipe_info()
599 return pipe; in alloc_pipe_info()
601 kfree(pipe); in alloc_pipe_info()
607 void free_pipe_info(struct pipe_inode_info *pipe) in free_pipe_info() argument
611 for (i = 0; i < pipe->buffers; i++) { in free_pipe_info()
612 struct pipe_buffer *buf = pipe->bufs + i; in free_pipe_info()
614 buf->ops->release(pipe, buf); in free_pipe_info()
616 if (pipe->tmp_page) in free_pipe_info()
617 __free_page(pipe->tmp_page); in free_pipe_info()
618 kfree(pipe->bufs); in free_pipe_info()
619 kfree(pipe); in free_pipe_info()
640 struct pipe_inode_info *pipe; in get_pipe_inode() local
647 pipe = alloc_pipe_info(); in get_pipe_inode()
648 if (!pipe) in get_pipe_inode()
651 inode->i_pipe = pipe; in get_pipe_inode()
652 pipe->files = 2; in get_pipe_inode()
653 pipe->readers = pipe->writers = 1; in get_pipe_inode()
799 SYSCALL_DEFINE1(pipe, int __user *, fildes) in SYSCALL_DEFINE1() argument
804 static int wait_for_partner(struct pipe_inode_info *pipe, unsigned int *cnt) in wait_for_partner() argument
809 pipe_wait(pipe); in wait_for_partner()
816 static void wake_up_partner(struct pipe_inode_info *pipe) in wake_up_partner() argument
818 wake_up_interruptible(&pipe->wait); in wake_up_partner()
823 struct pipe_inode_info *pipe; in fifo_open() local
831 pipe = inode->i_pipe; in fifo_open()
832 pipe->files++; in fifo_open()
836 pipe = alloc_pipe_info(); in fifo_open()
837 if (!pipe) in fifo_open()
839 pipe->files = 1; in fifo_open()
844 free_pipe_info(pipe); in fifo_open()
845 pipe = inode->i_pipe; in fifo_open()
847 inode->i_pipe = pipe; in fifo_open()
851 filp->private_data = pipe; in fifo_open()
854 __pipe_lock(pipe); in fifo_open()
866 pipe->r_counter++; in fifo_open()
867 if (pipe->readers++ == 0) in fifo_open()
868 wake_up_partner(pipe); in fifo_open()
870 if (!is_pipe && !pipe->writers) { in fifo_open()
874 filp->f_version = pipe->w_counter; in fifo_open()
876 if (wait_for_partner(pipe, &pipe->w_counter)) in fifo_open()
889 if (!is_pipe && (filp->f_flags & O_NONBLOCK) && !pipe->readers) in fifo_open()
892 pipe->w_counter++; in fifo_open()
893 if (!pipe->writers++) in fifo_open()
894 wake_up_partner(pipe); in fifo_open()
896 if (!is_pipe && !pipe->readers) { in fifo_open()
897 if (wait_for_partner(pipe, &pipe->r_counter)) in fifo_open()
910 pipe->readers++; in fifo_open()
911 pipe->writers++; in fifo_open()
912 pipe->r_counter++; in fifo_open()
913 pipe->w_counter++; in fifo_open()
914 if (pipe->readers == 1 || pipe->writers == 1) in fifo_open()
915 wake_up_partner(pipe); in fifo_open()
924 __pipe_unlock(pipe); in fifo_open()
928 if (!--pipe->readers) in fifo_open()
929 wake_up_interruptible(&pipe->wait); in fifo_open()
934 if (!--pipe->writers) in fifo_open()
935 wake_up_interruptible(&pipe->wait); in fifo_open()
940 __pipe_unlock(pipe); in fifo_open()
942 put_pipe_info(inode, pipe); in fifo_open()
961 static long pipe_set_size(struct pipe_inode_info *pipe, unsigned long nr_pages) in pipe_set_size() argument
971 if (nr_pages < pipe->nrbufs) in pipe_set_size()
982 if (pipe->nrbufs) { in pipe_set_size()
986 tail = pipe->curbuf + pipe->nrbufs; in pipe_set_size()
987 if (tail < pipe->buffers) in pipe_set_size()
990 tail &= (pipe->buffers - 1); in pipe_set_size()
992 head = pipe->nrbufs - tail; in pipe_set_size()
994 memcpy(bufs, pipe->bufs + pipe->curbuf, head * sizeof(struct pipe_buffer)); in pipe_set_size()
996 memcpy(bufs + head, pipe->bufs, tail * sizeof(struct pipe_buffer)); in pipe_set_size()
999 pipe->curbuf = 0; in pipe_set_size()
1000 kfree(pipe->bufs); in pipe_set_size()
1001 pipe->bufs = bufs; in pipe_set_size()
1002 pipe->buffers = nr_pages; in pipe_set_size()
1047 struct pipe_inode_info *pipe; in pipe_fcntl() local
1050 pipe = get_pipe_info(file); in pipe_fcntl()
1051 if (!pipe) in pipe_fcntl()
1054 __pipe_lock(pipe); in pipe_fcntl()
1071 ret = pipe_set_size(pipe, nr_pages); in pipe_fcntl()
1075 ret = pipe->buffers * PAGE_SIZE; in pipe_fcntl()
1083 __pipe_unlock(pipe); in pipe_fcntl()