#include <linux/aer.h>
 #include <linux/bitmap.h>
 #include <linux/cpu_rmap.h>
+#include <linux/cpumask.h>
 
 #include "bnxt_hsi.h"
 #include "bnxt.h"
 
        for (i = 0; i < bp->cp_nr_rings; i++) {
                irq = &bp->irq_tbl[i];
-               if (irq->requested)
+               if (irq->requested) {
+                       if (irq->have_cpumask) {
+                               irq_set_affinity_hint(irq->vector, NULL);
+                               free_cpumask_var(irq->cpu_mask);
+                               irq->have_cpumask = 0;
+                       }
                        free_irq(irq->vector, bp->bnapi[i]);
+               }
+
                irq->requested = 0;
        }
 }
                        break;
 
                irq->requested = 1;
+
+               if (zalloc_cpumask_var(&irq->cpu_mask, GFP_KERNEL)) {
+                       int numa_node = dev_to_node(&bp->pdev->dev);
+
+                       irq->have_cpumask = 1;
+                       cpumask_set_cpu(cpumask_local_spread(i, numa_node),
+                                       irq->cpu_mask);
+                       rc = irq_set_affinity_hint(irq->vector, irq->cpu_mask);
+                       if (rc) {
+                               netdev_warn(bp->dev,
+                                           "Set affinity failed, IRQ = %d\n",
+                                           irq->vector);
+                               break;
+                       }
+               }
        }
        return rc;
 }