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
This commit is contained in:
parent
eba992b645
commit
29d0e17e0c
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user