net: ena: separate skb allocation to dedicated function
authorNetanel Belgazal <netanel@amazon.com>
Fri, 23 Jun 2017 08:21:57 +0000 (11:21 +0300)
committerDavid S. Miller <davem@davemloft.net>
Fri, 23 Jun 2017 18:15:10 +0000 (14:15 -0400)
Signed-off-by: Netanel Belgazal <netanel@amazon.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/amazon/ena/ena_netdev.c

index 424b4d7e642f37f9b431fd1d0f2530e03b18ed13..7dee448157bbb2bf7f1fae94b02f0de2ee7ece6e 100644 (file)
@@ -825,6 +825,28 @@ static int ena_clean_tx_irq(struct ena_ring *tx_ring, u32 budget)
        return tx_pkts;
 }
 
+static struct sk_buff *ena_alloc_skb(struct ena_ring *rx_ring, bool frags)
+{
+       struct sk_buff *skb;
+
+       if (frags)
+               skb = napi_get_frags(rx_ring->napi);
+       else
+               skb = netdev_alloc_skb_ip_align(rx_ring->netdev,
+                                               rx_ring->rx_copybreak);
+
+       if (unlikely(!skb)) {
+               u64_stats_update_begin(&rx_ring->syncp);
+               rx_ring->rx_stats.skb_alloc_fail++;
+               u64_stats_update_end(&rx_ring->syncp);
+               netif_dbg(rx_ring->adapter, rx_err, rx_ring->netdev,
+                         "Failed to allocate skb. frags: %d\n", frags);
+               return NULL;
+       }
+
+       return skb;
+}
+
 static struct sk_buff *ena_rx_skb(struct ena_ring *rx_ring,
                                  struct ena_com_rx_buf_info *ena_bufs,
                                  u32 descs,
@@ -854,16 +876,9 @@ static struct sk_buff *ena_rx_skb(struct ena_ring *rx_ring,
        prefetch(va + NET_IP_ALIGN);
 
        if (len <= rx_ring->rx_copybreak) {
-               skb = netdev_alloc_skb_ip_align(rx_ring->netdev,
-                                               rx_ring->rx_copybreak);
-               if (unlikely(!skb)) {
-                       u64_stats_update_begin(&rx_ring->syncp);
-                       rx_ring->rx_stats.skb_alloc_fail++;
-                       u64_stats_update_end(&rx_ring->syncp);
-                       netif_err(rx_ring->adapter, rx_err, rx_ring->netdev,
-                                 "Failed to allocate skb\n");
+               skb = ena_alloc_skb(rx_ring, false);
+               if (unlikely(!skb))
                        return NULL;
-               }
 
                netif_dbg(rx_ring->adapter, rx_status, rx_ring->netdev,
                          "rx allocated small packet. len %d. data_len %d\n",
@@ -882,20 +897,15 @@ static struct sk_buff *ena_rx_skb(struct ena_ring *rx_ring,
 
                skb_put(skb, len);
                skb->protocol = eth_type_trans(skb, rx_ring->netdev);
+               rx_ring->free_rx_ids[*next_to_clean] = req_id;
                *next_to_clean = ENA_RX_RING_IDX_ADD(*next_to_clean, descs,
                                                     rx_ring->ring_size);
                return skb;
        }
 
-       skb = napi_get_frags(rx_ring->napi);
-       if (unlikely(!skb)) {
-               netif_dbg(rx_ring->adapter, rx_status, rx_ring->netdev,
-                         "Failed allocating skb\n");
-               u64_stats_update_begin(&rx_ring->syncp);
-               rx_ring->rx_stats.skb_alloc_fail++;
-               u64_stats_update_end(&rx_ring->syncp);
+       skb = ena_alloc_skb(rx_ring, true);
+       if (unlikely(!skb))
                return NULL;
-       }
 
        do {
                dma_unmap_page(rx_ring->dev,