[dpdk-dev] [PATCH] pmd_pcap: fixed incorrect mbuf allocation
Richardson, Bruce
bruce.richardson at intel.com
Tue Nov 26 17:49:46 CET 2013
The mbufs returned by the pcap pmd RX function were constantly
reused, instead of being allocated on demand. This has been fixed.
Signed-off-by: Bruce Richardson <bruce.richardson at intel.com>
---
lib/librte_pmd_pcap/rte_eth_pcap.c | 37 +++++++++++++++++++++++++----------
1 files changed, 26 insertions(+), 11 deletions(-)
diff --git a/lib/librte_pmd_pcap/rte_eth_pcap.c b/lib/librte_pmd_pcap/rte_eth_pcap.c
index 19d19b3..8a98471 100644
--- a/lib/librte_pmd_pcap/rte_eth_pcap.c
+++ b/lib/librte_pmd_pcap/rte_eth_pcap.c
@@ -118,32 +118,47 @@ eth_pcap_rx(void *queue,
struct pcap_pkthdr header;
const u_char *packet;
struct rte_mbuf *mbuf;
- static struct rte_mbuf *mbufs[RTE_ETH_PCAP_MBUFS] = { 0 };
struct pcap_rx_queue *pcap_q = queue;
+ struct rte_pktmbuf_pool_private *mbp_priv;
uint16_t num_rx = 0;
+ uint16_t buf_size;
if (unlikely(pcap_q->pcap == NULL || nb_pkts == 0))
return 0;
- if(unlikely(!mbufs[0]))
- for (i = 0; i < RTE_ETH_PCAP_MBUFS; i++)
- mbufs[i] = rte_pktmbuf_alloc(pcap_q->mb_pool);
-
/* Reads the given number of packets from the pcap file one by one
* and copies the packet data into a newly allocated mbuf to return.
*/
for (i = 0; i < nb_pkts; i++) {
- mbuf = mbufs[i % RTE_ETH_PCAP_MBUFS];
+ /* Get the next PCAP packet */
packet = pcap_next(pcap_q->pcap, &header);
if (unlikely(packet == NULL))
break;
+ else
+ mbuf = rte_pktmbuf_alloc(pcap_q->mb_pool);
if (unlikely(mbuf == NULL))
break;
- rte_memcpy(mbuf->pkt.data, packet, header.len);
- mbuf->pkt.data_len = (uint16_t)header.len;
- mbuf->pkt.pkt_len = mbuf->pkt.data_len;
- bufs[i] = mbuf;
- num_rx++;
+
+ /* Now get the space available for data in the mbuf */
+ mbp_priv = (struct rte_pktmbuf_pool_private *)
+ ((char *)pcap_q->mb_pool + sizeof(struct rte_mempool));
+ buf_size = (uint16_t) (mbp_priv->mbuf_data_room_size -
+ RTE_PKTMBUF_HEADROOM);
+
+ if (header.len <= buf_size) {
+ /* pcap packet will fit in the mbuf, go ahead and copy */
+ rte_memcpy(mbuf->pkt.data, packet, header.len);
+ mbuf->pkt.data_len = (uint16_t)header.len;
+ mbuf->pkt.pkt_len = mbuf->pkt.data_len;
+ bufs[i] = mbuf;
+ num_rx++;
+ } else {
+ /* pcap packet will not fit in the mbuf, so drop packet */
+ RTE_LOG(ERR, PMD,
+ "PCAP packet %d bytes will not fit in mbuf (%d bytes)\n",
+ header.len, buf_size);
+ rte_pktmbuf_free(mbuf);
+ }
}
pcap_q->rx_pkts += num_rx;
return num_rx;
--
1.7.7.6
More information about the dev
mailing list