[RFC net-next 2/2] igc: Link queues to NAPI instances

From: Joe Damato
Date: Thu Oct 03 2024 - 19:39:37 EST


Link queues to NAPI instances via netdev-genl API so that users can
query this information with netlink:

$ ./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 uses only combined queues, 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'},

Signed-off-by: Joe Damato <jdamato@xxxxxxxxxx>
---
drivers/net/ethernet/intel/igc/igc_main.c | 30 ++++++++++++++++++++---
1 file changed, 26 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c
index 7964bbedb16c..b3bd5bf29fa7 100644
--- a/drivers/net/ethernet/intel/igc/igc_main.c
+++ b/drivers/net/ethernet/intel/igc/igc_main.c
@@ -4955,6 +4955,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 +4963,17 @@ 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 only supports combined queues, so link each NAPI to both
+ * TX and RX
+ */
+ netif_queue_set_napi(adapter->netdev, i, NETDEV_QUEUE_TYPE_RX,
+ napi);
+ netif_queue_set_napi(adapter->netdev, i, NETDEV_QUEUE_TYPE_TX,
+ napi);
+ }

if (adapter->msix_entries)
igc_configure_msix(adapter);
@@ -5192,6 +5202,10 @@ 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);
+ netif_queue_set_napi(netdev, i, NETDEV_QUEUE_TYPE_RX,
+ NULL);
+ netif_queue_set_napi(netdev, i, NETDEV_QUEUE_TYPE_TX,
+ NULL);
napi_disable(&adapter->q_vector[i]->napi);
}
}
@@ -6021,6 +6035,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 +6071,15 @@ 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 only supports combined queues, so link each NAPI to both
+ * TX and RX
+ */
+ netif_queue_set_napi(netdev, i, NETDEV_QUEUE_TYPE_RX, napi);
+ netif_queue_set_napi(netdev, i, NETDEV_QUEUE_TYPE_TX, napi);
+ }

/* Clear any pending interrupts. */
rd32(IGC_ICR);
--
2.25.1