Diff for /src/sys/netinet/tcp_subr.c between versions 1.14 and 1.15

version 1.14, 2004/03/08 19:44:32 version 1.15, 2004/03/14 07:57:26
Line 785  tcp_close(tp) Line 785  tcp_close(tp)
         return ((struct tcpcb *)0);          return ((struct tcpcb *)0);
 }  }
   
void#ifdef SMP
tcp_drain()struct netmsg_tcp_drain {
         struct lwkt_msg         nm_lmsg;
         netisr_fn_t             nm_handler;
         struct inpcbhead        *nm_head;
 };
 
 static int              /* really should be void XXX JH */
 tcp_drain_handler(struct netmsg *msg0)
 {
         struct netmsg_tcp_drain *nm = (struct netmsg_tcp_drain *)msg0;
 
         tcp_drain_oncpu(nm->nm_head);
 
         return (0);     /* dummy return value */
 }
 #endif
 
 static __inline void
 tcp_drain_oncpu(struct inpcbhead *head)
 {  {
         struct inpcb *inpb;          struct inpcb *inpb;
         struct tcpcb *tcpb;          struct tcpcb *tcpb;
         struct tseg_qent *te;          struct tseg_qent *te;
   
           LIST_FOREACH(inpb, head, inp_list) {
                   if ((tcpb = intotcpcb(inpb))) {
                           while ((te = LIST_FIRST(&tcpb->t_segq)) != NULL) {
                                   LIST_REMOVE(te, tqe_q);
                                   m_freem(te->tqe_m);
                                   FREE(te, M_TSEGQ);
                                   tcp_reass_qsize--;
                           }
                   }
           }
   }
   
   void
   tcp_drain()
   {
         int cpu;          int cpu;
   
         if (!do_tcpdrain)          if (!do_tcpdrain)
Line 804  tcp_drain() Line 838  tcp_drain()
          *      where we're really low on mbufs, this is potentially           *      where we're really low on mbufs, this is potentially
          *      usefull.                   *      usefull.        
          */           */
   #ifdef SMP
         for (cpu = 0; cpu < ncpus2; cpu++) {          for (cpu = 0; cpu < ncpus2; cpu++) {
                LIST_FOREACH(inpb, &tcbinfo[cpu].listhead, inp_list) {                struct netmsg_tcp_drain *msg;
                        if ((tcpb = intotcpcb(inpb))) {
                                while ((te = LIST_FIRST(&tcpb->t_segq))                if (cpu == mycpu->gd_cupid) {
                                    != NULL) {                        tcp_drain_oncpu(&tcbinfo[cpu].listhead);
                                        LIST_REMOVE(te, tqe_q);                } else {
                                        m_freem(te->tqe_m);                        msg = malloc(sizeof(struct netmsg_tcp_drain),
                                        FREE(te, M_TSEGQ);                            M_LWKTMSG, M_NOWAIT);
                                        tcp_reass_qsize--;                        if (!msg)
                                }                                continue;
                        }                        lwkt_initmsg_rp(&msg->nm_lmsg, netisr_afree_rport,
                             CMD_NETMSG_TCP_DRAIN);
                         msg->nm_handler = tcp_drain_handler;
                         msg->nm_head = &tcbinfo[cpu].listhead;
                         lwkt_sendmsg(tcp_cport(cpu), &msg->nm_lmsg);
                 }                  }
         }          }
   #else
           tcp_drain_oncpu(&tcbinfo[0].listhead);
   #endif
 }  }
   
 /*  /*

Removed from v.1.14  
changed lines
  Added in v.1.15