netif_napi_add(cq->dev, &cq->napi, mlx4_en_poll_tx_cq,
                               NAPI_POLL_WEIGHT);
        } else {
+               struct mlx4_en_rx_ring *ring = priv->rx_ring[cq->ring];
+
+               err = irq_set_affinity_hint(cq->mcq.irq,
+                                           ring->affinity_mask);
+               if (err)
+                       mlx4_warn(mdev, "Failed setting affinity hint\n");
+
                netif_napi_add(cq->dev, &cq->napi, mlx4_en_poll_rx_cq, 64);
                napi_hash_add(&cq->napi);
        }
 
        mlx4_en_unmap_buffer(&cq->wqres.buf);
        mlx4_free_hwq_res(mdev->dev, &cq->wqres, cq->buf_size);
-       if (priv->mdev->dev->caps.comp_pool && cq->vector)
+       if (priv->mdev->dev->caps.comp_pool && cq->vector) {
+               if (!cq->is_tx)
+                       irq_set_affinity_hint(cq->mcq.irq, NULL);
                mlx4_release_eq(priv->mdev->dev, cq->vector);
+       }
        cq->vector = 0;
        cq->buf_size = 0;
        cq->buf = NULL;
 
        mutex_unlock(&mdev->state_lock);
 }
 
+static int mlx4_en_init_affinity_hint(struct mlx4_en_priv *priv, int ring_idx)
+{
+       struct mlx4_en_rx_ring *ring = priv->rx_ring[ring_idx];
+       int numa_node = priv->mdev->dev->numa_node;
+       int ret = 0;
+
+       if (!zalloc_cpumask_var(&ring->affinity_mask, GFP_KERNEL))
+               return -ENOMEM;
+
+       ret = cpumask_set_cpu_local_first(ring_idx, numa_node,
+                                         ring->affinity_mask);
+       if (ret)
+               free_cpumask_var(ring->affinity_mask);
+
+       return ret;
+}
+
+static void mlx4_en_free_affinity_hint(struct mlx4_en_priv *priv, int ring_idx)
+{
+       free_cpumask_var(priv->rx_ring[ring_idx]->affinity_mask);
+}
 
 int mlx4_en_start_port(struct net_device *dev)
 {
 
                mlx4_en_cq_init_lock(cq);
 
+               err = mlx4_en_init_affinity_hint(priv, i);
+               if (err) {
+                       en_err(priv, "Failed preparing IRQ affinity hint\n");
+                       goto cq_err;
+               }
+
                err = mlx4_en_activate_cq(priv, cq, i);
                if (err) {
                        en_err(priv, "Failed activating Rx CQ\n");
+                       mlx4_en_free_affinity_hint(priv, i);
                        goto cq_err;
                }
                for (j = 0; j < cq->size; j++)
                if (err) {
                        en_err(priv, "Failed setting cq moderation parameters\n");
                        mlx4_en_deactivate_cq(priv, cq);
+                       mlx4_en_free_affinity_hint(priv, i);
                        goto cq_err;
                }
                mlx4_en_arm_cq(priv, cq);
 mac_err:
        mlx4_en_put_qp(priv);
 cq_err:
-       while (rx_index--)
+       while (rx_index--) {
                mlx4_en_deactivate_cq(priv, priv->rx_cq[rx_index]);
+               mlx4_en_free_affinity_hint(priv, i);
+       }
        for (i = 0; i < priv->rx_ring_num; i++)
                mlx4_en_deactivate_rx_ring(priv, priv->rx_ring[i]);
 
                        msleep(1);
                mlx4_en_deactivate_rx_ring(priv, priv->rx_ring[i]);
                mlx4_en_deactivate_cq(priv, cq);
+
+               mlx4_en_free_affinity_hint(priv, i);
        }
 }