Module Name:    src
Committed By:   yamaguchi
Date:           Thu Jan 16 07:16:04 UTC 2020

Modified Files:
        src/sys/dev/pci: if_ixl.c

Log Message:
Fix ixl(4) not to assign interrupts to cpu #0
if ncpu > queue pairs


To generate a diff of this commit:
cvs rdiff -u -r1.21 -r1.22 src/sys/dev/pci/if_ixl.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/pci/if_ixl.c
diff -u src/sys/dev/pci/if_ixl.c:1.21 src/sys/dev/pci/if_ixl.c:1.22
--- src/sys/dev/pci/if_ixl.c:1.21	Thu Jan 16 07:11:50 2020
+++ src/sys/dev/pci/if_ixl.c	Thu Jan 16 07:16:04 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ixl.c,v 1.21 2020/01/16 07:11:50 yamaguchi Exp $	*/
+/*	$NetBSD: if_ixl.c,v 1.22 2020/01/16 07:16:04 yamaguchi Exp $	*/
 
 /*
  * Copyright (c) 2013-2015, Intel Corporation
@@ -807,7 +807,6 @@ static int	ixl_ifflags_cb(struct etherco
 static int	ixl_setup_interrupts(struct ixl_softc *);
 static int	ixl_establish_intx(struct ixl_softc *);
 static int	ixl_establish_msix(struct ixl_softc *);
-static void	ixl_set_affinity_msix(struct ixl_softc *);
 static void	ixl_enable_queue_intr(struct ixl_softc *,
 		    struct ixl_queue_pair *);
 static void	ixl_disable_queue_intr(struct ixl_softc *,
@@ -5297,12 +5296,16 @@ static int
 ixl_establish_msix(struct ixl_softc *sc)
 {
 	pci_chipset_tag_t pc = sc->sc_pa.pa_pc;
+	kcpuset_t *affinity;
 	unsigned int vector = 0;
 	unsigned int i;
+	int affinity_to, r;
 	char xnamebuf[32];
 	char intrbuf[PCI_INTRSTR_LEN];
 	char const *intrstr;
 
+	kcpuset_create(&affinity, false);
+
 	/* the "other" intr is mapped to vector 0 */
 	vector = 0;
 	intrstr = pci_intr_string(pc, sc->sc_ihp[vector],
@@ -5317,10 +5320,23 @@ ixl_establish_msix(struct ixl_softc *sc)
 		    "unable to establish interrupt at %s\n", intrstr);
 		goto fail;
 	}
+
+	aprint_normal_dev(sc->sc_dev, "other interrupt at %s", intrstr);
+
+	affinity_to = ncpu > (int)sc->sc_nqueue_pairs_max ? 1 : 0;
+	affinity_to = (affinity_to + sc->sc_nqueue_pairs_max) % ncpu;
+
+	kcpuset_zero(affinity);
+	kcpuset_set(affinity, affinity_to);
+	r = interrupt_distribute(sc->sc_ihs[vector], affinity, NULL);
+	if (r == 0) {
+		aprint_normal(", affinity to %u", affinity_to);
+	}
+	aprint_normal("\n");
 	vector++;
-	aprint_normal_dev(sc->sc_dev, "interrupt at %s\n", intrstr);
 
 	sc->sc_msix_vector_queue = vector;
+	affinity_to = ncpu > (int)sc->sc_nqueue_pairs_max ? 1 : 0;
 
 	for (i = 0; i < sc->sc_nqueue_pairs_max; i++) {
 		intrstr = pci_intr_string(pc, sc->sc_ihp[vector],
@@ -5337,11 +5353,23 @@ ixl_establish_msix(struct ixl_softc *sc)
 			    "unable to establish interrupt at %s\n", intrstr);
 			goto fail;
 		}
-		vector++;
+
 		aprint_normal_dev(sc->sc_dev,
-		    "interrupt at %s\n", intrstr);
+		    "for TXRX%d interrupt at %s",i , intrstr);
+
+		kcpuset_zero(affinity);
+		kcpuset_set(affinity, affinity_to);
+		r = interrupt_distribute(sc->sc_ihs[vector], affinity, NULL);
+		if (r == 0) {
+			aprint_normal(", affinity to %u", affinity_to);
+			affinity_to = (affinity_to + 1) % ncpu;
+		}
+		aprint_normal("\n");
+		vector++;
 	}
 
+	kcpuset_destroy(affinity);
+
 	return 0;
 fail:
 	for (i = 0; i < vector; i++) {
@@ -5350,67 +5378,12 @@ fail:
 
 	sc->sc_msix_vector_queue = 0;
 	sc->sc_msix_vector_queue = 0;
+	kcpuset_destroy(affinity);
 
 	return -1;
 }
 
 static void
-ixl_set_affinity_msix(struct ixl_softc *sc)
-{
-	kcpuset_t *affinity;
-	pci_chipset_tag_t pc = sc->sc_pa.pa_pc;
-	int affinity_to, r;
-	unsigned int i, vector;
-	char intrbuf[PCI_INTRSTR_LEN];
-	char const *intrstr;
-
-	affinity_to = 0;
-	kcpuset_create(&affinity, false);
-
-	vector = sc->sc_msix_vector_queue;
-
-	for (i = 0; i < sc->sc_nqueue_pairs_max; i++) {
-		affinity_to = i % ncpu;
-
-		kcpuset_zero(affinity);
-		kcpuset_set(affinity, affinity_to);
-
-		intrstr = pci_intr_string(pc, sc->sc_ihp[vector + i],
-		    intrbuf, sizeof(intrbuf));
-		r = interrupt_distribute(sc->sc_ihs[vector + i],
-		    affinity, NULL);
-		if (r == 0) {
-			aprint_normal_dev(sc->sc_dev,
-			    "for TXRX%u interrupting at %s affinity to %u\n",
-			    i, intrstr, affinity_to);
-		} else {
-			aprint_normal_dev(sc->sc_dev,
-			    "for TXRX%u interrupting at %s\n",
-			    i, intrstr);
-		}
-	}
-
-	vector = 0; /* vector 0 means "other" interrupt */
-	affinity_to = (affinity_to + 1) % ncpu;
-	kcpuset_zero(affinity);
-	kcpuset_set(affinity, affinity_to);
-
-	intrstr = pci_intr_string(pc, sc->sc_ihp[vector],
-	    intrbuf, sizeof(intrbuf));
-	r = interrupt_distribute(sc->sc_ihs[vector], affinity, NULL);
-	if (r == 0) {
-		aprint_normal_dev(sc->sc_dev,
-		    "for other interrupting at %s affinity to %u\n",
-		    intrstr, affinity_to);
-	} else {
-		aprint_normal_dev(sc->sc_dev,
-		    "for other interrupting at %s", intrstr);
-	}
-
-	kcpuset_destroy(affinity);
-}
-
-static void
 ixl_config_queue_intr(struct ixl_softc *sc)
 {
 	unsigned int i, vector;
@@ -5538,8 +5511,6 @@ ixl_setup_interrupts(struct ixl_softc *s
 			if (error) {
 				counts[PCI_INTR_TYPE_MSIX] = 0;
 				retry = true;
-			} else {
-				ixl_set_affinity_msix(sc);
 			}
 		} else if (intr_type == PCI_INTR_TYPE_INTX) {
 			error = ixl_establish_intx(sc);

Reply via email to