Author: shurd
Date: Wed Sep 20 20:40:49 2017
New Revision: 323825
URL: https://svnweb.freebsd.org/changeset/base/323825

Log:
  Fix iflib netmap RX
  
  RXQ setup for netmap was broken because netmap_rxq_init was getting called
  before IFDI_INIT - thus we ended up with ring tail pointer being reset to 
zero.
  
  Reviewed by:  sbruno
  Approved by:  sbruno (mentor)
  Sponsored by: Limelight Networks
  Differential Revision:        https://reviews.freebsd.org/D12140

Modified:
  head/sys/net/iflib.c

Modified: head/sys/net/iflib.c
==============================================================================
--- head/sys/net/iflib.c        Wed Sep 20 20:07:45 2017        (r323824)
+++ head/sys/net/iflib.c        Wed Sep 20 20:40:49 2017        (r323825)
@@ -2173,10 +2173,6 @@ iflib_init_locked(if_ctx_t ctx)
                CALLOUT_UNLOCK(txq);
                iflib_netmap_txq_init(ctx, txq);
        }
-       for (i = 0, rxq = ctx->ifc_rxqs; i < sctx->isc_nrxqsets; i++, rxq++) {
-               MPASS(rxq->ifr_id == i);
-               iflib_netmap_rxq_init(ctx, rxq);
-       }
 #ifdef INVARIANTS
        i = if_getdrvflags(ifp);
 #endif
@@ -2184,8 +2180,11 @@ iflib_init_locked(if_ctx_t ctx)
        MPASS(if_getdrvflags(ifp) == i);
        for (i = 0, rxq = ctx->ifc_rxqs; i < sctx->isc_nrxqsets; i++, rxq++) {
                /* XXX this should really be done on a per-queue basis */
-               if (if_getcapenable(ifp) & IFCAP_NETMAP)
+               if (if_getcapenable(ifp) & IFCAP_NETMAP) {
+                       MPASS(rxq->ifr_id == i);
+                       iflib_netmap_rxq_init(ctx, rxq);
                        continue;
+               }
                for (j = 0, fl = rxq->ifr_fl; j < rxq->ifr_nfl; j++, fl++) {
                        if (iflib_fl_setup(fl)) {
                                device_printf(ctx->ifc_dev, "freelist setup 
failed - check cluster settings\n");
@@ -2474,14 +2473,6 @@ iflib_rxeof(iflib_rxq_t rxq, qidx_t budget)
        struct mbuf *m, *mh, *mt;
 
        ifp = ctx->ifc_ifp;
-#ifdef DEV_NETMAP
-       if (ifp->if_capenable & IFCAP_NETMAP) {
-               u_int work = 0;
-               if (netmap_rx_irq(ifp, rxq->ifr_id, &work))
-                       return (FALSE);
-       }
-#endif
-
        mh = mt = NULL;
        MPASS(budget > 0);
        rx_pkts = rx_bytes = 0;
@@ -3500,7 +3491,7 @@ _task_fn_tx(void *context)
 #endif
        if (!(if_getdrvflags(ctx->ifc_ifp) & IFF_DRV_RUNNING))
                return;
-       if ((ifp->if_capenable & IFCAP_NETMAP)) {
+       if (if_getcapenable(ifp) & IFCAP_NETMAP) {
                if (ctx->isc_txd_credits_update(ctx->ifc_softc, txq->ift_id, 
false))
                        netmap_tx_irq(ifp, txq->ift_id);
                IFDI_TX_QUEUE_INTR_ENABLE(ctx, txq->ift_id);
@@ -3532,7 +3523,16 @@ _task_fn_rx(void *context)
        DBG_COUNTER_INC(task_fn_rxs);
        if (__predict_false(!(if_getdrvflags(ctx->ifc_ifp) & IFF_DRV_RUNNING)))
                return;
-       if ((more = iflib_rxeof(rxq, 16 /* XXX */)) == false) {
+       more = true;
+#ifdef DEV_NETMAP
+       if (if_getcapenable(ctx->ifc_ifp) & IFCAP_NETMAP) {
+               u_int work = 0;
+               if (netmap_rx_irq(ctx->ifc_ifp, rxq->ifr_id, &work)) {
+                       more = false;
+               }
+       }
+#endif
+       if (more == false || (more = iflib_rxeof(rxq, 16 /* XXX */)) == false) {
                if (ctx->ifc_flags & IFC_LEGACY)
                        IFDI_INTR_ENABLE(ctx);
                else {
@@ -5106,7 +5106,7 @@ iflib_admin_intr_deferred(if_ctx_t ctx)
        struct grouptask *gtask;
 
        gtask = &ctx->ifc_admin_task;
-       MPASS(gtask->gt_taskqueue != NULL);
+       MPASS(gtask != NULL && gtask->gt_taskqueue != NULL);
 #endif
 
        GROUPTASK_ENQUEUE(&ctx->ifc_admin_task);
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to