[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.141.2.4 and 1.151.6.1

version 1.141.2.4, 2008/03/23 02:05:01 version 1.151.6.1, 2008/04/03 12:43:05
Line 1 
Line 1 
 /*      uipc_socket.c,v 1.141.2.3 2008/01/09 01:56:28 matt Exp  */  /*      $NetBSD$        */
   
 /*-  /*-
  * Copyright (c) 2002, 2007, 2008 The NetBSD Foundation, Inc.   * Copyright (c) 2002, 2007, 2008 The NetBSD Foundation, Inc.
Line 68 
Line 68 
  */   */
   
 #include <sys/cdefs.h>  #include <sys/cdefs.h>
 __KERNEL_RCSID(0, "uipc_socket.c,v 1.141.2.3 2008/01/09 01:56:28 matt Exp");  __KERNEL_RCSID(0, "$NetBSD$");
   
 #include "opt_sock_counters.h"  #include "opt_sock_counters.h"
 #include "opt_sosend_loan.h"  #include "opt_sosend_loan.h"
Line 253  sokvafree(vaddr_t sva, vsize_t len)
Line 253  sokvafree(vaddr_t sva, vsize_t len)
 static void  static void
 sodoloanfree(struct vm_page **pgs, void *buf, size_t size)  sodoloanfree(struct vm_page **pgs, void *buf, size_t size)
 {  {
         vaddr_t va, sva, eva;          vaddr_t sva, eva;
         vsize_t len;          vsize_t len;
         paddr_t pa;          int npgs;
         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 (__predict_false(pgs == NULL)) {  
                 pgs = alloca(npgs * sizeof(*pgs));  
   
                 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_kremove(sva, len);
         pmap_update(pmap_kernel());          pmap_update(pmap_kernel());
         uvm_unloan(pgs, npgs, UVM_LOAN_TOPAGE);          uvm_unloan(pgs, npgs, UVM_LOAN_TOPAGE);
Line 313  sodopendfreel(void)
Line 304  sodopendfreel(void)
   
                 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_flags & M_EXT_PAGES) ?                          sodoloanfree(m->m_ext.ext_pgs, m->m_ext.ext_buf,
                             m->m_ext.ext_pgs : NULL, m->m_ext.ext_buf,  
                             m->m_ext.ext_size);                              m->m_ext.ext_size);
                         pool_cache_put(mb_cache, m);                          pool_cache_put(mb_cache, m);
                 }                  }
Line 331  void
Line 323  void
 soloanfree(struct mbuf *m, void *buf, size_t size, void *arg)  soloanfree(struct mbuf *m, void *buf, size_t size, void *arg)
 {  {
   
         if (m == NULL) {          KASSERT(m != NULL);
   
                 /*  
                  * called from MEXTREMOVE.  
                  */  
   
                 sodoloanfree(NULL, buf, size);  
                 return;  
         }  
   
         /*          /*
          * postpone freeing mbuf.           * postpone freeing mbuf.
Line 361  sosend_loan(struct socket *so, struct ui
Line 345  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, va;          vaddr_t lva;
         int npgs, i, error;          int npgs, error;
           vaddr_t va;
           int i;
   
         if (VMSPACE_IS_KERNEL_P(uio->uio_vmspace))          if (VMSPACE_IS_KERNEL_P(uio->uio_vmspace))
                 return (0);                  return (0);
Line 540  int
Line 526  int
 fsocreate(int domain, struct socket **sop, int type, int protocol,  fsocreate(int domain, struct socket **sop, int type, int protocol,
     struct lwp *l, int *fdout)      struct lwp *l, int *fdout)
 {  {
         struct filedesc *fdp;  
         struct socket   *so;          struct socket   *so;
         struct file     *fp;          struct file     *fp;
         int             fd, error;          int             fd, error;
   
         fdp = l->l_proc->p_fd;          if ((error = fd_allocfile(&fp, &fd)) != 0)
         /* falloc() will use the desciptor for us */  
         if ((error = falloc(l, &fp, &fd)) != 0)  
                 return (error);                  return (error);
         fp->f_flag = FREAD|FWRITE;          fp->f_flag = FREAD|FWRITE;
         fp->f_type = DTYPE_SOCKET;          fp->f_type = DTYPE_SOCKET;
         fp->f_ops = &socketops;          fp->f_ops = &socketops;
         error = socreate(domain, &so, type, protocol, l);          error = socreate(domain, &so, type, protocol, l);
         if (error != 0) {          if (error != 0) {
                 FILE_UNUSE(fp, l);                  fd_abort(curproc, fp, fd);
                 fdremove(fdp, fd);  
                 ffree(fp);  
         } else {          } else {
                 if (sop != NULL)                  if (sop != NULL)
                         *sop = so;                          *sop = so;
                 fp->f_data = so;                  fp->f_data = so;
                 FILE_SET_MATURE(fp);                  fd_affix(curproc, fp, fd);
                 FILE_UNUSE(fp, l);  
                 *fdout = fd;                  *fdout = fd;
         }          }
         return error;          return error;
Line 585  solisten(struct socket *so, int backlog,
Line 565  solisten(struct socket *so, int backlog,
         int     s, error;          int     s, error;
   
         s = splsoftnet();          s = splsoftnet();
           if ((so->so_state & (SS_ISCONNECTED | SS_ISCONNECTING |
               SS_ISDISCONNECTING)) != 0)
                   return (EOPNOTSUPP);
         error = (*so->so_proto->pr_usrreq)(so, PRU_LISTEN, NULL,          error = (*so->so_proto->pr_usrreq)(so, PRU_LISTEN, NULL,
             NULL, NULL, l);              NULL, NULL, l);
         if (error != 0) {          if (error != 0) {
Line 834  sosend(struct socket *so, struct mbuf *a
Line 817  sosend(struct socket *so, struct mbuf *a
         dontroute =          dontroute =
             (flags & MSG_DONTROUTE) && (so->so_options & SO_DONTROUTE) == 0 &&              (flags & MSG_DONTROUTE) && (so->so_options & SO_DONTROUTE) == 0 &&
             (so->so_proto->pr_flags & PR_ATOMIC);              (so->so_proto->pr_flags & PR_ATOMIC);
         if (p)          if (l)
                 p->p_stats->p_ru.ru_msgsnd++;                  l->l_ru.ru_msgsnd++;
         if (control)          if (control)
                 clen = control->m_len;                  clen = control->m_len;
 #define snderr(errno)   { error = errno; splx(s); goto release; }  #define snderr(errno)   { error = errno; splx(s); goto release; }
Line 1129  soreceive(struct socket *so, struct mbuf
Line 1112  soreceive(struct socket *so, struct mbuf
          * info, we save a copy of m->m_nextpkt into nextrecord.           * info, we save a copy of m->m_nextpkt into nextrecord.
          */           */
         if (l != NULL)          if (l != NULL)
                 l->l_proc->p_stats->p_ru.ru_msgrcv++;                  l->l_ru.ru_msgrcv++;
         KASSERT(m == so->so_rcv.sb_mb);          KASSERT(m == so->so_rcv.sb_mb);
         SBLASTRECORDCHK(&so->so_rcv, "soreceive 1");          SBLASTRECORDCHK(&so->so_rcv, "soreceive 1");
         SBLASTMBUFCHK(&so->so_rcv, "soreceive 1");          SBLASTMBUFCHK(&so->so_rcv, "soreceive 1");
Line 1692  filt_sordetach(struct knote *kn)
Line 1675  filt_sordetach(struct knote *kn)
 {  {
         struct socket   *so;          struct socket   *so;
   
         so = (struct socket *)kn->kn_fp->f_data;          so = ((file_t *)kn->kn_obj)->f_data;
         SLIST_REMOVE(&so->so_rcv.sb_sel.sel_klist, kn, knote, kn_selnext);          SLIST_REMOVE(&so->so_rcv.sb_sel.sel_klist, kn, knote, kn_selnext);
         if (SLIST_EMPTY(&so->so_rcv.sb_sel.sel_klist))          if (SLIST_EMPTY(&so->so_rcv.sb_sel.sel_klist))
                 so->so_rcv.sb_flags &= ~SB_KNOTE;                  so->so_rcv.sb_flags &= ~SB_KNOTE;
Line 1704  filt_soread(struct knote *kn, long hint)
Line 1687  filt_soread(struct knote *kn, long hint)
 {  {
         struct socket   *so;          struct socket   *so;
   
         so = (struct socket *)kn->kn_fp->f_data;          so = ((file_t *)kn->kn_obj)->f_data;
         kn->kn_data = so->so_rcv.sb_cc;          kn->kn_data = so->so_rcv.sb_cc;
         if (so->so_state & SS_CANTRCVMORE) {          if (so->so_state & SS_CANTRCVMORE) {
                 kn->kn_flags |= EV_EOF;                  kn->kn_flags |= EV_EOF;
Line 1723  filt_sowdetach(struct knote *kn)
Line 1706  filt_sowdetach(struct knote *kn)
 {  {
         struct socket   *so;          struct socket   *so;
   
         so = (struct socket *)kn->kn_fp->f_data;          so = ((file_t *)kn->kn_obj)->f_data;
         SLIST_REMOVE(&so->so_snd.sb_sel.sel_klist, kn, knote, kn_selnext);          SLIST_REMOVE(&so->so_snd.sb_sel.sel_klist, kn, knote, kn_selnext);
         if (SLIST_EMPTY(&so->so_snd.sb_sel.sel_klist))          if (SLIST_EMPTY(&so->so_snd.sb_sel.sel_klist))
                 so->so_snd.sb_flags &= ~SB_KNOTE;                  so->so_snd.sb_flags &= ~SB_KNOTE;
Line 1735  filt_sowrite(struct knote *kn, long hint
Line 1718  filt_sowrite(struct knote *kn, long hint
 {  {
         struct socket   *so;          struct socket   *so;
   
         so = (struct socket *)kn->kn_fp->f_data;          so = ((file_t *)kn->kn_obj)->f_data;
         kn->kn_data = sbspace(&so->so_snd);          kn->kn_data = sbspace(&so->so_snd);
         if (so->so_state & SS_CANTSENDMORE) {          if (so->so_state & SS_CANTSENDMORE) {
                 kn->kn_flags |= EV_EOF;                  kn->kn_flags |= EV_EOF;
Line 1758  filt_solisten(struct knote *kn, long hin
Line 1741  filt_solisten(struct knote *kn, long hin
 {  {
         struct socket   *so;          struct socket   *so;
   
         so = (struct socket *)kn->kn_fp->f_data;          so = ((file_t *)kn->kn_obj)->f_data;
   
         /*          /*
          * Set kn_data to number of incoming connections, not           * Set kn_data to number of incoming connections, not
Line 1781  soo_kqfilter(struct file *fp, struct kno
Line 1764  soo_kqfilter(struct file *fp, struct kno
         struct socket   *so;          struct socket   *so;
         struct sockbuf  *sb;          struct sockbuf  *sb;
   
         so = (struct socket *)kn->kn_fp->f_data;          so = ((file_t *)kn->kn_obj)->f_data;
         switch (kn->kn_filter) {          switch (kn->kn_filter) {
         case EVFILT_READ:          case EVFILT_READ:
                 if (so->so_options & SO_ACCEPTCONN)                  if (so->so_options & SO_ACCEPTCONN)

Legend:
Removed from v.1.141.2.4  
changed lines
  Added in v.1.151.6.1

CVSweb <webmaster@jp.NetBSD.org>