fix trex-282 from #138 net/enic: fix memory leak with oversized Tx packets ticket 02/5202/1
authorHanoh Haim <[email protected]>
Sat, 24 Dec 2016 20:06:55 +0000 (22:06 +0200)
committerHanoh Haim <[email protected]>
Sat, 24 Dec 2016 20:06:55 +0000 (22:06 +0200)
Signed-off-by: Hanoh Haim <[email protected]>
src/dpdk/drivers/net/enic/enic.h
src/dpdk/drivers/net/enic/enic_main.c
src/dpdk/drivers/net/enic/enic_res.c
src/dpdk/drivers/net/enic/enic_res.h
src/dpdk/drivers/net/enic/enic_rxtx.c

index c00d3fb..9117cc7 100644 (file)
@@ -103,6 +103,7 @@ struct enic_fdir {
 struct enic_soft_stats {
        rte_atomic64_t rx_nombuf;
        rte_atomic64_t rx_packet_errors;
+    rte_atomic64_t tx_oversized;
 };
 
 struct enic_memzone_entry {
index 473bfc3..4530dcf 100644 (file)
@@ -137,6 +137,7 @@ static void enic_clear_soft_stats(struct enic *enic)
        struct enic_soft_stats *soft_stats = &enic->soft_stats;
        rte_atomic64_clear(&soft_stats->rx_nombuf);
        rte_atomic64_clear(&soft_stats->rx_packet_errors);
+    rte_atomic64_clear(&soft_stats->tx_oversized);
 }
 
 static void enic_init_soft_stats(struct enic *enic)
@@ -144,6 +145,7 @@ static void enic_init_soft_stats(struct enic *enic)
        struct enic_soft_stats *soft_stats = &enic->soft_stats;
        rte_atomic64_init(&soft_stats->rx_nombuf);
        rte_atomic64_init(&soft_stats->rx_packet_errors);
+    rte_atomic64_init(&soft_stats->tx_oversized);
        enic_clear_soft_stats(enic);
 }
 
@@ -185,7 +187,7 @@ void enic_dev_stats_get(struct enic *enic, struct rte_eth_stats *r_stats)
        r_stats->obytes = stats->tx.tx_bytes_ok;
 
        r_stats->ierrors = stats->rx.rx_errors + stats->rx.rx_drop;
-       r_stats->oerrors = stats->tx.tx_errors;
+       r_stats->oerrors = stats->tx.tx_errors + rte_atomic64_read(&soft_stats->tx_oversized);
 
        r_stats->imissed = stats->rx.rx_no_bufs + rx_truncated;
 
index 8a230a1..140c6ef 100644 (file)
@@ -89,10 +89,11 @@ int enic_get_vnic_config(struct enic *enic)
        /* max packet size is only defined in newer VIC firmware
         * and will be 0 for legacy firmware and VICs
         */
-       if (c->max_pkt_size > ENIC_DEFAULT_MAX_PKT_SIZE)
+       if (c->max_pkt_size > ENIC_DEFAULT_RX_MAX_PKT_SIZE)
                enic->max_mtu = c->max_pkt_size - (ETHER_HDR_LEN + 4);
        else
-               enic->max_mtu = ENIC_DEFAULT_MAX_PKT_SIZE - (ETHER_HDR_LEN + 4);
+               enic->max_mtu = ENIC_DEFAULT_RX_MAX_PKT_SIZE 
+                        - (ETHER_HDR_LEN + 4);
        if (c->mtu == 0)
                c->mtu = 1500;
 
index 303530e..cda2da1 100644 (file)
 #define ENIC_MIN_MTU                   68
 
 /* Does not include (possible) inserted VLAN tag and FCS */
-#define ENIC_DEFAULT_MAX_PKT_SIZE      9022
+#define ENIC_DEFAULT_RX_MAX_PKT_SIZE   9022
+
+/* Does not include (possible) inserted VLAN tag and FCS */
+#define ENIC_TX_MAX_PKT_SIZE               9208
+
 
 #define ENIC_MULTICAST_PERFECT_FILTERS 32
 #define ENIC_UNICAST_PERFECT_FILTERS   32
index 50f0b28..cd15502 100644 (file)
@@ -470,16 +470,23 @@ uint16_t enic_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
 
        for (index = 0; index < nb_pkts; index++) {
                tx_pkt = *tx_pkts++;
+               pkt_len = tx_pkt->pkt_len;
+               data_len = tx_pkt->data_len;
+               ol_flags = tx_pkt->ol_flags;
                nb_segs = tx_pkt->nb_segs;
+
+               if (pkt_len > ENIC_TX_MAX_PKT_SIZE) {
+                       rte_pktmbuf_free(tx_pkt);
+                       rte_atomic64_inc(&enic->soft_stats.tx_oversized);
+                       continue;
+               }
+
                if (nb_segs > wq_desc_avail) {
                        if (index > 0)
                                goto post;
                        goto done;
                }
 
-               pkt_len = tx_pkt->pkt_len;
-               data_len = tx_pkt->data_len;
-               ol_flags = tx_pkt->ol_flags;
                mss = 0;
                vlan_id = 0;
                vlan_tag_insert = 0;