[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.74 and 1.79

version 1.74, 2002/11/27 03:36:04 version 1.79, 2003/04/09 18:38:03
Line 97  __KERNEL_RCSID(0, "$NetBSD$");
Line 97  __KERNEL_RCSID(0, "$NetBSD$");
   
 struct pool     socket_pool;  struct pool     socket_pool;
   
   MALLOC_DEFINE(M_SOOPTS, "soopts", "socket options");
   MALLOC_DEFINE(M_SONAME, "soname", "socket name");
   
 extern int      somaxconn;                      /* patchable (XXX sysctl) */  extern int      somaxconn;                      /* patchable (XXX sysctl) */
 int             somaxconn = SOMAXCONN;  int             somaxconn = SOMAXCONN;
   
Line 151  int sokvawaiters;
Line 154  int sokvawaiters;
 #define SOCK_LOAN_CHUNK         65536  #define SOCK_LOAN_CHUNK         65536
   
 static void  static void
 sodoloanfree(caddr_t buf, u_int size)  sodoloanfree(struct vm_page **pgs, caddr_t buf, size_t size)
 {  {
         struct vm_page **pgs;  
         vaddr_t va, sva, eva;          vaddr_t va, sva, eva;
         vsize_t len;          vsize_t len;
         paddr_t pa;          paddr_t pa;
Line 164  sodoloanfree(caddr_t buf, u_int size)
Line 166  sodoloanfree(caddr_t buf, u_int size)
         len = eva - sva;          len = eva - sva;
         npgs = len >> PAGE_SHIFT;          npgs = len >> PAGE_SHIFT;
   
         pgs = alloca(npgs * sizeof(*pgs));          if (__predict_false(pgs == NULL)) {
                   pgs = alloca(npgs * sizeof(*pgs));
   
         for (i = 0, va = sva; va < eva; i++, va += PAGE_SIZE) {                  for (i = 0, va = sva; va < eva; i++, va += PAGE_SIZE) {
                 if (pmap_extract(pmap_kernel(), va, &pa) == FALSE)                          if (pmap_extract(pmap_kernel(), va, &pa) == FALSE)
                         panic("sodoloanfree: va 0x%lx not mapped", va);                                  panic("sodoloanfree: va 0x%lx not mapped", va);
                 pgs[i] = PHYS_TO_VM_PAGE(pa);                          pgs[i] = PHYS_TO_VM_PAGE(pa);
                   }
         }          }
   
         pmap_kremove(sva, len);          pmap_kremove(sva, len);
Line 198  sodopendfree(struct socket *so)
Line 202  sodopendfree(struct socket *so)
                 splx(s);                  splx(s);
   
                 rv += m->m_ext.ext_size;                  rv += m->m_ext.ext_size;
                 sodoloanfree(m->m_ext.ext_buf, m->m_ext.ext_size);                  sodoloanfree((m->m_flags & M_EXT_PAGES) ?
                       m->m_ext.ext_pgs : NULL, m->m_ext.ext_buf,
                       m->m_ext.ext_size);
                 s = splvm();                  s = splvm();
                 pool_cache_put(&mbpool_cache, m);                  pool_cache_put(&mbpool_cache, m);
         }          }
Line 211  sodopendfree(struct socket *so)
Line 217  sodopendfree(struct socket *so)
                 splx(s);                  splx(s);
   
                 rv += m->m_ext.ext_size;                  rv += m->m_ext.ext_size;
                 sodoloanfree(m->m_ext.ext_buf, m->m_ext.ext_size);                  sodoloanfree((m->m_flags & M_EXT_PAGES) ?
                       m->m_ext.ext_pgs : NULL, m->m_ext.ext_buf,
                       m->m_ext.ext_size);
                 s = splvm();                  s = splvm();
                 pool_cache_put(&mbpool_cache, m);                  pool_cache_put(&mbpool_cache, m);
         }          }
Line 221  sodopendfree(struct socket *so)
Line 229  sodopendfree(struct socket *so)
 }  }
   
 static void  static void
 soloanfree(struct mbuf *m, caddr_t buf, u_int size, void *arg)  soloanfree(struct mbuf *m, caddr_t buf, size_t size, void *arg)
 {  {
         struct socket *so = arg;          struct socket *so = arg;
         int s;          int s;
   
         if (m == NULL) {          if (m == NULL) {
                 sodoloanfree(buf, size);                  sodoloanfree(NULL, buf, size);
                 return;                  return;
         }          }
   
Line 245  sosend_loan(struct socket *so, struct ui
Line 253  sosend_loan(struct socket *so, struct ui
         struct iovec *iov = uio->uio_iov;          struct iovec *iov = uio->uio_iov;
         vaddr_t sva, eva;          vaddr_t sva, eva;
         vsize_t len;          vsize_t len;
         struct vm_page **pgs;  
         vaddr_t lva, va;          vaddr_t lva, va;
         int npgs, s, i, error;          int npgs, s, i, error;
   
Line 262  sosend_loan(struct socket *so, struct ui
Line 269  sosend_loan(struct socket *so, struct ui
         len = eva - sva;          len = eva - sva;
         npgs = len >> PAGE_SHIFT;          npgs = len >> PAGE_SHIFT;
   
           /* XXX KDASSERT */
           KASSERT(npgs <= M_EXT_MAXPAGES);
   
         while (socurkva + len > somaxkva) {          while (socurkva + len > somaxkva) {
                 if (sodopendfree(so))                  if (sodopendfree(so))
                         continue;                          continue;
Line 278  sosend_loan(struct socket *so, struct ui
Line 288  sosend_loan(struct socket *so, struct ui
                 return (0);                  return (0);
         socurkva += len;          socurkva += len;
   
         pgs = alloca(npgs * sizeof(*pgs));  
   
         error = uvm_loan(&uio->uio_procp->p_vmspace->vm_map, sva, len,          error = uvm_loan(&uio->uio_procp->p_vmspace->vm_map, sva, len,
             pgs, UVM_LOAN_TOPAGE);              m->m_ext.ext_pgs, UVM_LOAN_TOPAGE);
         if (error) {          if (error) {
                 uvm_km_free(kernel_map, lva, len);                  uvm_km_free(kernel_map, lva, len);
                 socurkva -= len;                  socurkva -= len;
Line 289  sosend_loan(struct socket *so, struct ui
Line 297  sosend_loan(struct socket *so, struct ui
         }          }
   
         for (i = 0, va = lva; i < npgs; i++, va += PAGE_SIZE)          for (i = 0, va = lva; i < npgs; i++, va += PAGE_SIZE)
                 pmap_kenter_pa(va, VM_PAGE_TO_PHYS(pgs[i]), VM_PROT_READ);                  pmap_kenter_pa(va, VM_PAGE_TO_PHYS(m->m_ext.ext_pgs[i]),
                       VM_PROT_READ);
         pmap_update(pmap_kernel());          pmap_update(pmap_kernel());
   
         lva += (vaddr_t) iov->iov_base & PAGE_MASK;          lva += (vaddr_t) iov->iov_base & PAGE_MASK;
   
         MEXTADD(m, (caddr_t) lva, space, M_MBUF, soloanfree, so);          MEXTADD(m, (caddr_t) lva, space, M_MBUF, soloanfree, so);
           m->m_flags |= M_EXT_PAGES | M_EXT_ROMAP;
   
         uio->uio_resid -= space;          uio->uio_resid -= space;
         /* uio_offset not updated, not set/used for write(2) */          /* uio_offset not updated, not set/used for write(2) */
Line 342  socreate(int dom, struct socket **aso, i
Line 352  socreate(int dom, struct socket **aso, i
         so->so_proto = prp;          so->so_proto = prp;
         so->so_send = sosend;          so->so_send = sosend;
         so->so_receive = soreceive;          so->so_receive = soreceive;
   #ifdef MBUFTRACE
           so->so_rcv.sb_mowner = &prp->pr_domain->dom_mowner;
           so->so_snd.sb_mowner = &prp->pr_domain->dom_mowner;
           so->so_mowner = &prp->pr_domain->dom_mowner;
   #endif
         if (p != 0)          if (p != 0)
                 so->so_uid = p->p_ucred->cr_uid;                  so->so_uid = p->p_ucred->cr_uid;
         error = (*prp->pr_usrreq)(so, PRU_ATTACH, (struct mbuf *)0,          error = (*prp->pr_usrreq)(so, PRU_ATTACH, (struct mbuf *)0,
Line 678  sosend(struct socket *so, struct mbuf *a
Line 693  sosend(struct socket *so, struct mbuf *a
                                         top->m_flags |= M_EOR;                                          top->m_flags |= M_EOR;
                         } else do {                          } else do {
                                 if (top == 0) {                                  if (top == 0) {
                                         MGETHDR(m, M_WAIT, MT_DATA);                                          m = m_gethdr(M_WAIT, MT_DATA);
                                         mlen = MHLEN;                                          mlen = MHLEN;
                                         m->m_pkthdr.len = 0;                                          m->m_pkthdr.len = 0;
                                         m->m_pkthdr.rcvif = (struct ifnet *)0;                                          m->m_pkthdr.rcvif = (struct ifnet *)0;
                                 } else {                                  } else {
                                         MGET(m, M_WAIT, MT_DATA);                                          m = m_get(M_WAIT, MT_DATA);
                                         mlen = MLEN;                                          mlen = MLEN;
                                 }                                  }
                                   MCLAIM(m, so->so_snd.sb_mowner);
                                 if (use_sosend_loan &&                                  if (use_sosend_loan &&
                                     uio->uio_iov->iov_len >= SOCK_LOAN_THRESH &&                                      uio->uio_iov->iov_len >= SOCK_LOAN_THRESH &&
                                     space >= SOCK_LOAN_THRESH &&                                      space >= SOCK_LOAN_THRESH &&
Line 697  sosend(struct socket *so, struct mbuf *a
Line 713  sosend(struct socket *so, struct mbuf *a
                                 }                                  }
                                 if (resid >= MINCLSIZE && space >= MCLBYTES) {                                  if (resid >= MINCLSIZE && space >= MCLBYTES) {
                                         SOSEND_COUNTER_INCR(&sosend_copy_big);                                          SOSEND_COUNTER_INCR(&sosend_copy_big);
                                         MCLGET(m, M_WAIT);                                          m_clget(m, M_WAIT);
                                         if ((m->m_flags & M_EXT) == 0)                                          if ((m->m_flags & M_EXT) == 0)
                                                 goto nopages;                                                  goto nopages;
                                         mlen = MCLBYTES;                                          mlen = MCLBYTES;
Line 1341  sosetopt(struct socket *so, int level, i
Line 1357  sosetopt(struct socket *so, int level, i
                                 goto bad;                                  goto bad;
                         }                          }
                         tv = mtod(m, struct timeval *);                          tv = mtod(m, struct timeval *);
                         if (tv->tv_sec * hz + tv->tv_usec / tick > SHRT_MAX) {                          if (tv->tv_sec > (SHRT_MAX - tv->tv_usec / tick) / hz) {
                                 error = EDOM;                                  error = EDOM;
                                 goto bad;                                  goto bad;
                         }                          }

Legend:
Removed from v.1.74  
changed lines
  Added in v.1.79

CVSweb <webmaster@jp.NetBSD.org>