> -----Original Message----- > From: Song, Yoong Siang <[email protected]> > Sent: Sunday, December 21, 2025 2:45 PM > To: Behera, Vivek (DI FA DSP ICC PRC1) <[email protected]>; > Loktionov, Aleksandr <[email protected]>; Keller, Jacob E > <[email protected]>; Nguyen, Anthony L <[email protected]>; > Kitszel, Przemyslaw <[email protected]> > Cc: [email protected]; [email protected]; Kwapulinski, Piotr > <[email protected]> > Subject: RE: [Intel-wired-lan] [PATCH iwl-net v9] igc: Fix trigger of > incorrect irq in > igc_xsk_wakeup function > > On Saturday, December 20, 2025 7:00 PM, Vivek Behera wrote: > >This patch addresses the issue where the igc_xsk_wakeup function was > >triggering an incorrect IRQ for tx-0 when the i226 is configured with > >only 2 combined queues or in an environment with 2 active CPU cores. > >This prevented XDP Zero-copy send functionality in such split IRQ > >configurations. > > > >The fix implements the correct logic for extracting q_vectors saved > >during rx and tx ring allocation and utilizes flags provided by the > >ndo_xsk_wakeup API to trigger the appropriate IRQ. > > > >Fixes: fc9df2a0b520 ("igc: Enable RX via AF_XDP zero-copy") > >Fixes: 15fd021bc427 ("igc: Add Tx hardware timestamp request for AF_XDP > >zero- copy packet") > >Signed-off-by: Vivek Behera <[email protected]> > >Reviewed-by: Jacob Keller <[email protected]> > >Reviewed-by: Aleksandr loktinov <[email protected]> > >Reviewed-by: Piotr Kwapulinski <[email protected]> > > Reviewed-by: Song Yoong Siang <[email protected]> > > Thanks for the rework. > Note: You do not need to submit a new version just to add a reviewed-by tag, > unless you have another changes to make. Okay. Noted Thanks > > >--- > >v1: > >https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Flore. > >kernel.or%2F&data=05%7C02%7Cvivek.behera%40siemens.com%7C8f085189a > 7e343 > >f68c8108de40973109%7C38ae3bcd95794fd4addab42e1495d55a%7C1%7C0%7C > 6390192 > >15266515921%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUs > IlYiOiIwLjA > >uMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C > %7C%7C& > >sdata=3qER7%2Fow65KtbQNhJwvqOMC425glTXilBXxaSsBlyCY%3D&reserved > =0 > >g%2Fintel-wired- > >lan%2FAS1PR10MB5392B7268416DB8A1624FDB88FA7A%40AS1PR10MB5392. > EUR > >PRD10.PROD.OUTLOOK.COM%2F&data=05%7C02%7Cvivek.behera%40sieme > ns.co > >m%7Cb609a859d19b47e8f47808de38d77627%7C38ae3bcd95794fd4addab42e14 > 9 > >5d55a%7C1%7C0%7C639010695226787962%7CUnknown%7CTWFpbGZsb3d8e > yJF > >bXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTW > FpbCI > >sIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&sdata=S1060xzCOGrJo0cO2enNhDm > CIJUcC > >LZd%2F%2BmKLByazm8%3D&reserved=0 > >v2: > >https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Flore. > >kernel.or%2F&data=05%7C02%7Cvivek.behera%40siemens.com%7C8f085189a > 7e343 > >f68c8108de40973109%7C38ae3bcd95794fd4addab42e1495d55a%7C1%7C0%7C > 6390192 > >15266542329%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUs > IlYiOiIwLjA > >uMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C > %7C%7C& > >sdata=kfJ%2FkMsoZde2CGW%2BpaLYUQ6yaRfyhV3A2d%2Bz4GwBq08%3D&r > eserved=0 > >g%2Fintel-wired- > >lan%2FAS1PR10MB539280B1427DA0ABE9D65E628FA5A%40AS1PR10MB5392 > .EUR > >PRD10.PROD.OUTLOOK.COM%2F&data=05%7C02%7Cvivek.behera%40sieme > ns.co > >m%7Cb609a859d19b47e8f47808de38d77627%7C38ae3bcd95794fd4addab42e14 > 9 > >5d55a%7C1%7C0%7C639010695226846016%7CUnknown%7CTWFpbGZsb3d8e > yJF > >bXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTW > FpbCI > >sIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&sdata=ksDVfndVlbafyexZ2%2B3j9Gcc > O9hu > >pybvtl1twZs5OSk%3D&reserved=0 > >v3: > >https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Flore. > >kernel.or%2F&data=05%7C02%7Cvivek.behera%40siemens.com%7C8f085189a > 7e343 > >f68c8108de40973109%7C38ae3bcd95794fd4addab42e1495d55a%7C1%7C0%7C > 6390192 > >15266561801%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUs > IlYiOiIwLjA > >uMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C > %7C%7C& > >sdata=T5%2BuK5rojSrxkULJVsXks%2FG4XeJ7QkFtFzjyllwMLAo%3D&reserved > =0 > >g%2Fintel-wired- > >lan%2FIA3PR11MB8986E4ACB7F264CF2DD1D750E5A0A%40IA3PR11MB8986. > nam > >prd11.prod.outlook.com%2F&data=05%7C02%7Cvivek.behera%40siemens.com > %7C > >b609a859d19b47e8f47808de38d77627%7C38ae3bcd95794fd4addab42e1495d55a > >%7C1%7C0%7C639010695226890990%7CUnknown%7CTWFpbGZsb3d8eyJFb > XB0e > >U1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCI > sIldU > >Ij > oyfQ%3D%3D%7C0%7C%7C%7C&sdata=zEWhj7N2%2BmwsShmoy1ACAjb3vi7 > yJgb > >A077fISIOZiM%3D&reserved=0 > >v4: > >https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Flore. > >kernel.or%2F&data=05%7C02%7Cvivek.behera%40siemens.com%7C8f085189a > 7e343 > >f68c8108de40973109%7C38ae3bcd95794fd4addab42e1495d55a%7C1%7C0%7C > 6390192 > >15266582726%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUs > IlYiOiIwLjA > >uMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C > %7C%7C& > >sdata=BNc4gnDBi88%2Bc38fA3ZwgWZWe0xKqBVRs9s0kjXcicY%3D&reserved > =0 > >g%2Fintel-wired- > >lan%2FAS1PR10MB53926CB955FBD4F9F4A018818FA0A%40AS1PR10MB5392. > EUR > >PRD10.PROD.OUTLOOK.COM%2F&data=05%7C02%7Cvivek.behera%40sieme > ns.co > >m%7Cb609a859d19b47e8f47808de38d77627%7C38ae3bcd95794fd4addab42e14 > 9 > >5d55a%7C1%7C0%7C639010695226933538%7CUnknown%7CTWFpbGZsb3d8e > yJF > >bXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTW > FpbCI > >sIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&sdata=23aTM4TNsnyzoS%2FpSM1G > cluaWz > >LPNbrPKEo%2BOrm9hZQ%3D&reserved=0 > >v5: > >https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Flore. > >kernel.or%2F&data=05%7C02%7Cvivek.behera%40siemens.com%7C8f085189a > 7e343 > >f68c8108de40973109%7C38ae3bcd95794fd4addab42e1495d55a%7C1%7C0%7C > 6390192 > >15266603550%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUs > IlYiOiIwLjA > >uMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C > %7C%7C& > >sdata=f98hnCh9GGscSYE4edpMLJ%2Fyn1ywQvdYiY2aRg3FVQY%3D&reserve > d=0 > >g%2Fintel-wired- > >lan%2FAS1PR10MB5392FCA415A38B9DD7BB5F218FA0A%40AS1PR10MB5392 > .EUR > >PRD10.PROD.OUTLOOK.COM%2F&data=05%7C02%7Cvivek.behera%40sieme > ns.co > >m%7Cb609a859d19b47e8f47808de38d77627%7C38ae3bcd95794fd4addab42e14 > 9 > >5d55a%7C1%7C0%7C639010695227205026%7CUnknown%7CTWFpbGZsb3d8e > yJF > >bXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTW > FpbCI > >sIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&sdata=JdY3aHzIcIWtir9fAV%2BMELN > WtiyLJ > >YRU7IMxLZ0mPqQ%3D&reserved=0 > >v6: > >https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Flore. > >kernel.org%2Fintel-wired-lan%2F20251211173916.23951-1- > &data=05%7C02%7Cv > >ivek.behera%40siemens.com%7C8f085189a7e343f68c8108de40973109%7C38a > e3bcd > >95794fd4addab42e1495d55a%7C1%7C0%7C639019215266620373%7CUnknown > %7CTWFpb > >GZsb3d8eyJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zM > iIsIkFO > >IjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&sdata=tyC5AhOhrZId%2B > PMnbUCKI > >iW%2BnULncGNFtwPmUArKNNA%3D&reserved=0 > >[email protected]/ > >v7: > >https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Flore. > >kernel.org%2Fintel-wired-lan%2F20251212163208.137164-1- > &data=05%7C02%7C > >vivek.behera%40siemens.com%7C8f085189a7e343f68c8108de40973109%7C38 > ae3bc > >d95794fd4addab42e1495d55a%7C1%7C0%7C639019215266637772%7CUnknow > n%7CTWFp > >bGZsb3d8eyJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4z > MiIsIkF > >OIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&sdata=MPfX7BL8URjItX > BeMFr5li > >RLdICdis1ukNDcACw%2FVEg%3D&reserved=0 > >[email protected]/ > >v8: > >https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Flore. > >kernel.org%2Fintel-wired-lan%2F20251215122052.412327-1- > &data=05%7C02%7C > >vivek.behera%40siemens.com%7C8f085189a7e343f68c8108de40973109%7C38 > ae3bc > >d95794fd4addab42e1495d55a%7C1%7C0%7C639019215266654355%7CUnknow > n%7CTWFp > >bGZsb3d8eyJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4z > MiIsIkF > >OIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&sdata=VhGMm4B%2FR > lVXMxrDMInk > >te%2FeZAujFnD3XQ7h7ZsbjiU%3D&reserved=0 > >[email protected]/ > > > >changelog: > >v1 > >- Inital description of the Bug and steps to reproduce with RTC > >Testbench > >- Test results after applying the patch > >v1 -> v2 > >- Handling of RX and TX Wakeup in igc_xsk_wakeup for a split IRQ > >configuration > >- Removal of igc_trigger_rxtxq_interrupt (now redundant) > >- Added flag to igc_xsk_wakeup function call in igc_ptp_free_tx_buffer > >v2 -> v3 > >- Added 'Fixes:' tags for the relevant commits. > >- Added reviewer > >v3 -> v4 > >- Added reviewer > >v4 -> v5 > >- Updated comment style from multi-star to standard linux convention > >v5 -> v6 > >- Resolve formatting issues highlighted by reviewers > >- Try to include version histroy as defined in netdev guidelines > >- Included review suggestions from Przemyslaw > >- Added reviewers > >v6 -> v7 > >- Included review suggestions from Przemyslaw missed in v6 > >v7 -> v8 > >- Modified sequence to complete all error checks for rx and tx > > before updating napi states and triggering irq > >v8 -> v9 > >- Included review feedback and suggestions from Tony and Siang > >--- > > drivers/net/ethernet/intel/igc/igc_main.c | 77 ++++++++++++++++++----- > >drivers/net/ethernet/intel/igc/igc_ptp.c | 3 +- > > 2 files changed, 62 insertions(+), 18 deletions(-) > > > >diff --git a/drivers/net/ethernet/intel/igc/igc_main.c > >b/drivers/net/ethernet/intel/igc/igc_main.c > >index 7aafa60ba0c8..7bd9f10a3f29 100644 > >--- a/drivers/net/ethernet/intel/igc/igc_main.c > >+++ b/drivers/net/ethernet/intel/igc/igc_main.c > >@@ -6908,40 +6908,83 @@ static int igc_xdp_xmit(struct net_device *dev, > >int num_frames, > > return nxmit; > > } > > > >-static void igc_trigger_rxtxq_interrupt(struct igc_adapter *adapter, > >- struct igc_q_vector *q_vector) > >-{ > >- struct igc_hw *hw = &adapter->hw; > >- u32 eics = 0; > >- > >- eics |= q_vector->eims_value; > >- wr32(IGC_EICS, eics); > >-} > >- > > int igc_xsk_wakeup(struct net_device *dev, u32 queue_id, u32 flags) { > > struct igc_adapter *adapter = netdev_priv(dev); > >+ struct igc_hw *hw = &adapter->hw; > > struct igc_q_vector *q_vector; > > struct igc_ring *ring; > >+ u32 eics = 0; > > > > if (test_bit(__IGC_DOWN, &adapter->state)) > > return -ENETDOWN; > > > > if (!igc_xdp_is_enabled(adapter)) > > return -ENXIO; > >- > >+ /* Check if queue_id is valid. Tx and Rx queue numbers are > >+ always same */ > > if (queue_id >= adapter->num_rx_queues) > > return -EINVAL; > > > >- ring = adapter->rx_ring[queue_id]; > >- > >+ if ((flags & XDP_WAKEUP_RX) && (flags & XDP_WAKEUP_TX)) { > >+ /* If both TX and RX need to be woken up check if queue > >+ pairs are > >active */ > >+ if ((adapter->flags & IGC_FLAG_QUEUE_PAIRS)) { > >+ /* Just get the ring params from Rx */ > >+ ring = adapter->rx_ring[queue_id]; > >+ } else { > >+ /* Two irqs for Rx and Tx need to be triggered */ > >+ struct napi_struct *rx_napi; > >+ struct napi_struct *tx_napi; > >+ u32 eics_tx = 0; > >+ u32 eics_rx = 0; > >+ /* IRQ trigger preparation for Rx */ > >+ ring = adapter->rx_ring[queue_id]; > >+ if (!ring->xsk_pool) > >+ return -ENXIO; > >+ q_vector = ring->q_vector; > >+ rx_napi = &q_vector->napi; > >+ /* Extend the BIT mask for eics */ > >+ eics_rx = ring->q_vector->eims_value; > >+ > >+ /* IRQ trigger preparation for Tx */ > >+ ring = adapter->tx_ring[queue_id]; > >+ if (!ring->xsk_pool) > >+ return -ENXIO; > >+ q_vector = ring->q_vector; > >+ tx_napi = &q_vector->napi; > >+ /* Extend the BIT mask for eics */ > >+ eics_tx = ring->q_vector->eims_value; > >+ > >+ /* Check and update napi states for rx and tx */ > >+ if (!napi_if_scheduled_mark_missed(rx_napi)) > >+ eics |= eics_rx; > >+ if (!napi_if_scheduled_mark_missed(tx_napi)) > >+ eics |= eics_tx; > >+ > >+ /* Now we trigger the required irqs for Rx and Tx */ > >+ if (eics) > >+ wr32(IGC_EICS, eics); > >+ > >+ return 0; > >+ } > >+ } else if (flags & XDP_WAKEUP_TX) { > >+ /* Get the ring params from Tx */ > >+ ring = adapter->tx_ring[queue_id]; > >+ } else if (flags & XDP_WAKEUP_RX) { > >+ /* Get the ring params from Rx */ > >+ ring = adapter->rx_ring[queue_id]; > >+ } else { > >+ /* Invalid Flags */ > >+ return -EINVAL; > >+ } > >+ /* Prepare to trigger single irq */ > > if (!ring->xsk_pool) > > return -ENXIO; > > > >- q_vector = adapter->q_vector[queue_id]; > >- if (!napi_if_scheduled_mark_missed(&q_vector->napi)) > >- igc_trigger_rxtxq_interrupt(adapter, q_vector); > >- > >+ q_vector = ring->q_vector; > >+ if (!napi_if_scheduled_mark_missed(&q_vector->napi)) { > >+ eics = q_vector->eims_value; > >+ wr32(IGC_EICS, eics); > >+ } > > return 0; > > } > > > >diff --git a/drivers/net/ethernet/intel/igc/igc_ptp.c > >b/drivers/net/ethernet/intel/igc/igc_ptp.c > >index b7b46d863bee..df2e500a4d7e 100644 > >--- a/drivers/net/ethernet/intel/igc/igc_ptp.c > >+++ b/drivers/net/ethernet/intel/igc/igc_ptp.c > >@@ -550,7 +550,8 @@ static void igc_ptp_free_tx_buffer(struct > >igc_adapter *adapter, > > tstamp->buffer_type = 0; > > > > /* Trigger txrx interrupt for transmit completion */ > >- igc_xsk_wakeup(adapter->netdev, tstamp->xsk_queue_index, 0); > >+ igc_xsk_wakeup(adapter->netdev, tstamp->xsk_queue_index, > >+ XDP_WAKEUP_TX); > > > > return; > > }
Re: [Intel-wired-lan] [PATCH iwl-net v9] igc: Fix trigger of incorrect irq in igc_xsk_wakeup function
Behera, VIVEK via Intel-wired-lan Sun, 21 Dec 2025 05:50:53 -0800
- [Intel-wired-lan] [PATCH iwl-net v9] igc... Vivek Behera via Intel-wired-lan
- Re: [Intel-wired-lan] [PATCH iwl-ne... Song, Yoong Siang
- Re: [Intel-wired-lan] [PATCH iw... Behera, VIVEK via Intel-wired-lan
