From e5d8adf7e5f20682090ed6e9f6183528cd6c8539 Mon Sep 17 00:00:00 2001 From: Bjarne von Horn Date: Mon, 12 Feb 2024 10:54:45 +0100 Subject: [PATCH] Fix resource leak in igb --- devices/igb/igb_main-3.18-ethercat.c | 16 +++++++--------- devices/igb/igb_main-4.19-ethercat.c | 16 +++++++--------- devices/igb/igb_main-4.4-ethercat.c | 16 +++++++--------- devices/igb/igb_main-5.10-ethercat.c | 20 ++++++++++---------- devices/igb/igb_main-5.14-ethercat.c | 13 +++++++------ devices/igb/igb_main-5.15-ethercat.c | 19 ++++++++++--------- devices/igb/igb_main-6.1-ethercat.c | 11 ++++++----- 7 files changed, 54 insertions(+), 57 deletions(-) diff --git a/devices/igb/igb_main-3.18-ethercat.c b/devices/igb/igb_main-3.18-ethercat.c index 36f7bda5..44c41fa4 100644 --- a/devices/igb/igb_main-3.18-ethercat.c +++ b/devices/igb/igb_main-3.18-ethercat.c @@ -1047,10 +1047,7 @@ static void igb_reset_q_vector(struct igb_adapter *adapter, int v_idx) if (q_vector->rx.ring) adapter->tx_ring[q_vector->rx.ring->queue_index] = NULL; - if (!adapter->ecdev) { - netif_napi_del(&q_vector->napi); - } - + netif_napi_del(&q_vector->napi); } static void igb_reset_interrupt_capability(struct igb_adapter *adapter) @@ -1221,11 +1218,9 @@ static int igb_alloc_q_vector(struct igb_adapter *adapter, if (!q_vector) return -ENOMEM; - if (!adapter->ecdev) { - /* initialize NAPI */ - netif_napi_add(adapter->netdev, &q_vector->napi, - igb_poll, 64); - } + /* initialize NAPI */ + netif_napi_add(adapter->netdev, &q_vector->napi, + igb_poll, 64); /* tie q_vector and adapter together */ adapter->q_vector[v_idx] = q_vector; @@ -6430,6 +6425,9 @@ static int igb_poll(struct napi_struct *napi, int budget) napi); bool clean_complete = true; + if (q_vector->adapter->ecdev) + return -EBUSY; + #ifdef CONFIG_IGB_DCA if (q_vector->adapter->flags & IGB_FLAG_DCA_ENABLED) igb_update_dca(q_vector); diff --git a/devices/igb/igb_main-4.19-ethercat.c b/devices/igb/igb_main-4.19-ethercat.c index a4169472..d49ae92e 100644 --- a/devices/igb/igb_main-4.19-ethercat.c +++ b/devices/igb/igb_main-4.19-ethercat.c @@ -1037,10 +1037,7 @@ static void igb_reset_q_vector(struct igb_adapter *adapter, int v_idx) if (q_vector->rx.ring) adapter->rx_ring[q_vector->rx.ring->queue_index] = NULL; - if (!adapter->ecdev) { - netif_napi_del(&q_vector->napi); - } - + netif_napi_del(&q_vector->napi); } static void igb_reset_interrupt_capability(struct igb_adapter *adapter) @@ -1219,11 +1216,9 @@ static int igb_alloc_q_vector(struct igb_adapter *adapter, if (!q_vector) return -ENOMEM; - if (!adapter->ecdev) { - /* initialize NAPI */ - netif_napi_add(adapter->netdev, &q_vector->napi, - igb_poll, 64); - } + /* initialize NAPI */ + netif_napi_add(adapter->netdev, &q_vector->napi, + igb_poll, 64); /* tie q_vector and adapter together */ adapter->q_vector[v_idx] = q_vector; @@ -7858,6 +7853,9 @@ static int igb_poll(struct napi_struct *napi, int budget) bool clean_complete = true; int work_done = 0; + if (q_vector->adapter->ecdev) + return -EBUSY; + #ifdef CONFIG_IGB_DCA if (q_vector->adapter->flags & IGB_FLAG_DCA_ENABLED) igb_update_dca(q_vector); diff --git a/devices/igb/igb_main-4.4-ethercat.c b/devices/igb/igb_main-4.4-ethercat.c index 22c22b6f..fed16b89 100644 --- a/devices/igb/igb_main-4.4-ethercat.c +++ b/devices/igb/igb_main-4.4-ethercat.c @@ -1047,10 +1047,7 @@ static void igb_reset_q_vector(struct igb_adapter *adapter, int v_idx) if (q_vector->rx.ring) adapter->rx_ring[q_vector->rx.ring->queue_index] = NULL; - if (!adapter->ecdev) { - netif_napi_del(&q_vector->napi); - } - + netif_napi_del(&q_vector->napi); } static void igb_reset_interrupt_capability(struct igb_adapter *adapter) @@ -1227,11 +1224,9 @@ static int igb_alloc_q_vector(struct igb_adapter *adapter, if (!q_vector) return -ENOMEM; - if (!adapter->ecdev) { - /* initialize NAPI */ - netif_napi_add(adapter->netdev, &q_vector->napi, - igb_poll, 64); - } + /* initialize NAPI */ + netif_napi_add(adapter->netdev, &q_vector->napi, + igb_poll, 64); /* tie q_vector and adapter together */ adapter->q_vector[v_idx] = q_vector; @@ -6492,6 +6487,9 @@ static int igb_poll(struct napi_struct *napi, int budget) bool clean_complete = true; int work_done = 0; + if (q_vector->adapter->ecdev) + return -EBUSY; + #ifdef CONFIG_IGB_DCA if (q_vector->adapter->flags & IGB_FLAG_DCA_ENABLED) igb_update_dca(q_vector); diff --git a/devices/igb/igb_main-5.10-ethercat.c b/devices/igb/igb_main-5.10-ethercat.c index 0b5dab47..e53e94fa 100644 --- a/devices/igb/igb_main-5.10-ethercat.c +++ b/devices/igb/igb_main-5.10-ethercat.c @@ -1036,9 +1036,7 @@ static void igb_reset_q_vector(struct igb_adapter *adapter, int v_idx) if (q_vector->rx.ring) adapter->rx_ring[q_vector->rx.ring->queue_index] = NULL; - if (!adapter->ecdev) - netif_napi_del(&q_vector->napi); - + netif_napi_del(&q_vector->napi); } static void igb_reset_interrupt_capability(struct igb_adapter *adapter) @@ -1218,10 +1216,8 @@ static int igb_alloc_q_vector(struct igb_adapter *adapter, return -ENOMEM; /* initialize NAPI */ - if (!adapter->ecdev) { - netif_napi_add(adapter->netdev, &q_vector->napi, - igb_poll, 64); - } + netif_napi_add(adapter->netdev, &q_vector->napi, + igb_poll, 64); /* tie q_vector and adapter together */ adapter->q_vector[v_idx] = q_vector; @@ -6477,7 +6473,7 @@ netdev_tx_t igb_xmit_frame_ring(struct sk_buff *skb, first->bytecount = skb->len; first->gso_segs = 1; - if (unlikely(!adapter->ecdev && + if (unlikely(!adapter->ecdev && skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)) { if (adapter->tstamp_config.tx_type == HWTSTAMP_TX_ON && @@ -8119,6 +8115,10 @@ static int igb_poll(struct napi_struct *napi, int budget) bool clean_complete = true; int work_done = 0; + if (q_vector->adapter->ecdev) { + return -EBUSY; + } + #ifdef CONFIG_IGB_DCA if (q_vector->adapter->flags & IGB_FLAG_DCA_ENABLED) igb_update_dca(q_vector); @@ -8260,7 +8260,7 @@ static bool igb_clean_tx_irq(struct igb_q_vector *q_vector, int napi_budget) q_vector->tx.total_bytes += total_bytes; q_vector->tx.total_packets += total_packets; - if (!adapter->ecdev && + if (!adapter->ecdev && test_bit(IGB_RING_FLAG_TX_DETECT_HANG, &tx_ring->flags)) { struct e1000_hw *hw = &adapter->hw; @@ -8912,7 +8912,7 @@ static int igb_clean_rx_irq(struct igb_q_vector *q_vector, const int budget) total_packets++; continue; } - + /* verify the packet layout is correct */ if (igb_cleanup_headers(rx_ring, rx_desc, skb)) { skb = NULL; diff --git a/devices/igb/igb_main-5.14-ethercat.c b/devices/igb/igb_main-5.14-ethercat.c index 4bf90205..61e8075e 100644 --- a/devices/igb/igb_main-5.14-ethercat.c +++ b/devices/igb/igb_main-5.14-ethercat.c @@ -1047,8 +1047,7 @@ static void igb_reset_q_vector(struct igb_adapter *adapter, int v_idx) if (q_vector->rx.ring) adapter->rx_ring[q_vector->rx.ring->queue_index] = NULL; - if (!adapter->ecdev) - netif_napi_del(&q_vector->napi); + netif_napi_del(&q_vector->napi); } @@ -1229,10 +1228,8 @@ static int igb_alloc_q_vector(struct igb_adapter *adapter, return -ENOMEM; /* initialize NAPI */ - if (!adapter->ecdev) { - netif_napi_add(adapter->netdev, &q_vector->napi, - igb_poll, 64); - } + netif_napi_add(adapter->netdev, &q_vector->napi, + igb_poll, 64); /* tie q_vector and adapter together */ adapter->q_vector[v_idx] = q_vector; @@ -8125,6 +8122,10 @@ static int igb_poll(struct napi_struct *napi, int budget) bool clean_complete = true; int work_done = 0; + if (get_ecdev(q_vector->adapter)) { + return -EBUSY; + } + #ifdef CONFIG_IGB_DCA if (q_vector->adapter->flags & IGB_FLAG_DCA_ENABLED) igb_update_dca(q_vector); diff --git a/devices/igb/igb_main-5.15-ethercat.c b/devices/igb/igb_main-5.15-ethercat.c index 2e93f4be..22b9a53e 100644 --- a/devices/igb/igb_main-5.15-ethercat.c +++ b/devices/igb/igb_main-5.15-ethercat.c @@ -1036,8 +1036,7 @@ static void igb_reset_q_vector(struct igb_adapter *adapter, int v_idx) if (q_vector->rx.ring) adapter->rx_ring[q_vector->rx.ring->queue_index] = NULL; - if (!adapter->ecdev) - netif_napi_del(&q_vector->napi); + netif_napi_del(&q_vector->napi); } @@ -1218,10 +1217,8 @@ static int igb_alloc_q_vector(struct igb_adapter *adapter, return -ENOMEM; /* initialize NAPI */ - if (!adapter->ecdev) { - netif_napi_add(adapter->netdev, &q_vector->napi, - igb_poll, 64); - } + netif_napi_add(adapter->netdev, &q_vector->napi, + igb_poll, 64); /* tie q_vector and adapter together */ adapter->q_vector[v_idx] = q_vector; @@ -6473,7 +6470,7 @@ netdev_tx_t igb_xmit_frame_ring(struct sk_buff *skb, first->bytecount = skb->len; first->gso_segs = 1; - if (unlikely(!adapter->ecdev && + if (unlikely(!adapter->ecdev && skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)) { if (adapter->tstamp_config.tx_type == HWTSTAMP_TX_ON && @@ -8115,6 +8112,10 @@ static int igb_poll(struct napi_struct *napi, int budget) bool clean_complete = true; int work_done = 0; + if (get_ecdev(q_vector->adapter)) { + return -EBUSY; + } + #ifdef CONFIG_IGB_DCA if (q_vector->adapter->flags & IGB_FLAG_DCA_ENABLED) igb_update_dca(q_vector); @@ -8256,7 +8257,7 @@ static bool igb_clean_tx_irq(struct igb_q_vector *q_vector, int napi_budget) q_vector->tx.total_bytes += total_bytes; q_vector->tx.total_packets += total_packets; - if (!adapter->ecdev && + if (!adapter->ecdev && test_bit(IGB_RING_FLAG_TX_DETECT_HANG, &tx_ring->flags)) { struct e1000_hw *hw = &adapter->hw; @@ -8907,7 +8908,7 @@ static int igb_clean_rx_irq(struct igb_q_vector *q_vector, const int budget) total_packets++; continue; } - + /* verify the packet layout is correct */ if (igb_cleanup_headers(rx_ring, rx_desc, skb)) { skb = NULL; diff --git a/devices/igb/igb_main-6.1-ethercat.c b/devices/igb/igb_main-6.1-ethercat.c index 13b860ce..144eab09 100644 --- a/devices/igb/igb_main-6.1-ethercat.c +++ b/devices/igb/igb_main-6.1-ethercat.c @@ -1034,8 +1034,7 @@ static void igb_reset_q_vector(struct igb_adapter *adapter, int v_idx) if (q_vector->rx.ring) adapter->rx_ring[q_vector->rx.ring->queue_index] = NULL; - if (!adapter->ecdev) - netif_napi_del(&q_vector->napi); + netif_napi_del(&q_vector->napi); } @@ -1220,9 +1219,7 @@ static int igb_alloc_q_vector(struct igb_adapter *adapter, return -ENOMEM; /* initialize NAPI */ - if (!adapter->ecdev) { - netif_napi_add(adapter->netdev, &q_vector->napi, igb_poll); - } + netif_napi_add(adapter->netdev, &q_vector->napi, igb_poll); /* tie q_vector and adapter together */ adapter->q_vector[v_idx] = q_vector; @@ -8268,6 +8265,10 @@ static int igb_poll(struct napi_struct *napi, int budget) bool clean_complete = true; int work_done = 0; + if (get_ecdev(q_vector->adapter)) { + return -EBUSY; + } + #ifdef CONFIG_IGB_DCA if (q_vector->adapter->flags & IGB_FLAG_DCA_ENABLED) igb_update_dca(q_vector);