ring->ena_dev = adapter->ena_dev;
        ring->per_napi_packets = 0;
        ring->cpu = 0;
+       ring->numa_node = 0;
        ring->no_interrupt_event_cnt = 0;
        u64_stats_init(&ring->syncp);
 }
        tx_ring->next_to_use = 0;
        tx_ring->next_to_clean = 0;
        tx_ring->cpu = ena_irq->cpu;
+       tx_ring->numa_node = node;
        return 0;
 
 err_push_buf_intermediate_buf:
        rx_ring->next_to_clean = 0;
        rx_ring->next_to_use = 0;
        rx_ring->cpu = ena_irq->cpu;
+       rx_ring->numa_node = node;
 
        return 0;
 }
        if (likely(tx_ring->cpu == cpu))
                goto out;
 
+       tx_ring->cpu = cpu;
+       if (rx_ring)
+               rx_ring->cpu = cpu;
+
        numa_node = cpu_to_node(cpu);
+
+       if (likely(tx_ring->numa_node == numa_node))
+               goto out;
+
        put_cpu();
 
        if (numa_node != NUMA_NO_NODE) {
                ena_com_update_numa_node(tx_ring->ena_com_io_cq, numa_node);
-               if (rx_ring)
+               tx_ring->numa_node = numa_node;
+               if (rx_ring) {
+                       rx_ring->numa_node = numa_node;
                        ena_com_update_numa_node(rx_ring->ena_com_io_cq,
                                                 numa_node);
+               }
        }
 
-       tx_ring->cpu = cpu;
-       if (rx_ring)
-               rx_ring->cpu = cpu;
-
        return;
 out:
        put_cpu();
                        if (ena_com_get_adaptive_moderation_enabled(rx_ring->ena_dev))
                                ena_adjust_adaptive_rx_intr_moderation(ena_napi);
 
+                       ena_update_ring_numa_node(tx_ring, rx_ring);
                        ena_unmask_interrupt(tx_ring, rx_ring);
                }
 
-               ena_update_ring_numa_node(tx_ring, rx_ring);
-
                ret = rx_work_done;
        } else {
                ret = budget;
        ctx.mem_queue_type = ena_dev->tx_mem_queue_type;
        ctx.msix_vector = msix_vector;
        ctx.queue_size = tx_ring->ring_size;
-       ctx.numa_node = cpu_to_node(tx_ring->cpu);
+       ctx.numa_node = tx_ring->numa_node;
 
        rc = ena_com_create_io_queue(ena_dev, &ctx);
        if (rc) {
        ctx.mem_queue_type = ENA_ADMIN_PLACEMENT_POLICY_HOST;
        ctx.msix_vector = msix_vector;
        ctx.queue_size = rx_ring->ring_size;
-       ctx.numa_node = cpu_to_node(rx_ring->cpu);
+       ctx.numa_node = rx_ring->numa_node;
 
        rc = ena_com_create_io_queue(ena_dev, &ctx);
        if (rc) {