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>
This commit is contained in:
commit
7229fa6b30
4 changed files with 20 additions and 14 deletions
|
@ -2159,8 +2159,13 @@ static int idpf_open(struct net_device *netdev)
|
|||
idpf_vport_ctrl_lock(netdev);
|
||||
vport = idpf_netdev_to_vport(netdev);
|
||||
|
||||
err = idpf_set_real_num_queues(vport);
|
||||
if (err)
|
||||
goto unlock;
|
||||
|
||||
err = idpf_vport_open(vport);
|
||||
|
||||
unlock:
|
||||
idpf_vport_ctrl_unlock(netdev);
|
||||
|
||||
return err;
|
||||
|
|
|
@ -3008,8 +3008,6 @@ static int idpf_rx_rsc(struct idpf_rx_queue *rxq, struct sk_buff *skb,
|
|||
return -EINVAL;
|
||||
|
||||
rsc_segments = DIV_ROUND_UP(skb->data_len, rsc_seg_len);
|
||||
if (unlikely(rsc_segments == 1))
|
||||
return 0;
|
||||
|
||||
NAPI_GRO_CB(skb)->count = rsc_segments;
|
||||
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,
|
|||
idpf_rx_hash(rxq, skb, rx_desc, decoded);
|
||||
|
||||
skb->protocol = eth_type_trans(skb, rxq->netdev);
|
||||
skb_record_rx_queue(skb, rxq->idx);
|
||||
|
||||
if (le16_get_bits(rx_desc->hdrlen_flags,
|
||||
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,
|
|||
csum_bits = idpf_rx_splitq_extract_csum_bits(rx_desc);
|
||||
idpf_rx_csum(rxq, skb, csum_bits, decoded);
|
||||
|
||||
skb_record_rx_queue(skb, rxq->idx);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -1096,6 +1096,7 @@ static int igc_init_empty_frame(struct igc_ring *ring,
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
buffer->type = IGC_TX_BUFFER_TYPE_SKB;
|
||||
buffer->skb = skb;
|
||||
buffer->protocol = 0;
|
||||
buffer->bytecount = skb->len;
|
||||
|
@ -2701,8 +2702,9 @@ static int igc_clean_rx_irq(struct igc_q_vector *q_vector, const int budget)
|
|||
}
|
||||
|
||||
static struct sk_buff *igc_construct_skb_zc(struct igc_ring *ring,
|
||||
struct xdp_buff *xdp)
|
||||
struct igc_xdp_buff *ctx)
|
||||
{
|
||||
struct xdp_buff *xdp = &ctx->xdp;
|
||||
unsigned int totalsize = xdp->data_end - xdp->data_meta;
|
||||
unsigned int metasize = xdp->data - xdp->data_meta;
|
||||
struct sk_buff *skb;
|
||||
|
@ -2721,27 +2723,28 @@ static struct sk_buff *igc_construct_skb_zc(struct igc_ring *ring,
|
|||
__skb_pull(skb, metasize);
|
||||
}
|
||||
|
||||
if (ctx->rx_ts) {
|
||||
skb_shinfo(skb)->tx_flags |= SKBTX_HW_TSTAMP_NETDEV;
|
||||
skb_hwtstamps(skb)->netdev_data = ctx->rx_ts;
|
||||
}
|
||||
|
||||
return skb;
|
||||
}
|
||||
|
||||
static void igc_dispatch_skb_zc(struct igc_q_vector *q_vector,
|
||||
union igc_adv_rx_desc *desc,
|
||||
struct xdp_buff *xdp,
|
||||
ktime_t timestamp)
|
||||
struct igc_xdp_buff *ctx)
|
||||
{
|
||||
struct igc_ring *ring = q_vector->rx.ring;
|
||||
struct sk_buff *skb;
|
||||
|
||||
skb = igc_construct_skb_zc(ring, xdp);
|
||||
skb = igc_construct_skb_zc(ring, ctx);
|
||||
if (!skb) {
|
||||
ring->rx_stats.alloc_failed++;
|
||||
set_bit(IGC_RING_FLAG_RX_ALLOC_FAILED, &ring->flags);
|
||||
return;
|
||||
}
|
||||
|
||||
if (timestamp)
|
||||
skb_hwtstamps(skb)->hwtstamp = timestamp;
|
||||
|
||||
if (igc_cleanup_headers(ring, desc, skb))
|
||||
return;
|
||||
|
||||
|
@ -2777,7 +2780,6 @@ static int igc_clean_rx_irq_zc(struct igc_q_vector *q_vector, const int budget)
|
|||
union igc_adv_rx_desc *desc;
|
||||
struct igc_rx_buffer *bi;
|
||||
struct igc_xdp_buff *ctx;
|
||||
ktime_t timestamp = 0;
|
||||
unsigned int size;
|
||||
int res;
|
||||
|
||||
|
@ -2807,6 +2809,8 @@ static int igc_clean_rx_irq_zc(struct igc_q_vector *q_vector, const int budget)
|
|||
*/
|
||||
bi->xdp->data_meta += IGC_TS_HDR_LEN;
|
||||
size -= IGC_TS_HDR_LEN;
|
||||
} else {
|
||||
ctx->rx_ts = NULL;
|
||||
}
|
||||
|
||||
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)
|
|||
res = __igc_xdp_run_prog(adapter, prog, bi->xdp);
|
||||
switch (res) {
|
||||
case IGC_XDP_PASS:
|
||||
igc_dispatch_skb_zc(q_vector, desc, bi->xdp, timestamp);
|
||||
igc_dispatch_skb_zc(q_vector, desc, ctx);
|
||||
fallthrough;
|
||||
case IGC_XDP_CONSUMED:
|
||||
xsk_buff_free(bi->xdp);
|
||||
|
|
|
@ -2105,7 +2105,7 @@ static void ixgbe_put_rx_buffer(struct ixgbe_ring *rx_ring,
|
|||
/* hand second half of page back to the ring */
|
||||
ixgbe_reuse_rx_page(rx_ring, rx_buffer);
|
||||
} else {
|
||||
if (!IS_ERR(skb) && IXGBE_CB(skb)->dma == rx_buffer->dma) {
|
||||
if (skb && IXGBE_CB(skb)->dma == rx_buffer->dma) {
|
||||
/* the page has been released from the ring */
|
||||
IXGBE_CB(skb)->page_released = true;
|
||||
} else {
|
||||
|
|
Loading…
Add table
Reference in a new issue