[BACK]Return to uipc_socket.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / kern

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/sys/kern/uipc_socket.c between version 1.115 and 1.115.6.2

version 1.115, 2005/12/27 00:00:29 version 1.115.6.2, 2006/06/01 22:38:09
Line 91  __KERNEL_RCSID(0, "$NetBSD$");
Line 91  __KERNEL_RCSID(0, "$NetBSD$");
 #include <sys/pool.h>  #include <sys/pool.h>
 #include <sys/event.h>  #include <sys/event.h>
 #include <sys/poll.h>  #include <sys/poll.h>
   #include <sys/kauth.h>
   
 #include <uvm/uvm.h>  #include <uvm/uvm.h>
   
Line 126  EVCNT_ATTACH_STATIC(sosend_kvalimit);
Line 127  EVCNT_ATTACH_STATIC(sosend_kvalimit);
   
 #endif /* SOSEND_COUNTERS */  #endif /* SOSEND_COUNTERS */
   
 void  static struct callback_entry sokva_reclaimerentry;
 soinit(void)  
 {  
   
         /* Set the initial adjusted socket buffer size. */  
         if (sb_max_set(sb_max))  
                 panic("bad initial sb_max value: %lu", sb_max);  
   
 }  
   
 #ifdef SOSEND_NO_LOAN  #ifdef SOSEND_NO_LOAN
 int use_sosend_loan = 0;  int use_sosend_loan = 0;
Line 155  static int sokvawaiters;
Line 148  static int sokvawaiters;
 #define SOCK_LOAN_THRESH        4096  #define SOCK_LOAN_THRESH        4096
 #define SOCK_LOAN_CHUNK         65536  #define SOCK_LOAN_CHUNK         65536
   
 static size_t sodopendfree(struct socket *);  static size_t sodopendfree(void);
 static size_t sodopendfreel(struct socket *);  static size_t sodopendfreel(void);
   
 static vsize_t  static vsize_t
 sokvareserve(struct socket *so, vsize_t len)  sokvareserve(struct socket *so, vsize_t len)
Line 173  sokvareserve(struct socket *so, vsize_t 
Line 166  sokvareserve(struct socket *so, vsize_t 
                  * try to do pendfree.                   * try to do pendfree.
                  */                   */
   
                 freed = sodopendfreel(so);                  freed = sodopendfreel();
   
                 /*                  /*
                  * if some kva was freed, try again.                   * if some kva was freed, try again.
Line 292  sodoloanfree(struct vm_page **pgs, caddr
Line 285  sodoloanfree(struct vm_page **pgs, caddr
 }  }
   
 static size_t  static size_t
 sodopendfree(struct socket *so)  sodopendfree()
 {  {
         int s;          int s;
         size_t rv;          size_t rv;
   
         s = splvm();          s = splvm();
         simple_lock(&so_pendfree_slock);          simple_lock(&so_pendfree_slock);
         rv = sodopendfreel(so);          rv = sodopendfreel();
         simple_unlock(&so_pendfree_slock);          simple_unlock(&so_pendfree_slock);
         splx(s);          splx(s);
   
Line 315  sodopendfree(struct socket *so)
Line 308  sodopendfree(struct socket *so)
  */   */
   
 static size_t  static size_t
 sodopendfreel(struct socket *so)  sodopendfreel()
 {  {
         size_t rv = 0;          size_t rv = 0;
   
Line 390  sosend_loan(struct socket *so, struct ui
Line 383  sosend_loan(struct socket *so, struct ui
         vaddr_t lva, va;          vaddr_t lva, va;
         int npgs, i, error;          int npgs, i, error;
   
         if (uio->uio_segflg != UIO_USERSPACE)          if (VMSPACE_IS_KERNEL_P(uio->uio_vmspace))
                 return (0);                  return (0);
   
         if (iov->iov_len < (size_t) space)          if (iov->iov_len < (size_t) space)
Line 405  sosend_loan(struct socket *so, struct ui
Line 398  sosend_loan(struct socket *so, struct ui
   
         /* XXX KDASSERT */          /* XXX KDASSERT */
         KASSERT(npgs <= M_EXT_MAXPAGES);          KASSERT(npgs <= M_EXT_MAXPAGES);
         KASSERT(uio->uio_lwp != NULL);  
   
         lva = sokvaalloc(len, so);          lva = sokvaalloc(len, so);
         if (lva == 0)          if (lva == 0)
                 return 0;                  return 0;
   
         error = uvm_loan(&uio->uio_lwp->l_proc->p_vmspace->vm_map, sva, len,          error = uvm_loan(&uio->uio_vmspace->vm_map, sva, len,
             m->m_ext.ext_pgs, UVM_LOAN_TOPAGE);              m->m_ext.ext_pgs, UVM_LOAN_TOPAGE);
         if (error) {          if (error) {
                 sokvafree(lva, len);                  sokvafree(lva, len);
Line 440  sosend_loan(struct socket *so, struct ui
Line 432  sosend_loan(struct socket *so, struct ui
         return (space);          return (space);
 }  }
   
   static int
   sokva_reclaim_callback(struct callback_entry *ce, void *obj, void *arg)
   {
   
           KASSERT(ce == &sokva_reclaimerentry);
           KASSERT(obj == NULL);
   
           sodopendfree();
           if (!vm_map_starved_p(kernel_map)) {
                   return CALLBACK_CHAIN_ABORT;
           }
           return CALLBACK_CHAIN_CONTINUE;
   }
   
   void
   soinit(void)
   {
   
           /* Set the initial adjusted socket buffer size. */
           if (sb_max_set(sb_max))
                   panic("bad initial sb_max value: %lu", sb_max);
   
           callback_register(&vm_map_to_kernel(kernel_map)->vmk_reclaim_callback,
               &sokva_reclaimerentry, NULL, sokva_reclaim_callback);
   }
   
 /*  /*
  * Socket operation routines.   * Socket operation routines.
  * These routines are called by the routines in   * These routines are called by the routines in
Line 479  socreate(int dom, struct socket **aso, i
Line 497  socreate(int dom, struct socket **aso, i
         so->so_mowner = &prp->pr_domain->dom_mowner;          so->so_mowner = &prp->pr_domain->dom_mowner;
 #endif  #endif
         if (l != NULL) {          if (l != NULL) {
                 uid = l->l_proc->p_ucred->cr_uid;                  uid = kauth_cred_geteuid(l->l_proc->p_cred);
         } else {          } else {
                 uid = 0;                  uid = 0;
         }          }
Line 706  sodisconnect(struct socket *so)
Line 724  sodisconnect(struct socket *so)
             (struct lwp *)0);              (struct lwp *)0);
  bad:   bad:
         splx(s);          splx(s);
         sodopendfree(so);          sodopendfree();
         return (error);          return (error);
 }  }
   
Line 738  sosend(struct socket *so, struct mbuf *a
Line 756  sosend(struct socket *so, struct mbuf *a
         int             error, s, dontroute, atomic;          int             error, s, dontroute, atomic;
   
         p = l->l_proc;          p = l->l_proc;
         sodopendfree(so);          sodopendfree();
   
         clen = 0;          clen = 0;
         atomic = sosendallatonce(so) || top;          atomic = sosendallatonce(so) || top;
Line 934  int
Line 952  int
 soreceive(struct socket *so, struct mbuf **paddr, struct uio *uio,  soreceive(struct socket *so, struct mbuf **paddr, struct uio *uio,
         struct mbuf **mp0, struct mbuf **controlp, int *flagsp)          struct mbuf **mp0, struct mbuf **controlp, int *flagsp)
 {  {
         struct lwp *l;          struct lwp *l = curlwp;
         struct mbuf     *m, **mp;          struct mbuf     *m, **mp;
         int             flags, len, error, s, offset, moff, type, orig_resid;          int             flags, len, error, s, offset, moff, type, orig_resid;
         const struct protosw    *pr;          const struct protosw    *pr;
Line 945  soreceive(struct socket *so, struct mbuf
Line 963  soreceive(struct socket *so, struct mbuf
         mp = mp0;          mp = mp0;
         type = 0;          type = 0;
         orig_resid = uio->uio_resid;          orig_resid = uio->uio_resid;
         l = uio->uio_lwp;  
   
         if (paddr)          if (paddr)
                 *paddr = 0;                  *paddr = 0;
Line 957  soreceive(struct socket *so, struct mbuf
Line 974  soreceive(struct socket *so, struct mbuf
                 flags = 0;                  flags = 0;
   
         if ((flags & MSG_DONTWAIT) == 0)          if ((flags & MSG_DONTWAIT) == 0)
                 sodopendfree(so);                  sodopendfree();
   
         if (flags & MSG_OOB) {          if (flags & MSG_OOB) {
                 m = m_get(M_WAIT, MT_DATA);                  m = m_get(M_WAIT, MT_DATA);

Legend:
Removed from v.1.115  
changed lines
  Added in v.1.115.6.2

CVSweb <webmaster@jp.NetBSD.org>