diff mbox series

[v2,2/2] octeon_ep: Fix irq releasing in the error handling path of octep_request_irqs()

Message ID d2fb2830e65081e2d15780bb5a5e1fb5d3602061.1652819974.git.christophe.jaillet@wanadoo.fr (mailing list archive)
State Accepted
Commit 3588c189e45aac69aa0deeedfd0d5de364030f37
Delegated to: Netdev Maintainers
Headers show
Series octeon_ep: Fix the error handling path of octep_request_irqs() | expand

Checks

Context Check Description
netdev/fixes_present success Fixes tag not required for -next series
netdev/subject_prefix warning Target tree name not specified in the subject
netdev/cover_letter success Series has a cover letter
netdev/patch_count success Link
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 0 this patch: 0
netdev/cc_maintainers success CCed 8 of 8 maintainers
netdev/build_clang success Errors and warnings before: 0 this patch: 0
netdev/module_param success Was 0 now: 0
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/verify_fixes success Fixes tag looks correct
netdev/build_allmodconfig_warn success Errors and warnings before: 0 this patch: 0
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 54 lines checked
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0
netdev/tree_selection success Guessing tree name failed - patch did not apply

Commit Message

Christophe JAILLET May 17, 2022, 8:59 p.m. UTC
When taken, the error handling path does not undo correctly what has
already been allocated.

Introduce a new loop index, 'j', in order to simplify the error handling
path and rewrite part of it.
It is now written with the same logic and intermediate variables used
when resources are allocated. This is much more straightforward.

Fixes: 37d79d059606 ("octeon_ep: add Tx/Rx processing and interrupt support")
Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
---
v2: Introduce 'j' and use it in the 2nd for loop
    Rewrite the error handling path (Dan Carpenter)

v1:
    https://lore.kernel.org/all/a1b6f082fff4e68007914577961113bc452c8030.1652629833.git.christophe.jaillet@wanadoo.fr/
---
 .../ethernet/marvell/octeon_ep/octep_main.c   | 25 +++++++++++--------
 1 file changed, 14 insertions(+), 11 deletions(-)
diff mbox series

Patch

diff --git a/drivers/net/ethernet/marvell/octeon_ep/octep_main.c b/drivers/net/ethernet/marvell/octeon_ep/octep_main.c
index 6b60a03574a0..a9b82d221780 100644
--- a/drivers/net/ethernet/marvell/octeon_ep/octep_main.c
+++ b/drivers/net/ethernet/marvell/octeon_ep/octep_main.c
@@ -202,7 +202,7 @@  static int octep_request_irqs(struct octep_device *oct)
 	struct msix_entry *msix_entry;
 	char **non_ioq_msix_names;
 	int num_non_ioq_msix;
-	int ret, i;
+	int ret, i, j;
 
 	num_non_ioq_msix = CFG_GET_NON_IOQ_MSIX(oct->conf);
 	non_ioq_msix_names = CFG_GET_NON_IOQ_MSIX_NAMES(oct->conf);
@@ -233,23 +233,23 @@  static int octep_request_irqs(struct octep_device *oct)
 	}
 
 	/* Request IRQs for Tx/Rx queues */
-	for (i = 0; i < oct->num_oqs; i++) {
-		ioq_vector = oct->ioq_vector[i];
-		msix_entry = &oct->msix_entries[i + num_non_ioq_msix];
+	for (j = 0; j < oct->num_oqs; j++) {
+		ioq_vector = oct->ioq_vector[j];
+		msix_entry = &oct->msix_entries[j + num_non_ioq_msix];
 
 		snprintf(ioq_vector->name, sizeof(ioq_vector->name),
-			 "%s-q%d", netdev->name, i);
+			 "%s-q%d", netdev->name, j);
 		ret = request_irq(msix_entry->vector,
 				  octep_ioq_intr_handler, 0,
 				  ioq_vector->name, ioq_vector);
 		if (ret) {
 			netdev_err(netdev,
 				   "request_irq failed for Q-%d; err=%d",
-				   i, ret);
+				   j, ret);
 			goto ioq_irq_err;
 		}
 
-		cpumask_set_cpu(i % num_online_cpus(),
+		cpumask_set_cpu(j % num_online_cpus(),
 				&ioq_vector->affinity_mask);
 		irq_set_affinity_hint(msix_entry->vector,
 				      &ioq_vector->affinity_mask);
@@ -257,10 +257,13 @@  static int octep_request_irqs(struct octep_device *oct)
 
 	return 0;
 ioq_irq_err:
-	while (i > num_non_ioq_msix) {
-		--i;
-		irq_set_affinity_hint(oct->msix_entries[i].vector, NULL);
-		free_irq(oct->msix_entries[i].vector, oct->ioq_vector[i]);
+	while (j) {
+		--j;
+		ioq_vector = oct->ioq_vector[j];
+		msix_entry = &oct->msix_entries[j + num_non_ioq_msix];
+
+		irq_set_affinity_hint(msix_entry->vector, NULL);
+		free_irq(msix_entry->vector, ioq_vector);
 	}
 non_ioq_irq_err:
 	while (i) {