* [Intel-wired-lan] [PATCH iwl-next v6 0/2] igc: Link IRQs and queues to NAPIs
@ 2024-10-29 20:12 Joe Damato
2024-10-29 20:12 ` [Intel-wired-lan] [PATCH iwl-next v6 1/2] igc: Link IRQs to NAPI instances Joe Damato
2024-10-29 20:12 ` [Intel-wired-lan] [PATCH iwl-next v6 2/2] igc: Link queues " Joe Damato
0 siblings, 2 replies; 7+ messages in thread
From: Joe Damato @ 2024-10-29 20:12 UTC (permalink / raw)
To: netdev
Cc: vitaly.lifshits, jacob.e.keller, kurt, vinicius.gomes, Joe Damato,
Alexei Starovoitov, Andrew Lunn,
open list:XDP (eXpress Data Path), Daniel Borkmann,
David S. Miller, Eric Dumazet,
moderated list:INTEL ETHERNET DRIVERS, Jakub Kicinski,
Jesper Dangaard Brouer, John Fastabend, open list, Paolo Abeni,
Przemek Kitszel, Tony Nguyen
Greetings:
Welcome to v6.
See changelog below and in each patch for changes from v5 [1].
This revision was created due to a report from Vitaly [2], that my v5
should use different function and variable names, like igb.
As you'll see, I've modified patch 2 to use __igc_resume instead of
__igc_do_resume and bool rpm instead of bool need_rtnl.
I retest the patches on each revision using my igc hardware as
documented in the commit messages. I have no idea how to test
suspend/resume (or if my NUC even supports that), so the power
management bits are untested.
Overall, this series adds support for netdev-genl to igc so that
userland apps can query IRQ, queue, and NAPI instance relationships.
This is useful because developers who have igc NICs (for example, in
their Intel NUCs) who are working on epoll-based busy polling apps and
using SO_INCOMING_NAPI_ID, need access to this API to map NAPI IDs back
to queues.
See the commit messages of each patch for example output I got on my igc
hardware.
Thanks to reviewers and maintainers for their comments/feedback!
Thanks,
Joe
[1]: https://lore.kernel.org/netdev/20241028195243.52488-1-jdamato@fastly.com/
[2]: https://lore.kernel.org/netdev/f02044c0-1d90-49f8-8a2d-00ec84fba27a@intel.com/
v6:
- Adjusts patch 2 to use different names: __igc_resume instead of
__igc_do_resume and bool rpm instead of bool need_rtnl. No other
functional changes were introduced.
v5: https://lore.kernel.org/netdev/20241028195243.52488-1-jdamato@fastly.com/
- Add a small wrapper to patch 2 to only hold rtnl when resume is
called, but avoid rtnl when runtime_resume is called which would
trigger a deadlock.
v4: https://lore.kernel.org/netdev/20241022215246.307821-1-jdamato@fastly.com/
- Fixed a typo in Patch 1's commit message for the "other" IRQ number
- Based on a bug report for e1000, closer scrutiny of the code
revealed two paths where rtnl_lock / rtnl_unlock should be added in
Patch 2: igc_resume and igc_io_error_detected. The code added to
igc_io_error_detected is inspired by ixgbe's
ixgbe_io_error_detected
v3: https://lore.kernel.org/netdev/20241018171343.314835-1-jdamato@fastly.com/
- No longer an RFC
- Patch 1: no changes
- Patch 2:
- Replace igc_unset_queue_napi with igc_set_queue_napi(..., NULL),
as suggested by Vinicius Costa Gomes
- Simplify implementation of igc_set_queue_napi as suggested by Kurt
Kanzenbach, with a minor change to use the ring->queue_index
rfcv2: https://lore.kernel.org/netdev/20241014213012.187976-1-jdamato@fastly.com/
- Patch 1: update line wrapping to 80 chars
- Patch 2:
- Update commit message to include output for IGC_FLAG_QUEUE_PAIRS
enabled and disabled
- Significant refactor to move queue mapping code to helpers to be
called from multiple locations
- Adjusted code to handle IGC_FLAG_QUEUE_PAIRS disabled as suggested
by Kurt Kanzenbach
- Map / unmap queues in igc_xdp_disable_pool and
igc_xdp_enable_pool, respectively, as suggested by Vinicius Costa
Gomes to handle the XDP case
rfcv1: https://lore.kernel.org/lkml/20241003233850.199495-1-jdamato@fastly.com/
Joe Damato (2):
igc: Link IRQs to NAPI instances
igc: Link queues to NAPI instances
drivers/net/ethernet/intel/igc/igc.h | 2 +
drivers/net/ethernet/intel/igc/igc_main.c | 59 +++++++++++++++++++----
drivers/net/ethernet/intel/igc/igc_xdp.c | 2 +
3 files changed, 54 insertions(+), 9 deletions(-)
base-commit: c093e2b9768b3a5cd7a37ea654cd47094519f843
--
2.25.1
^ permalink raw reply [flat|nested] 7+ messages in thread* [Intel-wired-lan] [PATCH iwl-next v6 1/2] igc: Link IRQs to NAPI instances 2024-10-29 20:12 [Intel-wired-lan] [PATCH iwl-next v6 0/2] igc: Link IRQs and queues to NAPIs Joe Damato @ 2024-10-29 20:12 ` Joe Damato 2024-10-30 8:47 ` Lifshits, Vitaly 2024-11-12 13:50 ` Avigail Dahan 2024-10-29 20:12 ` [Intel-wired-lan] [PATCH iwl-next v6 2/2] igc: Link queues " Joe Damato 1 sibling, 2 replies; 7+ messages in thread From: Joe Damato @ 2024-10-29 20:12 UTC (permalink / raw) To: netdev Cc: vitaly.lifshits, jacob.e.keller, kurt, vinicius.gomes, Joe Damato, Tony Nguyen, Przemek Kitszel, Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, moderated list:INTEL ETHERNET DRIVERS, open list Link IRQs to NAPI instances via netdev-genl API so that users can query this information with netlink. Compare the output of /proc/interrupts (noting that IRQ 128 is the "other" IRQ which does not appear to have a NAPI instance): $ cat /proc/interrupts | grep enp86s0 | cut --delimiter=":" -f1 128 129 130 131 132 The output from netlink shows the mapping of NAPI IDs to IRQs (again noting that 128 is absent as it is the "other" IRQ): $ ./tools/net/ynl/cli.py --spec Documentation/netlink/specs/netdev.yaml \ --dump napi-get --json='{"ifindex": 2}' [{'defer-hard-irqs': 0, 'gro-flush-timeout': 0, 'id': 8196, 'ifindex': 2, 'irq': 132}, {'defer-hard-irqs': 0, 'gro-flush-timeout': 0, 'id': 8195, 'ifindex': 2, 'irq': 131}, {'defer-hard-irqs': 0, 'gro-flush-timeout': 0, 'id': 8194, 'ifindex': 2, 'irq': 130}, {'defer-hard-irqs': 0, 'gro-flush-timeout': 0, 'id': 8193, 'ifindex': 2, 'irq': 129}] Signed-off-by: Joe Damato <jdamato@fastly.com> --- v4: - Fix typo in commit message (replacing 144 with 128) v2: - Line wrap at 80 characters drivers/net/ethernet/intel/igc/igc_main.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c index 6e70bca15db1..7964bbedb16c 100644 --- a/drivers/net/ethernet/intel/igc/igc_main.c +++ b/drivers/net/ethernet/intel/igc/igc_main.c @@ -5576,6 +5576,9 @@ static int igc_request_msix(struct igc_adapter *adapter) q_vector); if (err) goto err_free; + + netif_napi_set_irq(&q_vector->napi, + adapter->msix_entries[vector].vector); } igc_configure_msix(adapter); -- 2.25.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [Intel-wired-lan] [PATCH iwl-next v6 1/2] igc: Link IRQs to NAPI instances 2024-10-29 20:12 ` [Intel-wired-lan] [PATCH iwl-next v6 1/2] igc: Link IRQs to NAPI instances Joe Damato @ 2024-10-30 8:47 ` Lifshits, Vitaly 2024-11-12 13:50 ` Avigail Dahan 1 sibling, 0 replies; 7+ messages in thread From: Lifshits, Vitaly @ 2024-10-30 8:47 UTC (permalink / raw) To: Joe Damato, netdev Cc: jacob.e.keller, kurt, vinicius.gomes, Tony Nguyen, Przemek Kitszel, Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, moderated list:INTEL ETHERNET DRIVERS, open list On 10/29/2024 10:12 PM, Joe Damato wrote: > Link IRQs to NAPI instances via netdev-genl API so that users can query > this information with netlink. > > Compare the output of /proc/interrupts (noting that IRQ 128 is the > "other" IRQ which does not appear to have a NAPI instance): > > $ cat /proc/interrupts | grep enp86s0 | cut --delimiter=":" -f1 > 128 > 129 > 130 > 131 > 132 > > The output from netlink shows the mapping of NAPI IDs to IRQs (again > noting that 128 is absent as it is the "other" IRQ): > > $ ./tools/net/ynl/cli.py --spec Documentation/netlink/specs/netdev.yaml \ > --dump napi-get --json='{"ifindex": 2}' > > [{'defer-hard-irqs': 0, > 'gro-flush-timeout': 0, > 'id': 8196, > 'ifindex': 2, > 'irq': 132}, > {'defer-hard-irqs': 0, > 'gro-flush-timeout': 0, > 'id': 8195, > 'ifindex': 2, > 'irq': 131}, > {'defer-hard-irqs': 0, > 'gro-flush-timeout': 0, > 'id': 8194, > 'ifindex': 2, > 'irq': 130}, > {'defer-hard-irqs': 0, > 'gro-flush-timeout': 0, > 'id': 8193, > 'ifindex': 2, > 'irq': 129}] > > Signed-off-by: Joe Damato <jdamato@fastly.com> Reviewed-by: Vitaly Lifshits <vitaly.lifshits@intel.com> > --- > v4: > - Fix typo in commit message (replacing 144 with 128) > > v2: > - Line wrap at 80 characters > > drivers/net/ethernet/intel/igc/igc_main.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c > index 6e70bca15db1..7964bbedb16c 100644 > --- a/drivers/net/ethernet/intel/igc/igc_main.c > +++ b/drivers/net/ethernet/intel/igc/igc_main.c > @@ -5576,6 +5576,9 @@ static int igc_request_msix(struct igc_adapter *adapter) > q_vector); > if (err) > goto err_free; > + > + netif_napi_set_irq(&q_vector->napi, > + adapter->msix_entries[vector].vector); > } > > igc_configure_msix(adapter); > ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Intel-wired-lan] [PATCH iwl-next v6 1/2] igc: Link IRQs to NAPI instances 2024-10-29 20:12 ` [Intel-wired-lan] [PATCH iwl-next v6 1/2] igc: Link IRQs to NAPI instances Joe Damato 2024-10-30 8:47 ` Lifshits, Vitaly @ 2024-11-12 13:50 ` Avigail Dahan 1 sibling, 0 replies; 7+ messages in thread From: Avigail Dahan @ 2024-11-12 13:50 UTC (permalink / raw) To: Joe Damato, netdev Cc: vitaly.lifshits, jacob.e.keller, kurt, vinicius.gomes, Tony Nguyen, Przemek Kitszel, Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, moderated list:INTEL ETHERNET DRIVERS, open list On 29/10/2024 22:12, Joe Damato wrote: > Link IRQs to NAPI instances via netdev-genl API so that users can query > this information with netlink. > > Compare the output of /proc/interrupts (noting that IRQ 128 is the > "other" IRQ which does not appear to have a NAPI instance): > > $ cat /proc/interrupts | grep enp86s0 | cut --delimiter=":" -f1 > 128 > 129 > 130 > 131 > 132 > > The output from netlink shows the mapping of NAPI IDs to IRQs (again > noting that 128 is absent as it is the "other" IRQ): > > $ ./tools/net/ynl/cli.py --spec Documentation/netlink/specs/netdev.yaml \ > --dump napi-get --json='{"ifindex": 2}' > > [{'defer-hard-irqs': 0, > 'gro-flush-timeout': 0, > 'id': 8196, > 'ifindex': 2, > 'irq': 132}, > {'defer-hard-irqs': 0, > 'gro-flush-timeout': 0, > 'id': 8195, > 'ifindex': 2, > 'irq': 131}, > {'defer-hard-irqs': 0, > 'gro-flush-timeout': 0, > 'id': 8194, > 'ifindex': 2, > 'irq': 130}, > {'defer-hard-irqs': 0, > 'gro-flush-timeout': 0, > 'id': 8193, > 'ifindex': 2, > 'irq': 129}] > > Signed-off-by: Joe Damato <jdamato@fastly.com> > Reviewed-by: Vitaly Lifshits <vitaly.lifshits@intel.com> > --- > v4: > - Fix typo in commit message (replacing 144 with 128) > > v2: > - Line wrap at 80 characters > > drivers/net/ethernet/intel/igc/igc_main.c | 3 +++ > 1 file changed, 3 insertions(+) > Tested-by: Avigail Dahan <avigailx.dahan@intel.com> ^ permalink raw reply [flat|nested] 7+ messages in thread
* [Intel-wired-lan] [PATCH iwl-next v6 2/2] igc: Link queues to NAPI instances 2024-10-29 20:12 [Intel-wired-lan] [PATCH iwl-next v6 0/2] igc: Link IRQs and queues to NAPIs Joe Damato 2024-10-29 20:12 ` [Intel-wired-lan] [PATCH iwl-next v6 1/2] igc: Link IRQs to NAPI instances Joe Damato @ 2024-10-29 20:12 ` Joe Damato 2024-10-30 8:46 ` Lifshits, Vitaly 2024-11-12 15:06 ` Avigail Dahan 1 sibling, 2 replies; 7+ messages in thread From: Joe Damato @ 2024-10-29 20:12 UTC (permalink / raw) To: netdev Cc: vitaly.lifshits, jacob.e.keller, kurt, vinicius.gomes, Joe Damato, Tony Nguyen, Przemek Kitszel, Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Alexei Starovoitov, Daniel Borkmann, Jesper Dangaard Brouer, John Fastabend, moderated list:INTEL ETHERNET DRIVERS, open list, open list:XDP (eXpress Data Path) Link queues to NAPI instances via netdev-genl API so that users can query this information with netlink. Handle a few cases in the driver: 1. Link/unlink the NAPIs when XDP is enabled/disabled 2. Handle IGC_FLAG_QUEUE_PAIRS enabled and disabled Example output when IGC_FLAG_QUEUE_PAIRS is enabled: $ ./tools/net/ynl/cli.py --spec Documentation/netlink/specs/netdev.yaml \ --dump queue-get --json='{"ifindex": 2}' [{'id': 0, 'ifindex': 2, 'napi-id': 8193, 'type': 'rx'}, {'id': 1, 'ifindex': 2, 'napi-id': 8194, 'type': 'rx'}, {'id': 2, 'ifindex': 2, 'napi-id': 8195, 'type': 'rx'}, {'id': 3, 'ifindex': 2, 'napi-id': 8196, 'type': 'rx'}, {'id': 0, 'ifindex': 2, 'napi-id': 8193, 'type': 'tx'}, {'id': 1, 'ifindex': 2, 'napi-id': 8194, 'type': 'tx'}, {'id': 2, 'ifindex': 2, 'napi-id': 8195, 'type': 'tx'}, {'id': 3, 'ifindex': 2, 'napi-id': 8196, 'type': 'tx'}] Since IGC_FLAG_QUEUE_PAIRS is enabled, you'll note that the same NAPI ID is present for both rx and tx queues at the same index, for example index 0: {'id': 0, 'ifindex': 2, 'napi-id': 8193, 'type': 'rx'}, {'id': 0, 'ifindex': 2, 'napi-id': 8193, 'type': 'tx'}, To test IGC_FLAG_QUEUE_PAIRS disabled, a test system was booted using the grub command line option "maxcpus=2" to force igc_set_interrupt_capability to disable IGC_FLAG_QUEUE_PAIRS. Example output when IGC_FLAG_QUEUE_PAIRS is disabled: $ lscpu | grep "On-line CPU" On-line CPU(s) list: 0,2 $ ethtool -l enp86s0 | tail -5 Current hardware settings: RX: n/a TX: n/a Other: 1 Combined: 2 $ cat /proc/interrupts | grep enp 144: [...] enp86s0 145: [...] enp86s0-rx-0 146: [...] enp86s0-rx-1 147: [...] enp86s0-tx-0 148: [...] enp86s0-tx-1 1 "other" IRQ, and 2 IRQs for each of RX and Tx, so we expect netlink to report 4 IRQs with unique NAPI IDs: $ ./tools/net/ynl/cli.py --spec Documentation/netlink/specs/netdev.yaml \ --dump napi-get --json='{"ifindex": 2}' [{'id': 8196, 'ifindex': 2, 'irq': 148}, {'id': 8195, 'ifindex': 2, 'irq': 147}, {'id': 8194, 'ifindex': 2, 'irq': 146}, {'id': 8193, 'ifindex': 2, 'irq': 145}] Now we examine which queues these NAPIs are associated with, expecting that since IGC_FLAG_QUEUE_PAIRS is disabled each RX and TX queue will have its own NAPI instance: $ ./tools/net/ynl/cli.py --spec Documentation/netlink/specs/netdev.yaml \ --dump queue-get --json='{"ifindex": 2}' [{'id': 0, 'ifindex': 2, 'napi-id': 8193, 'type': 'rx'}, {'id': 1, 'ifindex': 2, 'napi-id': 8194, 'type': 'rx'}, {'id': 0, 'ifindex': 2, 'napi-id': 8195, 'type': 'tx'}, {'id': 1, 'ifindex': 2, 'napi-id': 8196, 'type': 'tx'}] Signed-off-by: Joe Damato <jdamato@fastly.com> --- v6: - Rename __igc_do_resume to __igc_resume and rename the boolean argument "need_rtnl" to "rpm" as seen in igb, as per Vitaly's feedback to make the code look more like commit ac8c58f5b535 ("igb: fix deadlock caused by taking RTNL in RPM resume path"). v5: - Rename igc_resume to __igc_do_resume and pass in a boolean "need_rtnl" to signal whether or not rtnl should be held before caling __igc_open. Call this new function from igc_runtime_resume and igc_resume passing in false (for igc_runtime_resume) and true (igc_resume), respectively. This is done to avoid reintroducing a bug fixed in commit: 6f31d6b: "igc: Refactor runtime power management flow" where rtnl is held in runtime_resume causing a deadlock. v4: - Add rtnl_lock/rtnl_unlock in two paths: igc_resume and igc_io_error_detected. The code added to the latter is inspired by a similar implementation in ixgbe's ixgbe_io_error_detected. v3: - Replace igc_unset_queue_napi with igc_set_queue_napi(adapater, i, NULL), as suggested by Vinicius Costa Gomes - Simplify implemention of igc_set_queue_napi as suggested by Kurt Kanzenbach, with a tweak to use ring->queue_index v2: - Update commit message to include tests for IGC_FLAG_QUEUE_PAIRS disabled - Refactored code to move napi queue mapping and unmapping to helper functions igc_set_queue_napi and igc_unset_queue_napi - Adjust the code to handle IGC_FLAG_QUEUE_PAIRS disabled - Call helpers to map/unmap queues to NAPIs in igc_up, __igc_open, igc_xdp_enable_pool, and igc_xdp_disable_pool drivers/net/ethernet/intel/igc/igc.h | 2 + drivers/net/ethernet/intel/igc/igc_main.c | 56 +++++++++++++++++++---- drivers/net/ethernet/intel/igc/igc_xdp.c | 2 + 3 files changed, 51 insertions(+), 9 deletions(-) diff --git a/drivers/net/ethernet/intel/igc/igc.h b/drivers/net/ethernet/intel/igc/igc.h index eac0f966e0e4..b8111ad9a9a8 100644 --- a/drivers/net/ethernet/intel/igc/igc.h +++ b/drivers/net/ethernet/intel/igc/igc.h @@ -337,6 +337,8 @@ struct igc_adapter { struct igc_led_classdev *leds; }; +void igc_set_queue_napi(struct igc_adapter *adapter, int q_idx, + struct napi_struct *napi); void igc_up(struct igc_adapter *adapter); void igc_down(struct igc_adapter *adapter); int igc_open(struct net_device *netdev); diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c index 7964bbedb16c..9a5ece12e9d4 100644 --- a/drivers/net/ethernet/intel/igc/igc_main.c +++ b/drivers/net/ethernet/intel/igc/igc_main.c @@ -4948,6 +4948,22 @@ static int igc_sw_init(struct igc_adapter *adapter) return 0; } +void igc_set_queue_napi(struct igc_adapter *adapter, int vector, + struct napi_struct *napi) +{ + struct igc_q_vector *q_vector = adapter->q_vector[vector]; + + if (q_vector->rx.ring) + netif_queue_set_napi(adapter->netdev, + q_vector->rx.ring->queue_index, + NETDEV_QUEUE_TYPE_RX, napi); + + if (q_vector->tx.ring) + netif_queue_set_napi(adapter->netdev, + q_vector->tx.ring->queue_index, + NETDEV_QUEUE_TYPE_TX, napi); +} + /** * igc_up - Open the interface and prepare it to handle traffic * @adapter: board private structure @@ -4955,6 +4971,7 @@ static int igc_sw_init(struct igc_adapter *adapter) void igc_up(struct igc_adapter *adapter) { struct igc_hw *hw = &adapter->hw; + struct napi_struct *napi; int i = 0; /* hardware has been reset, we need to reload some things */ @@ -4962,8 +4979,11 @@ void igc_up(struct igc_adapter *adapter) clear_bit(__IGC_DOWN, &adapter->state); - for (i = 0; i < adapter->num_q_vectors; i++) - napi_enable(&adapter->q_vector[i]->napi); + for (i = 0; i < adapter->num_q_vectors; i++) { + napi = &adapter->q_vector[i]->napi; + napi_enable(napi); + igc_set_queue_napi(adapter, i, napi); + } if (adapter->msix_entries) igc_configure_msix(adapter); @@ -5192,6 +5212,7 @@ void igc_down(struct igc_adapter *adapter) for (i = 0; i < adapter->num_q_vectors; i++) { if (adapter->q_vector[i]) { napi_synchronize(&adapter->q_vector[i]->napi); + igc_set_queue_napi(adapter, i, NULL); napi_disable(&adapter->q_vector[i]->napi); } } @@ -6021,6 +6042,7 @@ static int __igc_open(struct net_device *netdev, bool resuming) struct igc_adapter *adapter = netdev_priv(netdev); struct pci_dev *pdev = adapter->pdev; struct igc_hw *hw = &adapter->hw; + struct napi_struct *napi; int err = 0; int i = 0; @@ -6056,8 +6078,11 @@ static int __igc_open(struct net_device *netdev, bool resuming) clear_bit(__IGC_DOWN, &adapter->state); - for (i = 0; i < adapter->num_q_vectors; i++) - napi_enable(&adapter->q_vector[i]->napi); + for (i = 0; i < adapter->num_q_vectors; i++) { + napi = &adapter->q_vector[i]->napi; + napi_enable(napi); + igc_set_queue_napi(adapter, i, napi); + } /* Clear any pending interrupts. */ rd32(IGC_ICR); @@ -7342,7 +7367,7 @@ static void igc_deliver_wake_packet(struct net_device *netdev) netif_rx(skb); } -static int igc_resume(struct device *dev) +static int __igc_resume(struct device *dev, bool rpm) { struct pci_dev *pdev = to_pci_dev(dev); struct net_device *netdev = pci_get_drvdata(pdev); @@ -7385,7 +7410,11 @@ static int igc_resume(struct device *dev) wr32(IGC_WUS, ~0); if (netif_running(netdev)) { + if (!rpm) + rtnl_lock(); err = __igc_open(netdev, true); + if (!rpm) + rtnl_unlock(); if (!err) netif_device_attach(netdev); } @@ -7393,9 +7422,14 @@ static int igc_resume(struct device *dev) return err; } +static int igc_resume(struct device *dev) +{ + return __igc_resume(dev, false); +} + static int igc_runtime_resume(struct device *dev) { - return igc_resume(dev); + return __igc_resume(dev, true); } static int igc_suspend(struct device *dev) @@ -7440,14 +7474,18 @@ static pci_ers_result_t igc_io_error_detected(struct pci_dev *pdev, struct net_device *netdev = pci_get_drvdata(pdev); struct igc_adapter *adapter = netdev_priv(netdev); + rtnl_lock(); netif_device_detach(netdev); - if (state == pci_channel_io_perm_failure) + if (state == pci_channel_io_perm_failure) { + rtnl_unlock(); return PCI_ERS_RESULT_DISCONNECT; + } if (netif_running(netdev)) igc_down(adapter); pci_disable_device(pdev); + rtnl_unlock(); /* Request a slot reset. */ return PCI_ERS_RESULT_NEED_RESET; @@ -7458,7 +7496,7 @@ static pci_ers_result_t igc_io_error_detected(struct pci_dev *pdev, * @pdev: Pointer to PCI device * * Restart the card from scratch, as if from a cold-boot. Implementation - * resembles the first-half of the igc_resume routine. + * resembles the first-half of the __igc_resume routine. **/ static pci_ers_result_t igc_io_slot_reset(struct pci_dev *pdev) { @@ -7497,7 +7535,7 @@ static pci_ers_result_t igc_io_slot_reset(struct pci_dev *pdev) * * This callback is called when the error recovery driver tells us that * its OK to resume normal operation. Implementation resembles the - * second-half of the igc_resume routine. + * second-half of the __igc_resume routine. */ static void igc_io_resume(struct pci_dev *pdev) { diff --git a/drivers/net/ethernet/intel/igc/igc_xdp.c b/drivers/net/ethernet/intel/igc/igc_xdp.c index e27af72aada8..4da633430b80 100644 --- a/drivers/net/ethernet/intel/igc/igc_xdp.c +++ b/drivers/net/ethernet/intel/igc/igc_xdp.c @@ -84,6 +84,7 @@ static int igc_xdp_enable_pool(struct igc_adapter *adapter, napi_disable(napi); } + igc_set_queue_napi(adapter, queue_id, NULL); set_bit(IGC_RING_FLAG_AF_XDP_ZC, &rx_ring->flags); set_bit(IGC_RING_FLAG_AF_XDP_ZC, &tx_ring->flags); @@ -133,6 +134,7 @@ static int igc_xdp_disable_pool(struct igc_adapter *adapter, u16 queue_id) xsk_pool_dma_unmap(pool, IGC_RX_DMA_ATTR); clear_bit(IGC_RING_FLAG_AF_XDP_ZC, &rx_ring->flags); clear_bit(IGC_RING_FLAG_AF_XDP_ZC, &tx_ring->flags); + igc_set_queue_napi(adapter, queue_id, napi); if (needs_reset) { napi_enable(napi); -- 2.25.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [Intel-wired-lan] [PATCH iwl-next v6 2/2] igc: Link queues to NAPI instances 2024-10-29 20:12 ` [Intel-wired-lan] [PATCH iwl-next v6 2/2] igc: Link queues " Joe Damato @ 2024-10-30 8:46 ` Lifshits, Vitaly 2024-11-12 15:06 ` Avigail Dahan 1 sibling, 0 replies; 7+ messages in thread From: Lifshits, Vitaly @ 2024-10-30 8:46 UTC (permalink / raw) To: Joe Damato, netdev Cc: jacob.e.keller, kurt, vinicius.gomes, Tony Nguyen, Przemek Kitszel, Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Alexei Starovoitov, Daniel Borkmann, Jesper Dangaard Brouer, John Fastabend, moderated list:INTEL ETHERNET DRIVERS, open list, open list:XDP (eXpress Data Path) On 10/29/2024 10:12 PM, Joe Damato wrote: > Link queues to NAPI instances via netdev-genl API so that users can > query this information with netlink. Handle a few cases in the driver: > 1. Link/unlink the NAPIs when XDP is enabled/disabled > 2. Handle IGC_FLAG_QUEUE_PAIRS enabled and disabled > > Example output when IGC_FLAG_QUEUE_PAIRS is enabled: > > $ ./tools/net/ynl/cli.py --spec Documentation/netlink/specs/netdev.yaml \ > --dump queue-get --json='{"ifindex": 2}' > > [{'id': 0, 'ifindex': 2, 'napi-id': 8193, 'type': 'rx'}, > {'id': 1, 'ifindex': 2, 'napi-id': 8194, 'type': 'rx'}, > {'id': 2, 'ifindex': 2, 'napi-id': 8195, 'type': 'rx'}, > {'id': 3, 'ifindex': 2, 'napi-id': 8196, 'type': 'rx'}, > {'id': 0, 'ifindex': 2, 'napi-id': 8193, 'type': 'tx'}, > {'id': 1, 'ifindex': 2, 'napi-id': 8194, 'type': 'tx'}, > {'id': 2, 'ifindex': 2, 'napi-id': 8195, 'type': 'tx'}, > {'id': 3, 'ifindex': 2, 'napi-id': 8196, 'type': 'tx'}] > > Since IGC_FLAG_QUEUE_PAIRS is enabled, you'll note that the same NAPI ID > is present for both rx and tx queues at the same index, for example > index 0: > > {'id': 0, 'ifindex': 2, 'napi-id': 8193, 'type': 'rx'}, > {'id': 0, 'ifindex': 2, 'napi-id': 8193, 'type': 'tx'}, > > To test IGC_FLAG_QUEUE_PAIRS disabled, a test system was booted using > the grub command line option "maxcpus=2" to force > igc_set_interrupt_capability to disable IGC_FLAG_QUEUE_PAIRS. > > Example output when IGC_FLAG_QUEUE_PAIRS is disabled: > > $ lscpu | grep "On-line CPU" > On-line CPU(s) list: 0,2 > > $ ethtool -l enp86s0 | tail -5 > Current hardware settings: > RX: n/a > TX: n/a > Other: 1 > Combined: 2 > > $ cat /proc/interrupts | grep enp > 144: [...] enp86s0 > 145: [...] enp86s0-rx-0 > 146: [...] enp86s0-rx-1 > 147: [...] enp86s0-tx-0 > 148: [...] enp86s0-tx-1 > > 1 "other" IRQ, and 2 IRQs for each of RX and Tx, so we expect netlink to > report 4 IRQs with unique NAPI IDs: > > $ ./tools/net/ynl/cli.py --spec Documentation/netlink/specs/netdev.yaml \ > --dump napi-get --json='{"ifindex": 2}' > [{'id': 8196, 'ifindex': 2, 'irq': 148}, > {'id': 8195, 'ifindex': 2, 'irq': 147}, > {'id': 8194, 'ifindex': 2, 'irq': 146}, > {'id': 8193, 'ifindex': 2, 'irq': 145}] > > Now we examine which queues these NAPIs are associated with, expecting > that since IGC_FLAG_QUEUE_PAIRS is disabled each RX and TX queue will > have its own NAPI instance: > > $ ./tools/net/ynl/cli.py --spec Documentation/netlink/specs/netdev.yaml \ > --dump queue-get --json='{"ifindex": 2}' > [{'id': 0, 'ifindex': 2, 'napi-id': 8193, 'type': 'rx'}, > {'id': 1, 'ifindex': 2, 'napi-id': 8194, 'type': 'rx'}, > {'id': 0, 'ifindex': 2, 'napi-id': 8195, 'type': 'tx'}, > {'id': 1, 'ifindex': 2, 'napi-id': 8196, 'type': 'tx'}] > > Signed-off-by: Joe Damato <jdamato@fastly.com> Reviewed-by: Vitaly Lifshits <vitaly.lifshits@intel.com> > --- > v6: > - Rename __igc_do_resume to __igc_resume and rename the boolean > argument "need_rtnl" to "rpm" as seen in igb, as per Vitaly's > feedback to make the code look more like commit ac8c58f5b535 ("igb: > fix deadlock caused by taking RTNL in RPM resume path"). > > v5: > - Rename igc_resume to __igc_do_resume and pass in a boolean > "need_rtnl" to signal whether or not rtnl should be held before > caling __igc_open. Call this new function from igc_runtime_resume > and igc_resume passing in false (for igc_runtime_resume) and true > (igc_resume), respectively. This is done to avoid reintroducing a > bug fixed in commit: 6f31d6b: "igc: Refactor runtime power > management flow" where rtnl is held in runtime_resume causing a > deadlock. > > v4: > - Add rtnl_lock/rtnl_unlock in two paths: igc_resume and > igc_io_error_detected. The code added to the latter is inspired by > a similar implementation in ixgbe's ixgbe_io_error_detected. > > v3: > - Replace igc_unset_queue_napi with igc_set_queue_napi(adapater, i, > NULL), as suggested by Vinicius Costa Gomes > - Simplify implemention of igc_set_queue_napi as suggested by Kurt > Kanzenbach, with a tweak to use ring->queue_index > > v2: > - Update commit message to include tests for IGC_FLAG_QUEUE_PAIRS > disabled > - Refactored code to move napi queue mapping and unmapping to helper > functions igc_set_queue_napi and igc_unset_queue_napi > - Adjust the code to handle IGC_FLAG_QUEUE_PAIRS disabled > - Call helpers to map/unmap queues to NAPIs in igc_up, __igc_open, > igc_xdp_enable_pool, and igc_xdp_disable_pool > > drivers/net/ethernet/intel/igc/igc.h | 2 + > drivers/net/ethernet/intel/igc/igc_main.c | 56 +++++++++++++++++++---- > drivers/net/ethernet/intel/igc/igc_xdp.c | 2 + > 3 files changed, 51 insertions(+), 9 deletions(-) > > diff --git a/drivers/net/ethernet/intel/igc/igc.h b/drivers/net/ethernet/intel/igc/igc.h > index eac0f966e0e4..b8111ad9a9a8 100644 > --- a/drivers/net/ethernet/intel/igc/igc.h > +++ b/drivers/net/ethernet/intel/igc/igc.h > @@ -337,6 +337,8 @@ struct igc_adapter { > struct igc_led_classdev *leds; > }; > > +void igc_set_queue_napi(struct igc_adapter *adapter, int q_idx, > + struct napi_struct *napi); > void igc_up(struct igc_adapter *adapter); > void igc_down(struct igc_adapter *adapter); > int igc_open(struct net_device *netdev); > diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c > index 7964bbedb16c..9a5ece12e9d4 100644 > --- a/drivers/net/ethernet/intel/igc/igc_main.c > +++ b/drivers/net/ethernet/intel/igc/igc_main.c > @@ -4948,6 +4948,22 @@ static int igc_sw_init(struct igc_adapter *adapter) > return 0; > } > > +void igc_set_queue_napi(struct igc_adapter *adapter, int vector, > + struct napi_struct *napi) > +{ > + struct igc_q_vector *q_vector = adapter->q_vector[vector]; > + > + if (q_vector->rx.ring) > + netif_queue_set_napi(adapter->netdev, > + q_vector->rx.ring->queue_index, > + NETDEV_QUEUE_TYPE_RX, napi); > + > + if (q_vector->tx.ring) > + netif_queue_set_napi(adapter->netdev, > + q_vector->tx.ring->queue_index, > + NETDEV_QUEUE_TYPE_TX, napi); > +} > + > /** > * igc_up - Open the interface and prepare it to handle traffic > * @adapter: board private structure > @@ -4955,6 +4971,7 @@ static int igc_sw_init(struct igc_adapter *adapter) > void igc_up(struct igc_adapter *adapter) > { > struct igc_hw *hw = &adapter->hw; > + struct napi_struct *napi; > int i = 0; > > /* hardware has been reset, we need to reload some things */ > @@ -4962,8 +4979,11 @@ void igc_up(struct igc_adapter *adapter) > > clear_bit(__IGC_DOWN, &adapter->state); > > - for (i = 0; i < adapter->num_q_vectors; i++) > - napi_enable(&adapter->q_vector[i]->napi); > + for (i = 0; i < adapter->num_q_vectors; i++) { > + napi = &adapter->q_vector[i]->napi; > + napi_enable(napi); > + igc_set_queue_napi(adapter, i, napi); > + } > > if (adapter->msix_entries) > igc_configure_msix(adapter); > @@ -5192,6 +5212,7 @@ void igc_down(struct igc_adapter *adapter) > for (i = 0; i < adapter->num_q_vectors; i++) { > if (adapter->q_vector[i]) { > napi_synchronize(&adapter->q_vector[i]->napi); > + igc_set_queue_napi(adapter, i, NULL); > napi_disable(&adapter->q_vector[i]->napi); > } > } > @@ -6021,6 +6042,7 @@ static int __igc_open(struct net_device *netdev, bool resuming) > struct igc_adapter *adapter = netdev_priv(netdev); > struct pci_dev *pdev = adapter->pdev; > struct igc_hw *hw = &adapter->hw; > + struct napi_struct *napi; > int err = 0; > int i = 0; > > @@ -6056,8 +6078,11 @@ static int __igc_open(struct net_device *netdev, bool resuming) > > clear_bit(__IGC_DOWN, &adapter->state); > > - for (i = 0; i < adapter->num_q_vectors; i++) > - napi_enable(&adapter->q_vector[i]->napi); > + for (i = 0; i < adapter->num_q_vectors; i++) { > + napi = &adapter->q_vector[i]->napi; > + napi_enable(napi); > + igc_set_queue_napi(adapter, i, napi); > + } > > /* Clear any pending interrupts. */ > rd32(IGC_ICR); > @@ -7342,7 +7367,7 @@ static void igc_deliver_wake_packet(struct net_device *netdev) > netif_rx(skb); > } > > -static int igc_resume(struct device *dev) > +static int __igc_resume(struct device *dev, bool rpm) > { > struct pci_dev *pdev = to_pci_dev(dev); > struct net_device *netdev = pci_get_drvdata(pdev); > @@ -7385,7 +7410,11 @@ static int igc_resume(struct device *dev) > wr32(IGC_WUS, ~0); > > if (netif_running(netdev)) { > + if (!rpm) > + rtnl_lock(); > err = __igc_open(netdev, true); > + if (!rpm) > + rtnl_unlock(); > if (!err) > netif_device_attach(netdev); > } > @@ -7393,9 +7422,14 @@ static int igc_resume(struct device *dev) > return err; > } > > +static int igc_resume(struct device *dev) > +{ > + return __igc_resume(dev, false); > +} > + > static int igc_runtime_resume(struct device *dev) > { > - return igc_resume(dev); > + return __igc_resume(dev, true); > } > > static int igc_suspend(struct device *dev) > @@ -7440,14 +7474,18 @@ static pci_ers_result_t igc_io_error_detected(struct pci_dev *pdev, > struct net_device *netdev = pci_get_drvdata(pdev); > struct igc_adapter *adapter = netdev_priv(netdev); > > + rtnl_lock(); > netif_device_detach(netdev); > > - if (state == pci_channel_io_perm_failure) > + if (state == pci_channel_io_perm_failure) { > + rtnl_unlock(); > return PCI_ERS_RESULT_DISCONNECT; > + } > > if (netif_running(netdev)) > igc_down(adapter); > pci_disable_device(pdev); > + rtnl_unlock(); > > /* Request a slot reset. */ > return PCI_ERS_RESULT_NEED_RESET; > @@ -7458,7 +7496,7 @@ static pci_ers_result_t igc_io_error_detected(struct pci_dev *pdev, > * @pdev: Pointer to PCI device > * > * Restart the card from scratch, as if from a cold-boot. Implementation > - * resembles the first-half of the igc_resume routine. > + * resembles the first-half of the __igc_resume routine. > **/ > static pci_ers_result_t igc_io_slot_reset(struct pci_dev *pdev) > { > @@ -7497,7 +7535,7 @@ static pci_ers_result_t igc_io_slot_reset(struct pci_dev *pdev) > * > * This callback is called when the error recovery driver tells us that > * its OK to resume normal operation. Implementation resembles the > - * second-half of the igc_resume routine. > + * second-half of the __igc_resume routine. > */ > static void igc_io_resume(struct pci_dev *pdev) > { > diff --git a/drivers/net/ethernet/intel/igc/igc_xdp.c b/drivers/net/ethernet/intel/igc/igc_xdp.c > index e27af72aada8..4da633430b80 100644 > --- a/drivers/net/ethernet/intel/igc/igc_xdp.c > +++ b/drivers/net/ethernet/intel/igc/igc_xdp.c > @@ -84,6 +84,7 @@ static int igc_xdp_enable_pool(struct igc_adapter *adapter, > napi_disable(napi); > } > > + igc_set_queue_napi(adapter, queue_id, NULL); > set_bit(IGC_RING_FLAG_AF_XDP_ZC, &rx_ring->flags); > set_bit(IGC_RING_FLAG_AF_XDP_ZC, &tx_ring->flags); > > @@ -133,6 +134,7 @@ static int igc_xdp_disable_pool(struct igc_adapter *adapter, u16 queue_id) > xsk_pool_dma_unmap(pool, IGC_RX_DMA_ATTR); > clear_bit(IGC_RING_FLAG_AF_XDP_ZC, &rx_ring->flags); > clear_bit(IGC_RING_FLAG_AF_XDP_ZC, &tx_ring->flags); > + igc_set_queue_napi(adapter, queue_id, napi); > > if (needs_reset) { > napi_enable(napi); > ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Intel-wired-lan] [PATCH iwl-next v6 2/2] igc: Link queues to NAPI instances 2024-10-29 20:12 ` [Intel-wired-lan] [PATCH iwl-next v6 2/2] igc: Link queues " Joe Damato 2024-10-30 8:46 ` Lifshits, Vitaly @ 2024-11-12 15:06 ` Avigail Dahan 1 sibling, 0 replies; 7+ messages in thread From: Avigail Dahan @ 2024-11-12 15:06 UTC (permalink / raw) To: Joe Damato, netdev Cc: vitaly.lifshits, jacob.e.keller, kurt, vinicius.gomes, Tony Nguyen, Przemek Kitszel, Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Alexei Starovoitov, Daniel Borkmann, Jesper Dangaard Brouer, John Fastabend, moderated list:INTEL ETHERNET DRIVERS, open list, open list:XDP (eXpress Data Path) On 29/10/2024 22:12, Joe Damato wrote: > Link queues to NAPI instances via netdev-genl API so that users can > query this information with netlink. Handle a few cases in the driver: > 1. Link/unlink the NAPIs when XDP is enabled/disabled > 2. Handle IGC_FLAG_QUEUE_PAIRS enabled and disabled > > Example output when IGC_FLAG_QUEUE_PAIRS is enabled: > > $ ./tools/net/ynl/cli.py --spec Documentation/netlink/specs/netdev.yaml \ > --dump queue-get --json='{"ifindex": 2}' > > [{'id': 0, 'ifindex': 2, 'napi-id': 8193, 'type': 'rx'}, > {'id': 1, 'ifindex': 2, 'napi-id': 8194, 'type': 'rx'}, > {'id': 2, 'ifindex': 2, 'napi-id': 8195, 'type': 'rx'}, > {'id': 3, 'ifindex': 2, 'napi-id': 8196, 'type': 'rx'}, > {'id': 0, 'ifindex': 2, 'napi-id': 8193, 'type': 'tx'}, > {'id': 1, 'ifindex': 2, 'napi-id': 8194, 'type': 'tx'}, > {'id': 2, 'ifindex': 2, 'napi-id': 8195, 'type': 'tx'}, > {'id': 3, 'ifindex': 2, 'napi-id': 8196, 'type': 'tx'}] > > Since IGC_FLAG_QUEUE_PAIRS is enabled, you'll note that the same NAPI ID > is present for both rx and tx queues at the same index, for example > index 0: > > {'id': 0, 'ifindex': 2, 'napi-id': 8193, 'type': 'rx'}, > {'id': 0, 'ifindex': 2, 'napi-id': 8193, 'type': 'tx'}, > > To test IGC_FLAG_QUEUE_PAIRS disabled, a test system was booted using > the grub command line option "maxcpus=2" to force > igc_set_interrupt_capability to disable IGC_FLAG_QUEUE_PAIRS. > > Example output when IGC_FLAG_QUEUE_PAIRS is disabled: > > $ lscpu | grep "On-line CPU" > On-line CPU(s) list: 0,2 > > $ ethtool -l enp86s0 | tail -5 > Current hardware settings: > RX: n/a > TX: n/a > Other: 1 > Combined: 2 > > $ cat /proc/interrupts | grep enp > 144: [...] enp86s0 > 145: [...] enp86s0-rx-0 > 146: [...] enp86s0-rx-1 > 147: [...] enp86s0-tx-0 > 148: [...] enp86s0-tx-1 > > 1 "other" IRQ, and 2 IRQs for each of RX and Tx, so we expect netlink to > report 4 IRQs with unique NAPI IDs: > > $ ./tools/net/ynl/cli.py --spec Documentation/netlink/specs/netdev.yaml \ > --dump napi-get --json='{"ifindex": 2}' > [{'id': 8196, 'ifindex': 2, 'irq': 148}, > {'id': 8195, 'ifindex': 2, 'irq': 147}, > {'id': 8194, 'ifindex': 2, 'irq': 146}, > {'id': 8193, 'ifindex': 2, 'irq': 145}] > > Now we examine which queues these NAPIs are associated with, expecting > that since IGC_FLAG_QUEUE_PAIRS is disabled each RX and TX queue will > have its own NAPI instance: > > $ ./tools/net/ynl/cli.py --spec Documentation/netlink/specs/netdev.yaml \ > --dump queue-get --json='{"ifindex": 2}' > [{'id': 0, 'ifindex': 2, 'napi-id': 8193, 'type': 'rx'}, > {'id': 1, 'ifindex': 2, 'napi-id': 8194, 'type': 'rx'}, > {'id': 0, 'ifindex': 2, 'napi-id': 8195, 'type': 'tx'}, > {'id': 1, 'ifindex': 2, 'napi-id': 8196, 'type': 'tx'}] > > Signed-off-by: Joe Damato <jdamato@fastly.com> > Reviewed-by: Vitaly Lifshits <vitaly.lifshits@intel.com> > --- > v6: > - Rename __igc_do_resume to __igc_resume and rename the boolean > argument "need_rtnl" to "rpm" as seen in igb, as per Vitaly's > feedback to make the code look more like commit ac8c58f5b535 ("igb: > fix deadlock caused by taking RTNL in RPM resume path"). > > v5: > - Rename igc_resume to __igc_do_resume and pass in a boolean > "need_rtnl" to signal whether or not rtnl should be held before > caling __igc_open. Call this new function from igc_runtime_resume > and igc_resume passing in false (for igc_runtime_resume) and true > (igc_resume), respectively. This is done to avoid reintroducing a > bug fixed in commit: 6f31d6b: "igc: Refactor runtime power > management flow" where rtnl is held in runtime_resume causing a > deadlock. > > v4: > - Add rtnl_lock/rtnl_unlock in two paths: igc_resume and > igc_io_error_detected. The code added to the latter is inspired by > a similar implementation in ixgbe's ixgbe_io_error_detected. > > v3: > - Replace igc_unset_queue_napi with igc_set_queue_napi(adapater, i, > NULL), as suggested by Vinicius Costa Gomes > - Simplify implemention of igc_set_queue_napi as suggested by Kurt > Kanzenbach, with a tweak to use ring->queue_index > > v2: > - Update commit message to include tests for IGC_FLAG_QUEUE_PAIRS > disabled > - Refactored code to move napi queue mapping and unmapping to helper > functions igc_set_queue_napi and igc_unset_queue_napi > - Adjust the code to handle IGC_FLAG_QUEUE_PAIRS disabled > - Call helpers to map/unmap queues to NAPIs in igc_up, __igc_open, > igc_xdp_enable_pool, and igc_xdp_disable_pool > > drivers/net/ethernet/intel/igc/igc.h | 2 + > drivers/net/ethernet/intel/igc/igc_main.c | 56 +++++++++++++++++++---- > drivers/net/ethernet/intel/igc/igc_xdp.c | 2 + > 3 files changed, 51 insertions(+), 9 deletions(-) > Tested-by: Avigail Dahan <avigailx.dahan@intel.com> ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2024-11-12 15:06 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-10-29 20:12 [Intel-wired-lan] [PATCH iwl-next v6 0/2] igc: Link IRQs and queues to NAPIs Joe Damato 2024-10-29 20:12 ` [Intel-wired-lan] [PATCH iwl-next v6 1/2] igc: Link IRQs to NAPI instances Joe Damato 2024-10-30 8:47 ` Lifshits, Vitaly 2024-11-12 13:50 ` Avigail Dahan 2024-10-29 20:12 ` [Intel-wired-lan] [PATCH iwl-next v6 2/2] igc: Link queues " Joe Damato 2024-10-30 8:46 ` Lifshits, Vitaly 2024-11-12 15:06 ` Avigail Dahan
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox