Re: [PATCH v2 nf-next] ipvs: Move defense_work and est_reload_work to system_dfl_long_wq

Julian Anastasov <[email protected]> Fri, 3 Jul 2026 20:49:55 +0300 (EEST)
Newsgroups org.kernel.vger.lvs-devel,org.kernel.vger.linux-kernel,org.kernel.vger.netdev,org.kernel.vger.netfilter-devel
Message-ID <[email protected]>
	Hello,

On Thu, 2 Jul 2026, Ismael Luceno wrote:

> Under synflood conditions binding these handlers to system_long_wq may
> pin them to a saturated CPU.
> 
> We've observed improved throughtput on a DPDK/VPP application with this
> change, which we attribute to the reduced context switching.
> 
> Neither handler has per-CPU data dependencies nor cache locality
> requirements that would prevent this change.
> 
> Signed-off-by: Ismael Luceno <[email protected]>

	Looks good to me, thanks!

Acked-by: Julian Anastasov <[email protected]>

> ---
> CC: Marco Crivellari <[email protected]>
> CC: Tejun Heo <[email protected]>
> 
> Changes since v1:
> * Rebased on nf-next
> * Reworded commit message
> 
>  net/netfilter/ipvs/ip_vs_ctl.c | 6 +++---
>  net/netfilter/ipvs/ip_vs_est.c | 2 +-
>  2 files changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c
> index bcf40b8c41cf..d7e669efab4d 100644
> --- a/net/netfilter/ipvs/ip_vs_ctl.c
> +++ b/net/netfilter/ipvs/ip_vs_ctl.c
> @@ -235,7 +235,7 @@ #define DEFENSE_TIMER_PERIOD	1*HZ
>  	update_defense_level(ipvs);
>  	if (atomic_read(&ipvs->dropentry))
>  		ip_vs_random_dropentry(ipvs);
> -	queue_delayed_work(system_long_wq, &ipvs->defense_work,
> +	queue_delayed_work(system_dfl_long_wq, &ipvs->defense_work,
>  			   DEFENSE_TIMER_PERIOD);
>  }
>  #endif
> @@ -290,7 +290,7 @@ #define DEFENSE_TIMER_PERIOD	1*HZ
>  	atomic_set(&ipvs->est_genid_done, genid);
>  
>  	if (repeat)
> -		queue_delayed_work(system_long_wq, &ipvs->est_reload_work,
> +		queue_delayed_work(system_dfl_long_wq, &ipvs->est_reload_work,
>  				   delay);
>  
>  unlock:
> @@ -5126,7 +5126,7 @@ do_ip_vs_get_ctl(struct sock *sk, int cmd, void __user *user, int *len)
>  		goto err;
>  
>  	/* Schedule defense work */
> -	queue_delayed_work(system_long_wq, &ipvs->defense_work,
> +	queue_delayed_work(system_dfl_long_wq, &ipvs->defense_work,
>  			   DEFENSE_TIMER_PERIOD);
>  
>  	return 0;
> diff --git a/net/netfilter/ipvs/ip_vs_est.c b/net/netfilter/ipvs/ip_vs_est.c
> index ab09f5182951..78964aa861e9 100644
> --- a/net/netfilter/ipvs/ip_vs_est.c
> +++ b/net/netfilter/ipvs/ip_vs_est.c
> @@ -243,7 +243,7 @@ #define pr_fmt(fmt) "IPVS: " fmt
>  	/* Bump the kthread configuration genid if stopping is requested */
>  	if (restart)
>  		atomic_inc(&ipvs->est_genid);
> -	queue_delayed_work(system_long_wq, &ipvs->est_reload_work, 0);
> +	queue_delayed_work(system_dfl_long_wq, &ipvs->est_reload_work, 0);
>  }
>  
>  /* Start kthread task with current configuration */

Regards

--
Julian Anastasov <[email protected]>