2017-05-03 7 views
0

헤더 룸을 256 바이트로 설정 했으므로 이것을 개인 데이터 보유에 사용하고 싶지만 bnx2x_recv_pkts 메쏘드에서 mbuf data_off를 dpdk에 cqe_fp->placement_offset으로 설정 했습니까? 왜? 이 문제가 해결되지 않지만왜 bnx2x_recv_pkts가 mbuf data_off를 dpdk의 cqe_fp-> placement_offset으로 설정 했습니까?

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

나는 새로운 LIB을, rx_mb-> data_off = 패드의 라인을 언급하지만,하지 작업 할 때 실행됩니다. 지금 나는 cqe_fp-> placement_offset의이 값이 2로 어떻게 설정되는지 알고 싶습니까? 나는 dpdk-stable-17.11의 근원을 보았지만 발견되지 않았다. – eason

답변

0

, 당신은 대신 MBUF 헤더와 데이터 버퍼 사이에 위치 MBUF 개인 영역을 사용하여 조사 할 수 있습니다.

모든 크기 일 수 있으며 PMD에 대해 완전히 투명합니다. 자세한 내용은 rte_pktmbuf_pool_create()를 참조하십시오 :

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

+0

나는 이것이 버그라고 생각한다. – eason

0

나는 이것이 버그라고 생각합니다. 나는 그 코드를 수정한다.

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)); 

편집 new_mb-> rte_cpu_to_le_64 (rte_mbuf_data_dma_addr_default (new_mb))에 buf_physaddr,이 헤드 룸을 건너 뜁니다.

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)); 
}