#include <linux/firmware.h>
 #include <linux/slab.h>
 #include <linux/u64_stats_sync.h>
+#include <linux/cpumask.h>
 
 #include "be_hw.h"
 #include "be_roce.h"
        u16 spurious_intr;
        struct napi_struct napi;
        struct be_adapter *adapter;
+       cpumask_var_t  affinity_mask;
 
 #ifdef CONFIG_NET_RX_BUSY_POLL
 #define BE_EQ_IDLE             0
 
                        napi_hash_del(&eqo->napi);
                        netif_napi_del(&eqo->napi);
                }
+               free_cpumask_var(eqo->affinity_mask);
                be_queue_free(adapter, &eqo->q);
        }
 }
                                    adapter->cfg_num_qs);
 
        for_all_evt_queues(adapter, eqo, i) {
+               if (!zalloc_cpumask_var(&eqo->affinity_mask, GFP_KERNEL))
+                       return -ENOMEM;
+               cpumask_set_cpu_local_first(i, dev_to_node(&adapter->pdev->dev),
+                                           eqo->affinity_mask);
+
                netif_napi_add(adapter->netdev, &eqo->napi, be_poll,
                               BE_NAPI_WEIGHT);
                napi_hash_add(&eqo->napi);
                status = request_irq(vec, be_msix, 0, eqo->desc, eqo);
                if (status)
                        goto err_msix;
+
+               irq_set_affinity_hint(vec, eqo->affinity_mask);
        }
 
        return 0;
 {
        struct net_device *netdev = adapter->netdev;
        struct be_eq_obj *eqo;
-       int i;
+       int i, vec;
 
        if (!adapter->isr_registered)
                return;
        }
 
        /* MSIx */
-       for_all_evt_queues(adapter, eqo, i)
-               free_irq(be_msix_vec_get(adapter, eqo), eqo);
+       for_all_evt_queues(adapter, eqo, i) {
+               vec = be_msix_vec_get(adapter, eqo);
+               irq_set_affinity_hint(vec, NULL);
+               free_irq(vec, eqo);
+       }
 
 done:
        adapter->isr_registered = false;