net: ena: Don't register memory info on XDP exchange
authorDavid Arinzon <darinzon@amazon.com>
Thu, 29 Dec 2022 07:30:06 +0000 (07:30 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 12 Jan 2023 11:02:17 +0000 (12:02 +0100)
[ Upstream commit 9c9e539956fa67efb8a65e32b72a853740b33445 ]

Since the queues aren't destroyed when we only exchange XDP programs,
there's no need to re-register them again.

Fixes: 548c4940b9f1 ("net: ena: Implement XDP_TX action")
Signed-off-by: Shay Agroskin <shayagr@amazon.com>
Signed-off-by: David Arinzon <darinzon@amazon.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/amazon/ena/ena_netdev.c

index 5a454b5..e313bb4 100644 (file)
@@ -512,16 +512,18 @@ static void ena_xdp_exchange_program_rx_in_range(struct ena_adapter *adapter,
                                                 struct bpf_prog *prog,
                                                 int first, int count)
 {
+       struct bpf_prog *old_bpf_prog;
        struct ena_ring *rx_ring;
        int i = 0;
 
        for (i = first; i < count; i++) {
                rx_ring = &adapter->rx_ring[i];
-               xchg(&rx_ring->xdp_bpf_prog, prog);
-               if (prog) {
+               old_bpf_prog = xchg(&rx_ring->xdp_bpf_prog, prog);
+
+               if (!old_bpf_prog && prog) {
                        ena_xdp_register_rxq_info(rx_ring);
                        rx_ring->rx_headroom = XDP_PACKET_HEADROOM;
-               } else {
+               } else if (old_bpf_prog && !prog) {
                        ena_xdp_unregister_rxq_info(rx_ring);
                        rx_ring->rx_headroom = NET_SKB_PAD;
                }