[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.111.2.5 and 1.127

version 1.111.2.5, 2006/12/30 20:50:07 version 1.127, 2006/10/25 22:49:23
Line 151  static size_t sodopendfree(void);
Line 151  static size_t sodopendfree(void);
 static size_t sodopendfreel(void);  static size_t sodopendfreel(void);
   
 static vsize_t  static vsize_t
 sokvareserve(struct socket *so, vsize_t len)  sokvareserve(struct socket *so __unused, vsize_t len)
 {  {
         int s;          int s;
         int error;          int error;
Line 255  sokvafree(vaddr_t sva, vsize_t len)
Line 255  sokvafree(vaddr_t sva, vsize_t len)
 }  }
   
 static void  static void
 sodoloanfree(struct vm_page **pgs, caddr_t buf, size_t size, boolean_t mapped)  sodoloanfree(struct vm_page **pgs, caddr_t buf, size_t size)
 {  {
         vaddr_t sva, eva;          vaddr_t va, sva, eva;
         vsize_t len;          vsize_t len;
         int npgs;          paddr_t pa;
           int i, npgs;
         KASSERT(pgs != NULL);  
   
         eva = round_page((vaddr_t) buf + size);          eva = round_page((vaddr_t) buf + size);
         sva = trunc_page((vaddr_t) buf);          sva = trunc_page((vaddr_t) buf);
         len = eva - sva;          len = eva - sva;
         npgs = len >> PAGE_SHIFT;          npgs = len >> PAGE_SHIFT;
   
         if (mapped) {          if (__predict_false(pgs == NULL)) {
                 pmap_kremove(sva, len);                  pgs = alloca(npgs * sizeof(*pgs));
                 pmap_update(pmap_kernel());  
                   for (i = 0, va = sva; va < eva; i++, va += PAGE_SIZE) {
                           if (pmap_extract(pmap_kernel(), va, &pa) == FALSE)
                                   panic("sodoloanfree: va 0x%lx not mapped", va);
                           pgs[i] = PHYS_TO_VM_PAGE(pa);
                   }
         }          }
   
           pmap_kremove(sva, len);
           pmap_update(pmap_kernel());
         uvm_unloan(pgs, npgs, UVM_LOAN_TOPAGE);          uvm_unloan(pgs, npgs, UVM_LOAN_TOPAGE);
         sokvafree(sva, len);          sokvafree(sva, len);
 }  }
Line 319  sodopendfreel()
Line 326  sodopendfreel()
   
                 for (; m != NULL; m = next) {                  for (; m != NULL; m = next) {
                         next = m->m_next;                          next = m->m_next;
                         KASSERT((~m->m_flags & (M_EXT|M_EXT_PAGES)) == 0);  
                         KASSERT(m->m_ext.ext_refcnt == 0);  
   
                         rv += m->m_ext.ext_size;                          rv += m->m_ext.ext_size;
                         sodoloanfree(m->m_ext.ext_pgs, m->m_ext.ext_buf,                          sodoloanfree((m->m_flags & M_EXT_PAGES) ?
                             m->m_ext.ext_size,                              m->m_ext.ext_pgs : NULL, m->m_ext.ext_buf,
                             (m->m_ext.ext_flags & M_EXT_LAZY) == 0);                              m->m_ext.ext_size);
                         pool_cache_put(&mbpool_cache, m);                          pool_cache_put(&mbpool_cache, m);
                 }                  }
   
Line 337  sodopendfreel()
Line 342  sodopendfreel()
 }  }
   
 void  void
 soloanfree(struct mbuf *m, caddr_t buf, size_t size, void *arg)  soloanfree(struct mbuf *m, caddr_t buf, size_t size, void *arg __unused)
 {  {
         int s;          int s;
   
         KASSERT(m != NULL);          if (m == NULL) {
   
                   /*
                    * called from MEXTREMOVE.
                    */
   
                   sodoloanfree(NULL, buf, size);
                   return;
           }
   
         /*          /*
          * postpone freeing mbuf.           * postpone freeing mbuf.
Line 366  sosend_loan(struct socket *so, struct ui
Line 379  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;
         vaddr_t lva;          vaddr_t lva, va;
         int npgs, error;          int npgs, i, error;
 #if !defined(__HAVE_LAZY_MBUF)  
         vaddr_t va;  
         int i;  
 #endif /* !defined(__HAVE_LAZY_MBUF) */  
   
         if (VMSPACE_IS_KERNEL_P(uio->uio_vmspace))          if (VMSPACE_IS_KERNEL_P(uio->uio_vmspace))
                 return (0);                  return (0);
Line 400  sosend_loan(struct socket *so, struct ui
Line 409  sosend_loan(struct socket *so, struct ui
                 return (0);                  return (0);
         }          }
   
 #if !defined(__HAVE_LAZY_MBUF)  
         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(m->m_ext.ext_pgs[i]),                  pmap_kenter_pa(va, VM_PAGE_TO_PHYS(m->m_ext.ext_pgs[i]),
                     VM_PROT_READ);                      VM_PROT_READ);
         pmap_update(pmap_kernel());          pmap_update(pmap_kernel());
 #endif /* !defined(__HAVE_LAZY_MBUF) */  
   
         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;          m->m_flags |= M_EXT_PAGES | M_EXT_ROMAP;
   
 #if defined(__HAVE_LAZY_MBUF)  
         m->m_flags |= M_EXT_LAZY;  
         m->m_ext.ext_flags |= M_EXT_LAZY;  
 #endif /* defined(__HAVE_LAZY_MBUF) */  
   
         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) */
         uio->uio_iov->iov_base = (caddr_t) uio->uio_iov->iov_base + space;          uio->uio_iov->iov_base = (caddr_t) uio->uio_iov->iov_base + space;
Line 430  sosend_loan(struct socket *so, struct ui
Line 432  sosend_loan(struct socket *so, struct ui
 }  }
   
 static int  static int
 sokva_reclaim_callback(struct callback_entry *ce, void *obj, void *arg)  sokva_reclaim_callback(struct callback_entry *ce __unused, void *obj __unused,
       void *arg __unused)
 {  {
   
         KASSERT(ce == &sokva_reclaimerentry);          KASSERT(ce == &sokva_reclaimerentry);
Line 472  socreate(int dom, struct socket **aso, i
Line 475  socreate(int dom, struct socket **aso, i
         int             error, s;          int             error, s;
   
         if (kauth_authorize_network(l->l_cred, KAUTH_NETWORK_SOCKET,          if (kauth_authorize_network(l->l_cred, KAUTH_NETWORK_SOCKET,
             KAUTH_REQ_NETWORK_SOCKET_OPEN, (void *)(u_long)dom,              KAUTH_REQ_NETWORK_SOCKET_OPEN, &dom, &type, &proto) != 0)
             (void *)(u_long)type, (void *)(u_long)proto) != 0)  
                 return (EPERM);                  return (EPERM);
   
         if (proto)          if (proto)
Line 1420  sosetopt(struct socket *so, int level, i
Line 1422  sosetopt(struct socket *so, int level, i
 {  {
         int             error;          int             error;
         struct mbuf     *m;          struct mbuf     *m;
         struct linger   *l;  
   
         error = 0;          error = 0;
         m = m0;          m = m0;
Line 1437  sosetopt(struct socket *so, int level, i
Line 1438  sosetopt(struct socket *so, int level, i
                                 error = EINVAL;                                  error = EINVAL;
                                 goto bad;                                  goto bad;
                         }                          }
                         l = mtod(m, struct linger *);                          if (mtod(m, struct linger *)->l_linger < 0 ||
                         if (l->l_linger < 0 || l->l_linger > USHRT_MAX ||                              mtod(m, struct linger *)->l_linger > (INT_MAX / hz)) {
                             l->l_linger > (INT_MAX / hz)) {  
                                 error = EDOM;                                  error = EDOM;
                                 goto bad;                                  goto bad;
                         }                          }
                         so->so_linger = l->l_linger;                          so->so_linger = mtod(m, struct linger *)->l_linger;
                         if (l->l_onoff)                          /* fall thru... */
                                 so->so_options |= SO_LINGER;  
                         else  
                                 so->so_options &= ~SO_LINGER;  
                         break;  
   
                 case SO_DEBUG:                  case SO_DEBUG:
                 case SO_KEEPALIVE:                  case SO_KEEPALIVE:
Line 1588  sogetopt(struct socket *so, int level, i
Line 1584  sogetopt(struct socket *so, int level, i
                 case SO_LINGER:                  case SO_LINGER:
                         m->m_len = sizeof(struct linger);                          m->m_len = sizeof(struct linger);
                         mtod(m, struct linger *)->l_onoff =                          mtod(m, struct linger *)->l_onoff =
                             (so->so_options & SO_LINGER) ? 1 : 0;                                  so->so_options & SO_LINGER;
                         mtod(m, struct linger *)->l_linger = so->so_linger;                          mtod(m, struct linger *)->l_linger = so->so_linger;
                         break;                          break;
   
Line 1601  sogetopt(struct socket *so, int level, i
Line 1597  sogetopt(struct socket *so, int level, i
                 case SO_BROADCAST:                  case SO_BROADCAST:
                 case SO_OOBINLINE:                  case SO_OOBINLINE:
                 case SO_TIMESTAMP:                  case SO_TIMESTAMP:
                         *mtod(m, int *) = (so->so_options & optname) ? 1 : 0;                          *mtod(m, int *) = so->so_options & optname;
                         break;                          break;
   
                 case SO_TYPE:                  case SO_TYPE:
Line 1675  filt_sordetach(struct knote *kn)
Line 1671  filt_sordetach(struct knote *kn)
   
 /*ARGSUSED*/  /*ARGSUSED*/
 static int  static int
 filt_soread(struct knote *kn, long hint)  filt_soread(struct knote *kn, long hint __unused)
 {  {
         struct socket   *so;          struct socket   *so;
   
Line 1706  filt_sowdetach(struct knote *kn)
Line 1702  filt_sowdetach(struct knote *kn)
   
 /*ARGSUSED*/  /*ARGSUSED*/
 static int  static int
 filt_sowrite(struct knote *kn, long hint)  filt_sowrite(struct knote *kn, long hint __unused)
 {  {
         struct socket   *so;          struct socket   *so;
   
Line 1729  filt_sowrite(struct knote *kn, long hint
Line 1725  filt_sowrite(struct knote *kn, long hint
   
 /*ARGSUSED*/  /*ARGSUSED*/
 static int  static int
 filt_solisten(struct knote *kn, long hint)  filt_solisten(struct knote *kn, long hint __unused)
 {  {
         struct socket   *so;          struct socket   *so;
   
Line 1751  static const struct filterops sowrite_fi
Line 1747  static const struct filterops sowrite_fi
         { 1, NULL, filt_sowdetach, filt_sowrite };          { 1, NULL, filt_sowdetach, filt_sowrite };
   
 int  int
 soo_kqfilter(struct file *fp, struct knote *kn)  soo_kqfilter(struct file *fp __unused, struct knote *kn)
 {  {
         struct socket   *so;          struct socket   *so;
         struct sockbuf  *sb;          struct sockbuf  *sb;

Legend:
Removed from v.1.111.2.5  
changed lines
  Added in v.1.127

CVSweb <webmaster@jp.NetBSD.org>