while (nfp_net_rx_space(rx_ring)) {
wr_idx = D_IDX(rx_ring, rx_ring->wr_p);
xdp = xsk_buff_alloc(pool); if (!xdp) break;
nfp_net_xsk_rx_bufs_stash(rx_ring, wr_idx, xdp);
/* DMA address is expanded to 48-bit width in freelist for NFP3800, * so the *_48b macro is used accordingly, it's also OK to fill * a 40-bit address since the top 8 bits are get set to 0.
*/
nfp_desc_set_dma_addr_48b(&rx_ring->rxds[wr_idx].fld,
rx_ring->xsk_rxbufs[wr_idx].dma_addr);
rx_ring->wr_p++;
wr_ptr_add++;
}
/* Ensure all records are visible before incrementing write counter. */
wmb();
nfp_qcp_wr_ptr_add(rx_ring->qcp_fl, wr_ptr_add);
}
/* Reject on old FWs so we can drop some checks on datapath. */ if (nn->dp.rx_offset != NFP_NET_CFG_RX_OFFSET_DYNAMIC) return -EOPNOTSUPP; if (!nn->dp.chained_metadata_format) return -EOPNOTSUPP;
/* Install */ if (pool) {
err = nfp_net_xsk_pool_map(nn->dp.dev, pool); if (err) return err;
}
/* queue_id comes from a zero-copy socket, installed with XDP_SETUP_XSK_POOL, * so it must be within our vector range. Moreover, our napi structs * are statically allocated, so we can always kick them without worrying * if reconfig is in progress or interface down.
*/
napi_schedule(&nn->r_vecs[queue_id].napi);
return 0;
}
Messung V0.5
¤ Dauer der Verarbeitung: 0.0 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.