hpsa: set irq affinity hints to route MSI-X vectors across CPUs
authorStephen M. Cameron <scameron@beardog.cce.hp.com>
Thu, 29 May 2014 15:53:13 +0000 (10:53 -0500)
committerChristoph Hellwig <hch@lst.de>
Mon, 2 Jun 2014 07:54:55 +0000 (09:54 +0200)
Signed-off-by: Stephen M. Cameron <scameron@beardog.cce.hp.com>
Reviewed-by: Mike Miller <michael.miller@canonical.com>
Reviewed-by: Scott Teel <scott.teel@hp.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/scsi/hpsa.c

index b474dbaaa8d0d4021b4571380d423a6c445baa07..2b7454f6c50f8331fe785d8062b7034b4f82c314 100644 (file)
@@ -6615,6 +6615,17 @@ static void hpsa_free_cmd_pool(struct ctlr_info *h)
                        h->ioaccel_cmd_pool, h->ioaccel_cmd_pool_dhandle);
 }
 
+static void hpsa_irq_affinity_hints(struct ctlr_info *h)
+{
+       int i, cpu, rc;
+
+       cpu = cpumask_first(cpu_online_mask);
+       for (i = 0; i < h->msix_vector; i++) {
+               rc = irq_set_affinity_hint(h->intr[i], get_cpu_mask(cpu));
+               cpu = cpumask_next(cpu, cpu_online_mask);
+       }
+}
+
 static int hpsa_request_irq(struct ctlr_info *h,
        irqreturn_t (*msixhandler)(int, void *),
        irqreturn_t (*intxhandler)(int, void *))
@@ -6634,6 +6645,7 @@ static int hpsa_request_irq(struct ctlr_info *h,
                        rc = request_irq(h->intr[i], msixhandler,
                                        0, h->devname,
                                        &h->q[i]);
+               hpsa_irq_affinity_hints(h);
        } else {
                /* Use single reply pool */
                if (h->msix_vector > 0 || h->msi_vector) {
@@ -6685,12 +6697,15 @@ static void free_irqs(struct ctlr_info *h)
        if (!h->msix_vector || h->intr_mode != PERF_MODE_INT) {
                /* Single reply queue, only one irq to free */
                i = h->intr_mode;
+               irq_set_affinity_hint(h->intr[i], NULL);
                free_irq(h->intr[i], &h->q[i]);
                return;
        }
 
-       for (i = 0; i < h->msix_vector; i++)
+       for (i = 0; i < h->msix_vector; i++) {
+               irq_set_affinity_hint(h->intr[i], NULL);
                free_irq(h->intr[i], &h->q[i]);
+       }
 }
 
 static void hpsa_free_irqs_and_disable_msix(struct ctlr_info *h)