Author: luigi
Date: Tue Apr 30 16:18:29 2013
New Revision: 250108
URL: http://svnweb.freebsd.org/changeset/base/250108

Log:
  use netmap_rx_irq() / netmap_tx_irq() to handle interrupts in
  netmap mode, removing the logic from individual drivers.
  
  (note: if_lem.c not updated yet due to some other pending modifications)

Modified:
  head/sys/dev/e1000/if_em.c
  head/sys/dev/e1000/if_igb.c
  head/sys/dev/ixgbe/ixgbe.c
  head/sys/dev/re/if_re.c

Modified: head/sys/dev/e1000/if_em.c
==============================================================================
--- head/sys/dev/e1000/if_em.c  Tue Apr 30 16:08:34 2013        (r250107)
+++ head/sys/dev/e1000/if_em.c  Tue Apr 30 16:18:29 2013        (r250108)
@@ -3828,17 +3828,9 @@ em_txeof(struct tx_ring *txr)
 
        EM_TX_LOCK_ASSERT(txr);
 #ifdef DEV_NETMAP
-       if (ifp->if_capenable & IFCAP_NETMAP) {
-               struct netmap_adapter *na = NA(ifp);
-
-               selwakeuppri(&na->tx_rings[txr->me].si, PI_NET);
-               EM_TX_UNLOCK(txr);
-               EM_CORE_LOCK(adapter);
-               selwakeuppri(&na->tx_si, PI_NET);
-               EM_CORE_UNLOCK(adapter);
-               EM_TX_LOCK(txr);
+       if (netmap_tx_irq(ifp, txr->me |
+           (NETMAP_LOCKED_ENTER | NETMAP_LOCKED_EXIT)))
                return;
-       }
 #endif /* DEV_NETMAP */
 
        /* No work, make sure watchdog is off */
@@ -4440,17 +4432,8 @@ em_rxeof(struct rx_ring *rxr, int count,
        EM_RX_LOCK(rxr);
 
 #ifdef DEV_NETMAP
-       if (ifp->if_capenable & IFCAP_NETMAP) {
-               struct netmap_adapter *na = NA(ifp);
-
-               na->rx_rings[rxr->me].nr_kflags |= NKR_PENDINTR;
-               selwakeuppri(&na->rx_rings[rxr->me].si, PI_NET);
-               EM_RX_UNLOCK(rxr);
-               EM_CORE_LOCK(adapter);
-               selwakeuppri(&na->rx_si, PI_NET);
-               EM_CORE_UNLOCK(adapter);
-               return (0);
-       }
+       if (netmap_rx_irq(ifp, rxr->me | NETMAP_LOCKED_ENTER, &processed))
+               return (FALSE);
 #endif /* DEV_NETMAP */
 
        for (i = rxr->next_to_check, processed = 0; count != 0;) {

Modified: head/sys/dev/e1000/if_igb.c
==============================================================================
--- head/sys/dev/e1000/if_igb.c Tue Apr 30 16:08:34 2013        (r250107)
+++ head/sys/dev/e1000/if_igb.c Tue Apr 30 16:18:29 2013        (r250108)
@@ -3897,17 +3897,9 @@ igb_txeof(struct tx_ring *txr)
        IGB_TX_LOCK_ASSERT(txr);
 
 #ifdef DEV_NETMAP
-       if (ifp->if_capenable & IFCAP_NETMAP) {
-               struct netmap_adapter *na = NA(ifp);
-
-               selwakeuppri(&na->tx_rings[txr->me].si, PI_NET);
-               IGB_TX_UNLOCK(txr);
-               IGB_CORE_LOCK(adapter);
-               selwakeuppri(&na->tx_si, PI_NET);
-               IGB_CORE_UNLOCK(adapter);
-               IGB_TX_LOCK(txr);
-               return FALSE;
-       }
+       if (netmap_tx_irq(ifp, txr->me |
+           (NETMAP_LOCKED_ENTER|NETMAP_LOCKED_EXIT)))
+               return (FALSE);
 #endif /* DEV_NETMAP */
         if (txr->tx_avail == adapter->num_tx_desc) {
                txr->queue_status = IGB_QUEUE_IDLE;
@@ -4761,17 +4753,8 @@ igb_rxeof(struct igb_queue *que, int cou
            BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
 
 #ifdef DEV_NETMAP
-       if (ifp->if_capenable & IFCAP_NETMAP) {
-               struct netmap_adapter *na = NA(ifp);
-
-               na->rx_rings[rxr->me].nr_kflags |= NKR_PENDINTR;
-               selwakeuppri(&na->rx_rings[rxr->me].si, PI_NET);
-               IGB_RX_UNLOCK(rxr);
-               IGB_CORE_LOCK(adapter);
-               selwakeuppri(&na->rx_si, PI_NET);
-               IGB_CORE_UNLOCK(adapter);
-               return (0);
-       }
+       if (netmap_rx_irq(ifp, rxr->me | NETMAP_LOCKED_ENTER, &processed))
+               return (FALSE);
 #endif /* DEV_NETMAP */
 
        /* Main clean loop */

Modified: head/sys/dev/ixgbe/ixgbe.c
==============================================================================
--- head/sys/dev/ixgbe/ixgbe.c  Tue Apr 30 16:08:34 2013        (r250107)
+++ head/sys/dev/ixgbe/ixgbe.c  Tue Apr 30 16:18:29 2013        (r250108)
@@ -3597,13 +3597,8 @@ ixgbe_txeof(struct tx_ring *txr)
                if (!netmap_mitigate ||
                    (kring->nr_kflags < kring->nkr_num_slots &&
                    txd[kring->nr_kflags].wb.status & IXGBE_TXD_STAT_DD)) {
-                       kring->nr_kflags = kring->nkr_num_slots;
-                       selwakeuppri(&na->tx_rings[txr->me].si, PI_NET);
-                       IXGBE_TX_UNLOCK(txr);
-                       IXGBE_CORE_LOCK(adapter);
-                       selwakeuppri(&na->tx_si, PI_NET);
-                       IXGBE_CORE_UNLOCK(adapter);
-                       IXGBE_TX_LOCK(txr);
+                       netmap_tx_irq(ifp, txr->me |
+                           (NETMAP_LOCKED_ENTER|NETMAP_LOCKED_EXIT));
                }
                return FALSE;
        }
@@ -4388,23 +4383,9 @@ ixgbe_rxeof(struct ix_queue *que)
        IXGBE_RX_LOCK(rxr);
 
 #ifdef DEV_NETMAP
-       if (ifp->if_capenable & IFCAP_NETMAP) {
-               /*
-                * Same as the txeof routine: only wakeup clients on intr.
-                * NKR_PENDINTR in nr_kflags is used to implement interrupt
-                * mitigation (ixgbe_rxsync() will not look for new packets
-                * unless NKR_PENDINTR is set).
-                */
-               struct netmap_adapter *na = NA(ifp);
-
-               na->rx_rings[rxr->me].nr_kflags |= NKR_PENDINTR;
-               selwakeuppri(&na->rx_rings[rxr->me].si, PI_NET);
-               IXGBE_RX_UNLOCK(rxr);
-               IXGBE_CORE_LOCK(adapter);
-               selwakeuppri(&na->rx_si, PI_NET);
-               IXGBE_CORE_UNLOCK(adapter);
+       /* Same as the txeof routine: wakeup clients on intr. */
+       if (netmap_rx_irq(ifp, rxr->me | NETMAP_LOCKED_ENTER, &processed))
                return (FALSE);
-       }
 #endif /* DEV_NETMAP */
        for (i = rxr->next_to_check; count != 0;) {
                struct mbuf     *sendmp, *mp;

Modified: head/sys/dev/re/if_re.c
==============================================================================
--- head/sys/dev/re/if_re.c     Tue Apr 30 16:08:34 2013        (r250107)
+++ head/sys/dev/re/if_re.c     Tue Apr 30 16:18:29 2013        (r250108)
@@ -2112,11 +2112,9 @@ re_rxeof(struct rl_softc *sc, int *rx_np
 
        ifp = sc->rl_ifp;
 #ifdef DEV_NETMAP
-       if (ifp->if_capenable & IFCAP_NETMAP) {
-               NA(ifp)->rx_rings[0].nr_kflags |= NKR_PENDINTR;
-               selwakeuppri(&NA(ifp)->rx_rings[0].si, PI_NET);
+       if (netmap_rx_irq(ifp, 0 | (NETMAP_LOCKED_ENTER|NETMAP_LOCKED_EXIT),
+           &rx_npkts))
                return 0;
-       }
 #endif /* DEV_NETMAP */
        if (ifp->if_mtu > RL_MTU && (sc->rl_flags & RL_FLAG_JUMBOV2) != 0)
                jumbo = 1;
@@ -2360,10 +2358,8 @@ re_txeof(struct rl_softc *sc)
 
        ifp = sc->rl_ifp;
 #ifdef DEV_NETMAP
-       if (ifp->if_capenable & IFCAP_NETMAP) {
-               selwakeuppri(&NA(ifp)->tx_rings[0].si, PI_NET);
+       if (netmap_tx_irq(ifp, 0 | (NETMAP_LOCKED_ENTER|NETMAP_LOCKED_EXIT)))
                return;
-       }
 #endif /* DEV_NETMAP */
        /* Invalidate the TX descriptor list */
        bus_dmamap_sync(sc->rl_ldata.rl_tx_list_tag,
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to