Lines Matching defs:cpipe

229 static void pipeclose(struct pipe *cpipe);
230 static void pipe_free_kmem(struct pipe *cpipe);
233 static __inline int pipelock(struct pipe *cpipe, bool catch);
234 static __inline void pipeunlock(struct pipe *cpipe);
242 static int pipespace(struct pipe *cpipe, int size);
243 static int pipespace_new(struct pipe *cpipe, int size);
566 pipespace_new(struct pipe *cpipe, int size)
573 KASSERT(!mtx_owned(PIPE_MTX(cpipe)), ("pipespace: pipe mutex locked"));
574 KASSERT(!(cpipe->pipe_state & PIPE_DIRECTW),
577 cnt = cpipe->pipe_buffer.cnt;
584 if (!chgpipecnt(cpipe->pipe_pair->pp_owner->cr_ruidinfo,
586 if (cpipe->pipe_buffer.buffer == NULL &&
598 chgpipecnt(cpipe->pipe_pair->pp_owner->cr_ruidinfo, -size, 0);
599 if (cpipe->pipe_buffer.buffer == NULL &&
611 chgpipecnt(cpipe->pipe_pair->pp_owner->cr_ruidinfo, -size, 0);
612 if (cpipe->pipe_buffer.buffer == NULL &&
618 if (cpipe->pipe_buffer.buffer == NULL) {
630 if (cpipe->pipe_buffer.in <= cpipe->pipe_buffer.out) {
631 firstseg = cpipe->pipe_buffer.size - cpipe->pipe_buffer.out;
632 bcopy(&cpipe->pipe_buffer.buffer[cpipe->pipe_buffer.out],
635 bcopy(cpipe->pipe_buffer.buffer, &buffer[firstseg],
636 cpipe->pipe_buffer.in);
638 bcopy(&cpipe->pipe_buffer.buffer[cpipe->pipe_buffer.out],
642 pipe_free_kmem(cpipe);
643 cpipe->pipe_buffer.buffer = buffer;
644 cpipe->pipe_buffer.size = size;
645 cpipe->pipe_buffer.in = cnt;
646 cpipe->pipe_buffer.out = 0;
647 cpipe->pipe_buffer.cnt = cnt;
648 atomic_add_long(&amountpipekva, cpipe->pipe_buffer.size);
656 pipespace(struct pipe *cpipe, int size)
659 KASSERT(cpipe->pipe_state & PIPE_LOCKFL,
661 return (pipespace_new(cpipe, size));
668 pipelock(struct pipe *cpipe, bool catch)
672 PIPE_LOCK_ASSERT(cpipe, MA_OWNED);
677 while (cpipe->pipe_state & PIPE_LOCKFL) {
678 KASSERT(cpipe->pipe_waiters >= 0,
680 cpipe->pipe_waiters));
681 cpipe->pipe_waiters++;
682 error = msleep(&cpipe->pipe_waiters, PIPE_MTX(cpipe), prio,
684 cpipe->pipe_waiters--;
688 cpipe->pipe_state |= PIPE_LOCKFL;
696 pipeunlock(struct pipe *cpipe)
699 PIPE_LOCK_ASSERT(cpipe, MA_OWNED);
700 KASSERT(cpipe->pipe_state & PIPE_LOCKFL,
702 KASSERT(cpipe->pipe_waiters >= 0,
704 cpipe->pipe_waiters));
705 cpipe->pipe_state &= ~PIPE_LOCKFL;
706 if (cpipe->pipe_waiters > 0)
707 wakeup_one(&cpipe->pipe_waiters);
711 pipeselwakeup(struct pipe *cpipe)
714 PIPE_LOCK_ASSERT(cpipe, MA_OWNED);
715 if (cpipe->pipe_state & PIPE_SEL) {
716 selwakeuppri(&cpipe->pipe_sel, PSOCK);
717 if (!SEL_WAITING(&cpipe->pipe_sel))
718 cpipe->pipe_state &= ~PIPE_SEL;
720 if ((cpipe->pipe_state & PIPE_ASYNC) && cpipe->pipe_sigio)
721 pgsigio(&cpipe->pipe_sigio, SIGIO, 0);
722 KNOTE_LOCKED(&cpipe->pipe_sel.si_note, 0);
1402 struct pipe *cpipe;
1405 cpipe = fp->f_data;
1406 if (cpipe->pipe_type & PIPE_TYPE_NAMED)
1627 struct pipe *cpipe;
1630 cpipe = fp->f_data;
1631 if (cpipe->pipe_type & PIPE_TYPE_NAMED)
1642 struct pipe *cpipe;
1645 cpipe = fp->f_data;
1646 if (cpipe->pipe_type & PIPE_TYPE_NAMED)
1672 pipe_free_kmem(struct pipe *cpipe)
1675 KASSERT(!mtx_owned(PIPE_MTX(cpipe)),
1678 if (cpipe->pipe_buffer.buffer != NULL) {
1679 atomic_subtract_long(&amountpipekva, cpipe->pipe_buffer.size);
1680 chgpipecnt(cpipe->pipe_pair->pp_owner->cr_ruidinfo,
1681 -cpipe->pipe_buffer.size, 0);
1683 (vm_offset_t)cpipe->pipe_buffer.buffer,
1684 (vm_offset_t)cpipe->pipe_buffer.buffer + cpipe->pipe_buffer.size);
1685 cpipe->pipe_buffer.buffer = NULL;
1689 cpipe->pipe_pages.cnt = 0;
1690 cpipe->pipe_pages.pos = 0;
1691 cpipe->pipe_pages.npages = 0;
1700 pipeclose(struct pipe *cpipe)
1707 KASSERT(cpipe != NULL, ("pipeclose: cpipe == NULL"));
1709 PIPE_LOCK(cpipe);
1710 pipelock(cpipe, false);
1712 pp = cpipe->pipe_pair;
1719 cpipe->pipe_state |= PIPE_EOF;
1720 while (cpipe->pipe_busy) {
1721 wakeup(cpipe);
1722 cpipe->pipe_state |= PIPE_WANT;
1723 pipeunlock(cpipe);
1724 msleep(cpipe, PIPE_MTX(cpipe), PRIBIO, "pipecl", 0);
1725 pipelock(cpipe, false);
1728 pipeselwakeup(cpipe);
1733 ppipe = cpipe->pipe_peer;
1746 PIPE_UNLOCK(cpipe);
1747 pipe_free_kmem(cpipe);
1748 PIPE_LOCK(cpipe);
1749 cpipe->pipe_present = PIPE_CLOSING;
1750 pipeunlock(cpipe);
1757 knlist_clear(&cpipe->pipe_sel.si_note, 1);
1758 cpipe->pipe_present = PIPE_FINALIZED;
1759 seldrain(&cpipe->pipe_sel);
1760 knlist_destroy(&cpipe->pipe_sel.si_note);
1767 PIPE_UNLOCK(cpipe);
1768 crfree(cpipe->pipe_pair->pp_owner);
1772 uma_zfree(pipe_zone, cpipe->pipe_pair);
1774 PIPE_UNLOCK(cpipe);
1781 struct pipe *cpipe;
1796 cpipe = fp->f_data;
1797 PIPE_LOCK(cpipe);
1804 if (cpipe->pipe_peer->pipe_present != PIPE_ACTIVE) {
1806 PIPE_UNLOCK(cpipe);
1809 cpipe = PIPE_PEER(cpipe);
1812 if ((cpipe->pipe_type & PIPE_TYPE_NAMED) != 0) {
1813 PIPE_UNLOCK(cpipe);
1816 PIPE_UNLOCK(cpipe);
1820 kn->kn_hook = cpipe;
1821 knlist_add(&cpipe->pipe_sel.si_note, kn, 1);
1822 PIPE_UNLOCK(cpipe);
1829 struct pipe *cpipe = kn->kn_hook;
1831 PIPE_LOCK(cpipe);
1832 knlist_remove(&cpipe->pipe_sel.si_note, kn, 1);
1833 PIPE_UNLOCK(cpipe);