]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
qede: Add support for ingress headroom
authorMintz, Yuval <Yuval.Mintz@cavium.com>
Fri, 7 Apr 2017 08:05:00 +0000 (11:05 +0300)
committerChuck Anderson <chuck.anderson@oracle.com>
Wed, 26 Jul 2017 03:47:00 +0000 (20:47 -0700)
Orabug: 2593305326439680

Driver currently doesn't support any headroom; The only 'available'
space it has in the head of the buffer is due to the placement
offset.
In order to allow [later] support of XDP adjustment of headroom,
modify the the ingress flow to properly handle a scenario where
the packets would have such.

Signed-off-by: Yuval Mintz <Yuval.Mintz@cavium.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Brian Maly <brian.maly@oracle.com>
drivers/net/ethernet/qlogic/qede/qede.h
drivers/net/ethernet/qlogic/qede/qede_fp.c
drivers/net/ethernet/qlogic/qede/qede_main.c

index 2fe0724c50f06fc9b40a7b82378a3e84189c3997..dd09afec8c275a07e19975e5756bbef2e932e967 100644 (file)
@@ -302,21 +302,24 @@ struct qede_rx_queue {
        u16 filled_buffers;
        u8 rxq_id;
 
+       /* Used once per each NAPI run */
+       u16 num_rx_buffers;
+
+       u16 rx_headroom;
+
        u32 rx_buf_size;
        u32 rx_buf_seg_size;
 
-       u64 rcv_pkts;
-
        struct sw_rx_data *sw_rx_ring;
        struct qed_chain rx_bd_ring;
        struct qed_chain rx_comp_ring ____cacheline_aligned;
 
-       /* Used once per each NAPI run */
-       u16 num_rx_buffers;
-
        /* GRO */
        struct qede_agg_info tpa_info[ETH_TPA_MAX_AGGS_NUM];
 
+       /* Used once per each NAPI run */
+       u64 rcv_pkts;
+
        u64 rx_hw_errors;
        u64 rx_alloc_errors;
        u64 rx_ip_frags;
index a68be1fadb6d38145653389f31467246e782cc1d..bd5c86de8358bcf61d179b2dbd47dcfe411599ff 100644 (file)
@@ -86,7 +86,8 @@ int qede_alloc_rx_buffer(struct qede_rx_queue *rxq, bool allow_lazy)
        rx_bd = (struct eth_rx_bd *)qed_chain_produce(&rxq->rx_bd_ring);
        WARN_ON(!rx_bd);
        rx_bd->addr.hi = cpu_to_le32(upper_32_bits(mapping));
-       rx_bd->addr.lo = cpu_to_le32(lower_32_bits(mapping));
+       rx_bd->addr.lo = cpu_to_le32(lower_32_bits(mapping) +
+                                    rxq->rx_headroom);
 
        rxq->sw_rx_prod++;
        rxq->filled_buffers++;
@@ -445,7 +446,8 @@ static inline void qede_reuse_page(struct qede_rx_queue *rxq,
        new_mapping = curr_prod->mapping + curr_prod->page_offset;
 
        rx_bd_prod->addr.hi = cpu_to_le32(upper_32_bits(new_mapping));
-       rx_bd_prod->addr.lo = cpu_to_le32(lower_32_bits(new_mapping));
+       rx_bd_prod->addr.lo = cpu_to_le32(lower_32_bits(new_mapping) +
+                                         rxq->rx_headroom);
 
        rxq->sw_rx_prod++;
        curr_cons->data = NULL;
@@ -926,7 +928,7 @@ static struct sk_buff *qede_rx_allocate_skb(struct qede_dev *edev,
                                            struct sw_rx_data *bd, u16 len,
                                            u16 pad)
 {
-       unsigned int offset = bd->page_offset;
+       unsigned int offset = bd->page_offset + pad;
        struct skb_frag_struct *frag;
        struct page *page = bd->data;
        unsigned int pull_len;
@@ -943,7 +945,7 @@ static struct sk_buff *qede_rx_allocate_skb(struct qede_dev *edev,
         */
        if (len + pad <= edev->rx_copybreak) {
                memcpy(skb_put(skb, len),
-                      page_address(page) + pad + offset, len);
+                      page_address(page) + offset, len);
                qede_reuse_page(rxq, bd);
                goto out;
        }
@@ -951,7 +953,7 @@ static struct sk_buff *qede_rx_allocate_skb(struct qede_dev *edev,
        frag = &skb_shinfo(skb)->frags[0];
 
        skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags,
-                       page, pad + offset, len, rxq->rx_buf_seg_size);
+                       page, offset, len, rxq->rx_buf_seg_size);
 
        va = skb_frag_address(frag);
        pull_len = eth_get_headlen(va, QEDE_RX_HDR_SIZE);
index 13d406947fbc188dafd02ca34d31a7cad0d1d5d9..a9337fdc5dd58d5cd82012c64a7e79479c68a3eb 100644 (file)
@@ -1214,8 +1214,9 @@ static int qede_alloc_mem_rxq(struct qede_dev *edev, struct qede_rx_queue *rxq)
 
        rxq->rx_buf_size = NET_IP_ALIGN + ETH_OVERHEAD + edev->ndev->mtu;
 
-       if (rxq->rx_buf_size > PAGE_SIZE)
-               rxq->rx_buf_size = PAGE_SIZE;
+       /* Make sure that the headroom and  payload fit in a single page */
+       if (rxq->rx_buf_size + rxq->rx_headroom > PAGE_SIZE)
+               rxq->rx_buf_size = PAGE_SIZE - rxq->rx_headroom;
 
        /* Segment size to spilt a page in multiple equal parts */
        rxq->rx_buf_seg_size = roundup_pow_of_two(rxq->rx_buf_size);