Commit 144361c1 authored by Julian Anastasov's avatar Julian Anastasov Committed by Pablo Neira Ayuso
Browse files

ipvs: run_estimation should control the kthread tasks



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

Signed-off-by: default avatarJulian Anastasov <ja@ssi.bg>
Cc: yunhong-cgl jiang <xintian1976@gmail.com>
Cc: "dust.li" <dust.li@linux.alibaba.com>
Reviewed-by: default avatarJiri Wiesner <jwiesner@suse.de>
Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
parent f0be83d5
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -324,8 +324,8 @@ run_estimation - BOOLEAN
	0 - disabled
	not 0 - enabled (default)

	If disabled, the estimation will be stop, and you can't see
	any update on speed estimation data.
	If disabled, the estimation will be suspended and kthread tasks
	stopped.

	You can always re-enable estimation by setting this value to 1.
	But be careful, the first estimation after re-enable is not
+4 −2
Original line number Diff line number Diff line
@@ -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)
{
#ifdef CONFIG_SYSCTL
	ipvs->est_stopped = ipvs->est_cpulist_valid &&
			    cpumask_empty(sysctl_est_cpulist(ipvs));
	/* Stop tasks while cpulist is empty or if disabled with flag */
	ipvs->est_stopped = !sysctl_run_estimation(ipvs) ||
			    (ipvs->est_cpulist_valid &&
			     cpumask_empty(sysctl_est_cpulist(ipvs)));
#endif
}

+28 −1
Original line number Diff line number Diff line
@@ -2056,6 +2056,32 @@ static int ipvs_proc_est_nice(struct ctl_table *table, int write,
	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/)
 *	Do not change order or insert new entries without
@@ -2230,7 +2256,7 @@ static struct ctl_table vs_vars[] = {
		.procname	= "run_estimation",
		.maxlen		= sizeof(int),
		.mode		= 0644,
		.proc_handler	= proc_dointvec,
		.proc_handler	= ipvs_proc_run_estimation,
	},
	{
		.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_ignore_tunneled;
	ipvs->sysctl_run_estimation = 1;
	tbl[idx].extra2 = ipvs;
	tbl[idx++].data = &ipvs->sysctl_run_estimation;

	ipvs->est_cpulist_valid = 0;
+1 −1
Original line number Diff line number Diff line
@@ -212,7 +212,7 @@ static int ip_vs_estimation_kthread(void *data)
				kd->est_timer = now;
		}

		if (sysctl_run_estimation(ipvs) && kd->tick_len[row])
		if (kd->tick_len[row])
			ip_vs_tick_estimation(kd, row);

		row++;