#define PF_XDP AF_XDP
#endif
-static int af_xdp_logtype;
+RTE_LOG_REGISTER(af_xdp_logtype, pmd.net.af_xdp, NOTICE);
#define AF_XDP_LOG(level, fmt, args...) \
rte_log(RTE_LOG_ ## level, af_xdp_logtype, \
if (rte_pktmbuf_alloc_bulk(umem->mb_pool, fq_bufs, nb_pkts)) {
AF_XDP_LOG(DEBUG,
"Failed to get enough buffers for fq.\n");
- return -1;
+ return 0;
}
rcvd = xsk_ring_cons__peek(rx, nb_pkts, &idx_rx);
{
struct xsk_umem_info *umem = txq->umem;
+ pull_umem_cq(umem, XSK_RING_CONS__DEFAULT_NUM_DESCS);
+
#if defined(XDP_USE_NEED_WAKEUP)
if (xsk_ring_prod__needs_wakeup(&txq->tx))
#endif
/* pull from completion queue to leave more space */
if (errno == EAGAIN)
- pull_umem_cq(umem, ETH_AF_XDP_TX_BATCH_SIZE);
+ pull_umem_cq(umem,
+ XSK_RING_CONS__DEFAULT_NUM_DESCS);
}
-#ifndef XDP_UMEM_UNALIGNED_CHUNK_FLAG
- pull_umem_cq(umem, ETH_AF_XDP_TX_BATCH_SIZE);
-#endif
}
#if defined(XDP_UMEM_UNALIGNED_CHUNK_FLAG)
uint16_t count = 0;
struct xdp_desc *desc;
uint64_t addr, offset;
+ uint32_t free_thresh = umem->cq.size >> 1;
- pull_umem_cq(umem, nb_pkts);
+ if (xsk_cons_nb_avail(&umem->cq, free_thresh) >= free_thresh)
+ pull_umem_cq(umem, XSK_RING_CONS__DEFAULT_NUM_DESCS);
for (i = 0; i < nb_pkts; i++) {
mbuf = bufs[i];
if (mbuf->pool == umem->mb_pool) {
if (!xsk_ring_prod__reserve(&txq->tx, 1, &idx_tx)) {
kick_tx(txq);
- goto out;
+ if (!xsk_ring_prod__reserve(&txq->tx, 1,
+ &idx_tx))
+ goto out;
}
desc = xsk_ring_prod__tx_desc(&txq->tx, idx_tx);
desc->len = mbuf->pkt_len;
xdp_umem_destroy(struct xsk_umem_info *umem)
{
#if defined(XDP_UMEM_UNALIGNED_CHUNK_FLAG)
- rte_mempool_free(umem->mb_pool);
umem->mb_pool = NULL;
#else
rte_memzone_free(umem->mz);
struct xsk_umem_info *umem;
int ret;
struct xsk_umem_config usr_config = {
- .fill_size = ETH_AF_XDP_DFLT_NUM_DESCS,
+ .fill_size = ETH_AF_XDP_DFLT_NUM_DESCS * 2,
.comp_size = ETH_AF_XDP_DFLT_NUM_DESCS,
.flags = XDP_UMEM_UNALIGNED_CHUNK_FLAG};
void *base_addr = NULL;
umem->buf_ring = rte_ring_create(ring_name,
ETH_AF_XDP_NUM_BUFFERS,
rte_socket_id(),
- RING_F_SP_ENQ | RING_F_SC_DEQ);
+ 0x0);
if (umem->buf_ring == NULL) {
AF_XDP_LOG(ERR, "Failed to create rte_ring\n");
goto err;
struct xsk_socket_config cfg;
struct pkt_tx_queue *txq = rxq->pair;
int ret = 0;
- int reserve_size = ETH_AF_XDP_DFLT_NUM_DESCS / 2;
+ int reserve_size = ETH_AF_XDP_DFLT_NUM_DESCS;
struct rte_mbuf *fq_bufs[reserve_size];
rxq->umem = xdp_umem_configure(internals, rxq);
"iface=<string> "
"start_queue=<int> "
"queue_count=<int> ");
-
-RTE_INIT(af_xdp_init_log)
-{
- af_xdp_logtype = rte_log_register("pmd.net.af_xdp");
- if (af_xdp_logtype >= 0)
- rte_log_set_level(af_xdp_logtype, RTE_LOG_NOTICE);
-}