2017-05-03 2 views
0

J'Installées d'en-tête de 256 octets, et je veux l'utiliser pour contenir des données privées, mais bnx2x_recv_pkts méthode mbuf mis data_off à cqe_fp->placement_offset en dpdk? Pourquoi?pourquoi bnx2x_recv_pkts mis mbuf data_off à cqe_fp-> placement_offset à dpdk?

len = cqe_fp->pkt_len_or_gro_seg_len; 
**pad = cqe_fp->placement_offset;** 

new_mb = rte_mbuf_raw_alloc(rxq->mb_pool); 
if (unlikely(!new_mb)) { 
    PMD_RX_LOG(ERR, "mbuf alloc fail fp[%02d]", fp->index); 
    rte_eth_devices[rxq->port_id].data-> 
      rx_mbuf_alloc_failed++; 
    goto next_rx; 
} 

rx_mb = rxq->sw_ring[bd_cons]; 
rxq->sw_ring[bd_cons] = new_mb; 
rxq->rx_ring[bd_prod] = new_mb->buf_physaddr; 

rx_pref = NEXT_RX_BD(bd_cons) & MAX_RX_BD(rxq); 
rte_prefetch0(rxq->sw_ring[rx_pref]); 
if ((rx_pref & 0x3) == 0) { 
    rte_prefetch0(&rxq->rx_ring[rx_pref]); 
    rte_prefetch0(&rxq->sw_ring[rx_pref]); 
} 

**rx_mb->data_off = pad;** 
rx_mb->nb_segs = 1; 
rx_mb->next = NULL; 
rx_mb->pkt_len = rx_mb->data_len = len; 
rx_mb->port = rxq->port_id; 
rte_prefetch1(rte_pktmbuf_mtod(rx_mb, void *)); 
+0

Je commente la ligne de rx_mb-> data_off = pad, fait une nouvelle lib, mais cela ne fonctionne pas lors de l'exécution. maintenant je veux savoir comment cette valeur de cqe_fp-> placement_offset mis à 2? Je regarde la source de dpdk-stable-17.11, mais pas trouvé. – eason

Répondre

0

Bien qu'il ne résout pas votre problème, vous voudrez peut-être regarder dans mbuf espace privé, qui est placé entre la tête mbuf et le tampon de données au lieu.

Il pourrait être de toute taille et il est complètement transparent pour les PMD. S'il vous plaît se référer à la rte_pktmbuf_pool_create() pour plus de détails:

http://dpdk.org/doc/api/rte__mbuf_8h.html#a593921f13307803b94bbb4e0932db962

+0

Je pense que c'est un bug. – eason

0

Je pense que c'est un bug. Je modifie le code ressemble à ça.

new_mb = rte_mbuf_raw_alloc(rxq->mb_pool); 
    if (unlikely(!new_mb)) { 
     PMD_RX_LOG(ERR, "mbuf alloc fail fp[%02d]", fp->index); 
     rte_eth_devices[rxq->port_id].data-> 
       rx_mbuf_alloc_failed++; 
     goto next_rx; 
    } 
    new_mb->data_off = RTE_PKTMBUF_HEADROOM; 

    rx_mb = rxq->sw_ring[bd_cons]; 
    rxq->sw_ring[bd_cons] = new_mb; 
    //rxq->rx_ring[bd_prod] = new_mb->buf_physaddr; 
    rxq->rx_ring[bd_prod] = rte_cpu_to_le_64(rte_mbuf_data_dma_addr_default(new_mb)); 

modifier new_mb-> buf_physaddr à rte_cpu_to_le_64 (rte_mbuf_data_dma_addr_default (new_mb)), ce qui va sauter la hauteur.

when setup queue of nic. bnx2x_dev_rx_queue_setup will call. 
    for (idx = 0; idx < rxq->nb_rx_desc; idx = NEXT_RX_BD(idx)) { 
    mbuf = rte_mbuf_raw_alloc(mp); 
    if (NULL == mbuf) { 
     PMD_RX_LOG(ERR, "RX mbuf alloc failed queue_id=%u, idx=%d", 
       (unsigned)rxq->queue_id, idx); 
     bnx2x_rx_queue_release(rxq); 
     return -ENOMEM; 
    } 
    rxq->sw_ring[idx] = mbuf; 
    //rxq->rx_ring[idx] = mbuf->buf_physaddr; 
    rxq->rx_ring[idx] = rte_cpu_to_le_64(rte_mbuf_data_dma_addr_default(mbuf)); 
}