From fe2fb128f2e02a9858a576b2bce661091e10a890 Mon Sep 17 00:00:00 2001 From: Mahdi Khancherli Date: Sat, 2 Nov 2024 11:35:30 +0330 Subject: [PATCH 1/2] fix wrongly disabling static key (for xdp locking) --- src/ixgbe_lib.c | 5 +---- src/ixgbe_main.c | 7 +++++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/ixgbe_lib.c b/src/ixgbe_lib.c index 5db6141..43a9f73 100644 --- a/src/ixgbe_lib.c +++ b/src/ixgbe_lib.c @@ -1124,10 +1124,7 @@ static void ixgbe_free_q_vector(struct ixgbe_adapter *adapter, int v_idx) else adapter->tx_ring[ring->queue_index] = NULL; } - - if (static_key_enabled((struct static_key *)&ixgbe_xdp_locking_key)) - static_branch_dec(&ixgbe_xdp_locking_key); - + ixgbe_for_each_ring(ring, q_vector->rx) adapter->rx_ring[ring->queue_index] = NULL; diff --git a/src/ixgbe_main.c b/src/ixgbe_main.c index 5fd2d87..7687823 100644 --- a/src/ixgbe_main.c +++ b/src/ixgbe_main.c @@ -8618,6 +8618,11 @@ static int ixgbe_sw_init(struct ixgbe_adapter *adapter) adapter->tx_work_limit = IXGBE_DEFAULT_TX_WORK; set_bit(__IXGBE_DOWN, &adapter->state); + + /* enable locking for XDP_TX if we have more CPUs than queues */ + if (nr_cpu_ids > IXGBE_MAX_XDP_QS) + static_branch_enable(&ixgbe_xdp_locking_key); + out: return err; } @@ -13234,8 +13239,6 @@ static int ixgbe_xdp_setup(struct net_device *dev, struct bpf_prog *prog) */ if (nr_cpu_ids > IXGBE_MAX_XDP_QS * 2) return -ENOMEM; - else if (nr_cpu_ids > IXGBE_MAX_XDP_QS) - static_branch_inc(&ixgbe_xdp_locking_key); old_prog = xchg(&adapter->xdp_prog, prog); need_reset = (!!prog != !!old_prog); From ec0b43db0c07b4dc139432ce71c1817e47b8f867 Mon Sep 17 00:00:00 2001 From: Mahdi Khancherli Date: Sat, 2 Nov 2024 11:35:30 +0330 Subject: [PATCH 2/2] cleanup --- src/ixgbe_lib.c | 3 --- src/ixgbe_main.c | 7 +++++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ixgbe_lib.c b/src/ixgbe_lib.c index 5db6141..36832f2 100644 --- a/src/ixgbe_lib.c +++ b/src/ixgbe_lib.c @@ -1125,9 +1125,6 @@ static void ixgbe_free_q_vector(struct ixgbe_adapter *adapter, int v_idx) adapter->tx_ring[ring->queue_index] = NULL; } - if (static_key_enabled((struct static_key *)&ixgbe_xdp_locking_key)) - static_branch_dec(&ixgbe_xdp_locking_key); - ixgbe_for_each_ring(ring, q_vector->rx) adapter->rx_ring[ring->queue_index] = NULL; diff --git a/src/ixgbe_main.c b/src/ixgbe_main.c index 5fd2d87..7687823 100644 --- a/src/ixgbe_main.c +++ b/src/ixgbe_main.c @@ -8618,6 +8618,11 @@ static int ixgbe_sw_init(struct ixgbe_adapter *adapter) adapter->tx_work_limit = IXGBE_DEFAULT_TX_WORK; set_bit(__IXGBE_DOWN, &adapter->state); + + /* enable locking for XDP_TX if we have more CPUs than queues */ + if (nr_cpu_ids > IXGBE_MAX_XDP_QS) + static_branch_enable(&ixgbe_xdp_locking_key); + out: return err; } @@ -13234,8 +13239,6 @@ static int ixgbe_xdp_setup(struct net_device *dev, struct bpf_prog *prog) */ if (nr_cpu_ids > IXGBE_MAX_XDP_QS * 2) return -ENOMEM; - else if (nr_cpu_ids > IXGBE_MAX_XDP_QS) - static_branch_inc(&ixgbe_xdp_locking_key); old_prog = xchg(&adapter->xdp_prog, prog); need_reset = (!!prog != !!old_prog);