<p dir="ltr">Sounds good. With the two bug fixes I submitted txonly now runs perfectly. <br>
Thanks!<br>
-Dongsu</p>
<div class="gmail_quote">On May 6, 2013 8:47 AM, "Thomas Monjalon" <<a href="mailto:thomas.monjalon@6wind.com">thomas.monjalon@6wind.com</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi Dongsu Han,<br>
<br>
I think your fix is right.<br>
I've just removed tx_mbuf_alloc() and directly called rte_pktmbuf_alloc() instead.<br>
Is it OK for you ?<br>
Could you also review this (modified) description ?<br>
<br>
Thank you<br>
<br>
---<br>
<br>
From: Dongsu Han <dongsuh at <a href="http://cs.cmu.edu" target="_blank">cs.cmu.edu</a>><br>
<br>
test-pmd txonly leaks mbuf from the pool.<br>
The function tx_mbuf_alloc() does not change the refcnt<br>
and the refcnt is 0 when it is first allocated.<br>
However, rte_pktmbuf_free_seg called by the driver's xmit code decrements<br>
reference count to -1. So mbuf never goes back to the pool.<br>
As a result, txonly can't send packets after it exhausts the mempool.<br>
<br>
The function tx_mbuf_alloc() was getting mbuf directly from mempool and so<br>
was bypassing mbuf API.<br>
By using the right API, refcnt is correctly handled among other<br>
initializations.<br>
<br>
Signed-off-by: Dongsu Han <<a href="mailto:dongsuh@cs.cmu.edu">dongsuh@cs.cmu.edu</a>><br>
Signed-off-by: Thomas Monjalon <<a href="mailto:thomas.monjalon@6wind.com">thomas.monjalon@6wind.com</a>><br>
---<br>
 app/test-pmd/txonly.c |   17 ++---------------<br>
 1 file changed, 2 insertions(+), 15 deletions(-)<br>
<br>
diff --git a/app/test-pmd/txonly.c b/app/test-pmd/txonly.c<br>
index d7c8c31..53f7138 100644<br>
--- a/app/test-pmd/txonly.c<br>
+++ b/app/test-pmd/txonly.c<br>
@@ -89,19 +89,6 @@<br>
 static struct ipv4_hdr  pkt_ip_hdr;  /**< IP header of transmitted packets. */<br>
 static struct udp_hdr pkt_udp_hdr; /**< UDP header of transmitted packets. */<br>
<br>
-static inline struct rte_mbuf *<br>
-tx_mbuf_alloc(struct rte_mempool *mp)<br>
-{<br>
-       struct rte_mbuf *m;<br>
-       void *mb;<br>
-<br>
-       if (rte_mempool_get(mp, &mb) < 0)<br>
-               return NULL;<br>
-       m = (struct rte_mbuf *)mb;<br>
-       __rte_mbuf_sanity_check(m, RTE_MBUF_PKT, 1);<br>
-       return m;<br>
-}<br>
-<br>
 static void<br>
 copy_buf_to_pkt_segs(void* buf, unsigned len, struct rte_mbuf *pkt,<br>
                     unsigned offset)<br>
@@ -223,7 +210,7 @@ pkt_burst_transmit(struct fwd_stream *fs)<br>
        vlan_tci = ports[fs->tx_port].tx_vlan_id;<br>
        ol_flags = ports[fs->tx_port].tx_ol_flags;<br>
        for (nb_pkt = 0; nb_pkt < nb_pkt_per_burst; nb_pkt++) {<br>
-               pkt = tx_mbuf_alloc(mbp);<br>
+               pkt = rte_pktmbuf_alloc(mbp);<br>
                if (pkt == NULL) {<br>
                nomore_mbuf:<br>
                        if (nb_pkt == 0)<br>
@@ -233,7 +220,7 @@ pkt_burst_transmit(struct fwd_stream *fs)<br>
                pkt->pkt.data_len = tx_pkt_seg_lengths[0];<br>
                pkt_seg = pkt;<br>
                for (i = 1; i < tx_pkt_nb_segs; i++) {<br>
-                       pkt_seg->pkt.next = tx_mbuf_alloc(mbp);<br>
+                       pkt_seg->pkt.next = rte_pktmbuf_alloc(mbp);<br>
                        if (pkt_seg->pkt.next == NULL) {<br>
                                pkt->pkt.nb_segs = i;<br>
                                rte_pktmbuf_free(pkt);<br>
--<br>
1.7.10.4<br>
<br>
_______________________________________________<br>
dev mailing list<br>
<a href="mailto:dev@dpdk.org">dev@dpdk.org</a><br>
<a href="http://dpdk.org/ml/listinfo/dev" target="_blank">http://dpdk.org/ml/listinfo/dev</a><br>
</blockquote></div>