ipvs: run_estimation should control the kthread tasks

Change the run_estimation flag to start/stop the kthread tasks.

Signed-off-by: Julian Anastasov <ja@ssi.bg>
Cc: yunhong-cgl jiang <xintian1976@gmail.com>
Cc: "dust.li" <dust.li@linux.alibaba.com>
Reviewed-by: Jiri Wiesner <jwiesner@suse.de>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
This commit is contained in:
Julian Anastasov 2022-11-22 18:46:04 +02:00 committed by Pablo Neira Ayuso
parent f0be83d542
commit 144361c194
4 changed files with 35 additions and 6 deletions

View File

@ -324,8 +324,8 @@ run_estimation - BOOLEAN
0 - disabled 0 - disabled
not 0 - enabled (default) not 0 - enabled (default)
If disabled, the estimation will be stop, and you can't see If disabled, the estimation will be suspended and kthread tasks
any update on speed estimation data. stopped.
You can always re-enable estimation by setting this value to 1. You can always re-enable estimation by setting this value to 1.
But be careful, the first estimation after re-enable is not But be careful, the first estimation after re-enable is not

View File

@ -1605,8 +1605,10 @@ void ip_vs_est_kthread_stop(struct ip_vs_est_kt_data *kd);
static inline void ip_vs_est_stopped_recalc(struct netns_ipvs *ipvs) static inline void ip_vs_est_stopped_recalc(struct netns_ipvs *ipvs)
{ {
#ifdef CONFIG_SYSCTL #ifdef CONFIG_SYSCTL
ipvs->est_stopped = ipvs->est_cpulist_valid && /* Stop tasks while cpulist is empty or if disabled with flag */
cpumask_empty(sysctl_est_cpulist(ipvs)); ipvs->est_stopped = !sysctl_run_estimation(ipvs) ||
(ipvs->est_cpulist_valid &&
cpumask_empty(sysctl_est_cpulist(ipvs)));
#endif #endif
} }

View File

@ -2056,6 +2056,32 @@ static int ipvs_proc_est_nice(struct ctl_table *table, int write,
return ret; return ret;
} }
static int ipvs_proc_run_estimation(struct ctl_table *table, int write,
void *buffer, size_t *lenp, loff_t *ppos)
{
struct netns_ipvs *ipvs = table->extra2;
int *valp = table->data;
int val = *valp;
int ret;
struct ctl_table tmp_table = {
.data = &val,
.maxlen = sizeof(int),
.mode = table->mode,
};
ret = proc_dointvec(&tmp_table, write, buffer, lenp, ppos);
if (write && ret >= 0) {
mutex_lock(&ipvs->est_mutex);
if (*valp != val) {
*valp = val;
ip_vs_est_reload_start(ipvs);
}
mutex_unlock(&ipvs->est_mutex);
}
return ret;
}
/* /*
* IPVS sysctl table (under the /proc/sys/net/ipv4/vs/) * IPVS sysctl table (under the /proc/sys/net/ipv4/vs/)
* Do not change order or insert new entries without * Do not change order or insert new entries without
@ -2230,7 +2256,7 @@ static struct ctl_table vs_vars[] = {
.procname = "run_estimation", .procname = "run_estimation",
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = proc_dointvec, .proc_handler = ipvs_proc_run_estimation,
}, },
{ {
.procname = "est_cpulist", .procname = "est_cpulist",
@ -4323,6 +4349,7 @@ static int __net_init ip_vs_control_net_init_sysctl(struct netns_ipvs *ipvs)
tbl[idx++].data = &ipvs->sysctl_schedule_icmp; tbl[idx++].data = &ipvs->sysctl_schedule_icmp;
tbl[idx++].data = &ipvs->sysctl_ignore_tunneled; tbl[idx++].data = &ipvs->sysctl_ignore_tunneled;
ipvs->sysctl_run_estimation = 1; ipvs->sysctl_run_estimation = 1;
tbl[idx].extra2 = ipvs;
tbl[idx++].data = &ipvs->sysctl_run_estimation; tbl[idx++].data = &ipvs->sysctl_run_estimation;
ipvs->est_cpulist_valid = 0; ipvs->est_cpulist_valid = 0;

View File

@ -212,7 +212,7 @@ static int ip_vs_estimation_kthread(void *data)
kd->est_timer = now; kd->est_timer = now;
} }
if (sysctl_run_estimation(ipvs) && kd->tick_len[row]) if (kd->tick_len[row])
ip_vs_tick_estimation(kd, row); ip_vs_tick_estimation(kd, row);
row++; row++;