Mike Silbersack wrote:
> On Wed, 9 Oct 2002, Christopher Smith wrote:
> > The rule processing can't be done on the other CPU, can it ?  Am I right in
> > saying that at this point in time, buying a dual CPU (vs single CPU) machine
> > for firewalling with FreeBSD is just a waste of money ?
> 
> Even if it could be done, I doubt that would be the most cost effectively
> solution to the problem.  Try out different NICs, then move on to kernel
> profiling if it's still a problem.
> 
> Luigi can probably comment more on this, but one thing which comes to mind
> is that the if_ti driver might not be updated to use the new m_getcl
> function Luigi added.  Luigi claimed a 10% increase in forwarding speed
> for drivers using it, I believe. :)


Please find attached a patch for the if_ti to support DEVICE_POLLING
(the patch is against -current).

-- Terry
Index: if_ti.c
===================================================================
RCS file: /cvs/src/sys/pci/if_ti.c,v
retrieving revision 1.63
diff -c -r1.63 if_ti.c
*** if_ti.c     24 Aug 2002 00:02:03 -0000      1.63
--- if_ti.c     11 Oct 2002 20:09:48 -0000
***************
*** 2520,2525 ****
--- 2520,2533 ----
                u_int16_t               vlan_tag = 0;
                int                     have_tag = 0;
  
+ #ifdef DEVICE_POLLING
+               if (ifp->if_flags & IFF_POLLING) {
+                       if (sc->rxcycles <= 0)
+                               break;
+                       sc->rxcycles--;
+               }
+ #endif /* DEVICE_POLLING */
+ 
                cur_rx =
                    &sc->ti_rdata->ti_rx_return_ring[sc->ti_rx_saved_considx];
                rxidx = cur_rx->ti_idx;
***************
*** 2678,2683 ****
--- 2686,2731 ----
        return;
  }
  
+ #ifdef DEVICE_POLLING
+ static poll_handler_t ti_poll;
+ 
+ static void
+ ti_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
+ {
+       struct  ti_softc *sc = ifp->if_softc;
+ 
+       TI_LOCK(sc);
+       if (cmd == POLL_DEREGISTER) { /* final call, enable interrupts */
+               CSR_WRITE_4(sc, TI_MB_HOSTINTR, 0);
+               goto done;
+       }
+ 
+       /*
+        * Before returning to intr mode we must make sure that all
+        * possible pending sources of interrupts have been served.
+        * In practice this means run to completion the *eof routines,
+        * and then call the interrupt routine
+        */
+       sc->rxcycles = count;
+       if (ifp->if_snd.ifq_head != NULL)
+               ti_start(ifp);
+ 
+       if (sc->rxcycles > 0 || cmd == POLL_AND_CHECK_STATUS) {
+               if (ifp->if_flags & IFF_RUNNING) {
+                       /* Check RX return ring producer/consumer */
+                       ti_rxeof(sc);
+ 
+                       /* Check TX ring producer/consumer */
+                       ti_txeof(sc);
+               }
+               ti_handle_events(sc);
+       }
+ done:
+       TI_UNLOCK(sc);
+       return;
+ }
+ #endif /* DEVICE_POLLING */
+ 
  static void
  ti_intr(xsc)
        void                    *xsc;
***************
*** 2688,2693 ****
--- 2736,2749 ----
        sc = xsc;
        TI_LOCK(sc);
        ifp = &sc->arpcom.ac_if;
+ #ifdef DEVICE_POLLING
+       if (ifp->if_flags & IFF_POLLING)
+               goto done;
+       if (ether_poll_register(ti_poll, ifp)) { /* ok, disable interrupts */
+               CSR_WRITE_4(sc, TI_MB_HOSTINTR, 1);
+               goto done;
+       }
+ #endif /* DEVICE_POLLING */
  
  /*#ifdef notdef*/
        /* Avoid this for now -- checking this register is expensive. */
***************
*** 2716,2722 ****
  
        if (ifp->if_flags & IFF_RUNNING && ifp->if_snd.ifq_head != NULL)
                ti_start(ifp);
! 
        TI_UNLOCK(sc);
  
        return;
--- 2772,2780 ----
  
        if (ifp->if_flags & IFF_RUNNING && ifp->if_snd.ifq_head != NULL)
                ti_start(ifp);
! #ifdef DEVICE_POLLING
! done:
! #endif /* DEVICE_POLLING */
        TI_UNLOCK(sc);
  
        return;
***************
*** 2999,3004 ****
--- 3057,3071 ----
        TI_DO_CMD(TI_CMD_HOST_STATE, TI_CMD_CODE_STACK_UP, 0);
  
        /* Enable host interrupts. */
+ #ifdef DEVICE_POLLING
+       /*
+        * ... only enable interrupts if we are not polling, make sure
+        * they are off otherwise.
+        */
+       if (ifp->if_flags & IFF_POLLING)
+               CSR_WRITE_4(sc, TI_MB_HOSTINTR, 1);
+       else
+ #endif /* DEVICE_POLLING */
        CSR_WRITE_4(sc, TI_MB_HOSTINTR, 0);
  
        ifp->if_flags |= IFF_RUNNING;
***************
*** 3613,3618 ****
--- 3680,3688 ----
        TI_LOCK(sc);
  
        ifp = &sc->arpcom.ac_if;
+ #ifdef DEVICE_POLLING
+       ether_poll_deregister(ifp);
+ #endif
  
        /* Disable host interrupts. */
        CSR_WRITE_4(sc, TI_MB_HOSTINTR, 1);
Index: if_tireg.h
===================================================================
RCS file: /cvs/src/sys/pci/if_tireg.h,v
retrieving revision 1.25
diff -c -r1.25 if_tireg.h
*** if_tireg.h  26 Jun 2002 03:34:52 -0000      1.25
--- if_tireg.h  11 Oct 2002 19:25:04 -0000
***************
*** 1026,1031 ****
--- 1026,1034 ----
        struct mtx              ti_mtx;
        ti_flag_vals            ti_flags;
        dev_t                   dev;
+ #ifdef DEVICE_POLLING
+       int                     rxcycles;
+ #endif
  };
  
  #define       TI_LOCK(_sc)            mtx_lock(&(_sc)->ti_mtx)

Reply via email to