Skip to content

Commit 15ed8a4

Browse files
Mintz, Yuvaldavem330
authored andcommitted
qede: Add support for ingress headroom
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 <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 40b8c45 commit 15ed8a4

File tree

3 files changed

+24
-17
lines changed

3 files changed

+24
-17
lines changed

drivers/net/ethernet/qlogic/qede/qede.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -313,21 +313,24 @@ struct qede_rx_queue {
313313
u8 data_direction;
314314
u8 rxq_id;
315315

316+
/* Used once per each NAPI run */
317+
u16 num_rx_buffers;
318+
319+
u16 rx_headroom;
320+
316321
u32 rx_buf_size;
317322
u32 rx_buf_seg_size;
318323

319-
u64 rcv_pkts;
320-
321324
struct sw_rx_data *sw_rx_ring;
322325
struct qed_chain rx_bd_ring;
323326
struct qed_chain rx_comp_ring ____cacheline_aligned;
324327

325-
/* Used once per each NAPI run */
326-
u16 num_rx_buffers;
327-
328328
/* GRO */
329329
struct qede_agg_info tpa_info[ETH_TPA_MAX_AGGS_NUM];
330330

331+
/* Used once per each NAPI run */
332+
u64 rcv_pkts;
333+
331334
u64 rx_hw_errors;
332335
u64 rx_alloc_errors;
333336
u64 rx_ip_frags;

drivers/net/ethernet/qlogic/qede/qede_fp.c

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@ int qede_alloc_rx_buffer(struct qede_rx_queue *rxq, bool allow_lazy)
8787
rx_bd = (struct eth_rx_bd *)qed_chain_produce(&rxq->rx_bd_ring);
8888
WARN_ON(!rx_bd);
8989
rx_bd->addr.hi = cpu_to_le32(upper_32_bits(mapping));
90-
rx_bd->addr.lo = cpu_to_le32(lower_32_bits(mapping));
90+
rx_bd->addr.lo = cpu_to_le32(lower_32_bits(mapping) +
91+
rxq->rx_headroom);
9192

9293
rxq->sw_rx_prod++;
9394
rxq->filled_buffers++;
@@ -509,7 +510,8 @@ static inline void qede_reuse_page(struct qede_rx_queue *rxq,
509510
new_mapping = curr_prod->mapping + curr_prod->page_offset;
510511

511512
rx_bd_prod->addr.hi = cpu_to_le32(upper_32_bits(new_mapping));
512-
rx_bd_prod->addr.lo = cpu_to_le32(lower_32_bits(new_mapping));
513+
rx_bd_prod->addr.lo = cpu_to_le32(lower_32_bits(new_mapping) +
514+
rxq->rx_headroom);
513515

514516
rxq->sw_rx_prod++;
515517
curr_cons->data = NULL;
@@ -991,13 +993,14 @@ static bool qede_rx_xdp(struct qede_dev *edev,
991993
struct qede_rx_queue *rxq,
992994
struct bpf_prog *prog,
993995
struct sw_rx_data *bd,
994-
struct eth_fast_path_rx_reg_cqe *cqe)
996+
struct eth_fast_path_rx_reg_cqe *cqe,
997+
u16 data_offset)
995998
{
996999
u16 len = le16_to_cpu(cqe->len_on_first_bd);
9971000
struct xdp_buff xdp;
9981001
enum xdp_action act;
9991002

1000-
xdp.data = page_address(bd->data) + cqe->placement_offset;
1003+
xdp.data = page_address(bd->data) + data_offset;
10011004
xdp.data_end = xdp.data + len;
10021005

10031006
/* Queues always have a full reset currently, so for the time
@@ -1026,7 +1029,7 @@ static bool qede_rx_xdp(struct qede_dev *edev,
10261029
/* Now if there's a transmission problem, we'd still have to
10271030
* throw current buffer, as replacement was already allocated.
10281031
*/
1029-
if (qede_xdp_xmit(edev, fp, bd, cqe->placement_offset, len)) {
1032+
if (qede_xdp_xmit(edev, fp, bd, data_offset, len)) {
10301033
dma_unmap_page(rxq->dev, bd->mapping,
10311034
PAGE_SIZE, DMA_BIDIRECTIONAL);
10321035
__free_page(bd->data);
@@ -1053,7 +1056,7 @@ static struct sk_buff *qede_rx_allocate_skb(struct qede_dev *edev,
10531056
struct sw_rx_data *bd, u16 len,
10541057
u16 pad)
10551058
{
1056-
unsigned int offset = bd->page_offset;
1059+
unsigned int offset = bd->page_offset + pad;
10571060
struct skb_frag_struct *frag;
10581061
struct page *page = bd->data;
10591062
unsigned int pull_len;
@@ -1070,15 +1073,15 @@ static struct sk_buff *qede_rx_allocate_skb(struct qede_dev *edev,
10701073
*/
10711074
if (len + pad <= edev->rx_copybreak) {
10721075
memcpy(skb_put(skb, len),
1073-
page_address(page) + pad + offset, len);
1076+
page_address(page) + offset, len);
10741077
qede_reuse_page(rxq, bd);
10751078
goto out;
10761079
}
10771080

10781081
frag = &skb_shinfo(skb)->frags[0];
10791082

10801083
skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags,
1081-
page, pad + offset, len, rxq->rx_buf_seg_size);
1084+
page, offset, len, rxq->rx_buf_seg_size);
10821085

10831086
va = skb_frag_address(frag);
10841087
pull_len = eth_get_headlen(va, QEDE_RX_HDR_SIZE);
@@ -1224,11 +1227,11 @@ static int qede_rx_process_cqe(struct qede_dev *edev,
12241227

12251228
fp_cqe = &cqe->fast_path_regular;
12261229
len = le16_to_cpu(fp_cqe->len_on_first_bd);
1227-
pad = fp_cqe->placement_offset;
1230+
pad = fp_cqe->placement_offset + rxq->rx_headroom;
12281231

12291232
/* Run eBPF program if one is attached */
12301233
if (xdp_prog)
1231-
if (!qede_rx_xdp(edev, fp, rxq, xdp_prog, bd, fp_cqe))
1234+
if (!qede_rx_xdp(edev, fp, rxq, xdp_prog, bd, fp_cqe, pad))
12321235
return 0;
12331236

12341237
/* If this is an error packet then drop it */

drivers/net/ethernet/qlogic/qede/qede_main.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1188,8 +1188,9 @@ static int qede_alloc_mem_rxq(struct qede_dev *edev, struct qede_rx_queue *rxq)
11881188

11891189
rxq->rx_buf_size = NET_IP_ALIGN + ETH_OVERHEAD + edev->ndev->mtu;
11901190

1191-
if (rxq->rx_buf_size > PAGE_SIZE)
1192-
rxq->rx_buf_size = PAGE_SIZE;
1191+
/* Make sure that the headroom and payload fit in a single page */
1192+
if (rxq->rx_buf_size + rxq->rx_headroom > PAGE_SIZE)
1193+
rxq->rx_buf_size = PAGE_SIZE - rxq->rx_headroom;
11931194

11941195
/* Segment size to spilt a page in multiple equal parts,
11951196
* unless XDP is used in which case we'd use the entire page.

0 commit comments

Comments
 (0)