Skip to content

Commit 7229fa6

Browse files
committed
Merge branch '200GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue
Tony Nguyen says: ==================== Intel Wired LAN Driver Updates 2025-02-11 (idpf, ixgbe, igc) For idpf: Sridhar fixes a couple issues in handling of RSC packets. Josh adds a call to set_real_num_queues() to keep queue count in sync. For ixgbe: Piotr removes missed IS_ERR() removal when ERR_PTR usage was removed. For igc: Zdenek Bouska fixes reporting of Rx timestamp with AF_XDP. Siang sets buffer type on empty frame to ensure proper handling. * '200GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue: igc: Set buffer type for empty frames in igc_init_empty_frame igc: Fix HW RX timestamp when passed by ZC XDP ixgbe: Fix possible skb NULL pointer dereference idpf: call set_real_num_queues in idpf_open idpf: record rx queue in skb for RSC packets idpf: fix handling rsc packet with a single segment ==================== Link: https://patch.msgid.link/20250211214343.4092496-1-anthony.l.nguyen@intel.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2 parents e589adf + 63f20f0 commit 7229fa6

File tree

4 files changed

+20
-14
lines changed

4 files changed

+20
-14
lines changed

drivers/net/ethernet/intel/idpf/idpf_lib.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2159,8 +2159,13 @@ static int idpf_open(struct net_device *netdev)
21592159
idpf_vport_ctrl_lock(netdev);
21602160
vport = idpf_netdev_to_vport(netdev);
21612161

2162+
err = idpf_set_real_num_queues(vport);
2163+
if (err)
2164+
goto unlock;
2165+
21622166
err = idpf_vport_open(vport);
21632167

2168+
unlock:
21642169
idpf_vport_ctrl_unlock(netdev);
21652170

21662171
return err;

drivers/net/ethernet/intel/idpf/idpf_txrx.c

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3008,8 +3008,6 @@ static int idpf_rx_rsc(struct idpf_rx_queue *rxq, struct sk_buff *skb,
30083008
return -EINVAL;
30093009

30103010
rsc_segments = DIV_ROUND_UP(skb->data_len, rsc_seg_len);
3011-
if (unlikely(rsc_segments == 1))
3012-
return 0;
30133011

30143012
NAPI_GRO_CB(skb)->count = rsc_segments;
30153013
skb_shinfo(skb)->gso_size = rsc_seg_len;
@@ -3072,6 +3070,7 @@ idpf_rx_process_skb_fields(struct idpf_rx_queue *rxq, struct sk_buff *skb,
30723070
idpf_rx_hash(rxq, skb, rx_desc, decoded);
30733071

30743072
skb->protocol = eth_type_trans(skb, rxq->netdev);
3073+
skb_record_rx_queue(skb, rxq->idx);
30753074

30763075
if (le16_get_bits(rx_desc->hdrlen_flags,
30773076
VIRTCHNL2_RX_FLEX_DESC_ADV_RSC_M))
@@ -3080,8 +3079,6 @@ idpf_rx_process_skb_fields(struct idpf_rx_queue *rxq, struct sk_buff *skb,
30803079
csum_bits = idpf_rx_splitq_extract_csum_bits(rx_desc);
30813080
idpf_rx_csum(rxq, skb, csum_bits, decoded);
30823081

3083-
skb_record_rx_queue(skb, rxq->idx);
3084-
30853082
return 0;
30863083
}
30873084

drivers/net/ethernet/intel/igc/igc_main.c

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1096,6 +1096,7 @@ static int igc_init_empty_frame(struct igc_ring *ring,
10961096
return -ENOMEM;
10971097
}
10981098

1099+
buffer->type = IGC_TX_BUFFER_TYPE_SKB;
10991100
buffer->skb = skb;
11001101
buffer->protocol = 0;
11011102
buffer->bytecount = skb->len;
@@ -2701,8 +2702,9 @@ static int igc_clean_rx_irq(struct igc_q_vector *q_vector, const int budget)
27012702
}
27022703

27032704
static struct sk_buff *igc_construct_skb_zc(struct igc_ring *ring,
2704-
struct xdp_buff *xdp)
2705+
struct igc_xdp_buff *ctx)
27052706
{
2707+
struct xdp_buff *xdp = &ctx->xdp;
27062708
unsigned int totalsize = xdp->data_end - xdp->data_meta;
27072709
unsigned int metasize = xdp->data - xdp->data_meta;
27082710
struct sk_buff *skb;
@@ -2721,27 +2723,28 @@ static struct sk_buff *igc_construct_skb_zc(struct igc_ring *ring,
27212723
__skb_pull(skb, metasize);
27222724
}
27232725

2726+
if (ctx->rx_ts) {
2727+
skb_shinfo(skb)->tx_flags |= SKBTX_HW_TSTAMP_NETDEV;
2728+
skb_hwtstamps(skb)->netdev_data = ctx->rx_ts;
2729+
}
2730+
27242731
return skb;
27252732
}
27262733

27272734
static void igc_dispatch_skb_zc(struct igc_q_vector *q_vector,
27282735
union igc_adv_rx_desc *desc,
2729-
struct xdp_buff *xdp,
2730-
ktime_t timestamp)
2736+
struct igc_xdp_buff *ctx)
27312737
{
27322738
struct igc_ring *ring = q_vector->rx.ring;
27332739
struct sk_buff *skb;
27342740

2735-
skb = igc_construct_skb_zc(ring, xdp);
2741+
skb = igc_construct_skb_zc(ring, ctx);
27362742
if (!skb) {
27372743
ring->rx_stats.alloc_failed++;
27382744
set_bit(IGC_RING_FLAG_RX_ALLOC_FAILED, &ring->flags);
27392745
return;
27402746
}
27412747

2742-
if (timestamp)
2743-
skb_hwtstamps(skb)->hwtstamp = timestamp;
2744-
27452748
if (igc_cleanup_headers(ring, desc, skb))
27462749
return;
27472750

@@ -2777,7 +2780,6 @@ static int igc_clean_rx_irq_zc(struct igc_q_vector *q_vector, const int budget)
27772780
union igc_adv_rx_desc *desc;
27782781
struct igc_rx_buffer *bi;
27792782
struct igc_xdp_buff *ctx;
2780-
ktime_t timestamp = 0;
27812783
unsigned int size;
27822784
int res;
27832785

@@ -2807,6 +2809,8 @@ static int igc_clean_rx_irq_zc(struct igc_q_vector *q_vector, const int budget)
28072809
*/
28082810
bi->xdp->data_meta += IGC_TS_HDR_LEN;
28092811
size -= IGC_TS_HDR_LEN;
2812+
} else {
2813+
ctx->rx_ts = NULL;
28102814
}
28112815

28122816
bi->xdp->data_end = bi->xdp->data + size;
@@ -2815,7 +2819,7 @@ static int igc_clean_rx_irq_zc(struct igc_q_vector *q_vector, const int budget)
28152819
res = __igc_xdp_run_prog(adapter, prog, bi->xdp);
28162820
switch (res) {
28172821
case IGC_XDP_PASS:
2818-
igc_dispatch_skb_zc(q_vector, desc, bi->xdp, timestamp);
2822+
igc_dispatch_skb_zc(q_vector, desc, ctx);
28192823
fallthrough;
28202824
case IGC_XDP_CONSUMED:
28212825
xsk_buff_free(bi->xdp);

drivers/net/ethernet/intel/ixgbe/ixgbe_main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2105,7 +2105,7 @@ static void ixgbe_put_rx_buffer(struct ixgbe_ring *rx_ring,
21052105
/* hand second half of page back to the ring */
21062106
ixgbe_reuse_rx_page(rx_ring, rx_buffer);
21072107
} else {
2108-
if (!IS_ERR(skb) && IXGBE_CB(skb)->dma == rx_buffer->dma) {
2108+
if (skb && IXGBE_CB(skb)->dma == rx_buffer->dma) {
21092109
/* the page has been released from the ring */
21102110
IXGBE_CB(skb)->page_released = true;
21112111
} else {

0 commit comments

Comments
 (0)