Commit c0a23bbc authored by Frederic Weisbecker's avatar Frederic Weisbecker Committed by Florian Westphal
Browse files

ipvs: Fix estimator kthreads preferred affinity



The estimator kthreads' affinity are defined by sysctl overwritten
preferences and applied through a plain call to the scheduler's affinity
API.

However since the introduction of managed kthreads preferred affinity,
such a practice shortcuts the kthreads core code which eventually
overwrites the target to the default unbound affinity.

Fix this with using the appropriate kthread's API.

Fixes: d1a89197 ("kthread: Default affine kthread to its preferred NUMA node")
Signed-off-by: default avatarFrederic Weisbecker <frederic@kernel.org>
Acked-by: default avatarJulian Anastasov <ja@ssi.bg>
Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
parent 30c1d25b
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -1163,6 +1163,14 @@ static inline const struct cpumask *sysctl_est_cpulist(struct netns_ipvs *ipvs)
		return housekeeping_cpumask(HK_TYPE_KTHREAD);
}

static inline const struct cpumask *sysctl_est_preferred_cpulist(struct netns_ipvs *ipvs)
{
	if (ipvs->est_cpulist_valid)
		return ipvs->sysctl_est_cpulist;
	else
		return NULL;
}

static inline int sysctl_est_nice(struct netns_ipvs *ipvs)
{
	return ipvs->sysctl_est_nice;
@@ -1270,6 +1278,11 @@ static inline const struct cpumask *sysctl_est_cpulist(struct netns_ipvs *ipvs)
	return housekeeping_cpumask(HK_TYPE_KTHREAD);
}

static inline const struct cpumask *sysctl_est_preferred_cpulist(struct netns_ipvs *ipvs)
{
	return NULL;
}

static inline int sysctl_est_nice(struct netns_ipvs *ipvs)
{
	return IPVS_EST_NICE;
+1 −0
Original line number Diff line number Diff line
@@ -893,6 +893,7 @@ int kthread_affine_preferred(struct task_struct *p, const struct cpumask *mask)

	return ret;
}
EXPORT_SYMBOL_GPL(kthread_affine_preferred);

/*
 * Re-affine kthreads according to their preferences
+2 −1
Original line number Diff line number Diff line
@@ -265,7 +265,8 @@ int ip_vs_est_kthread_start(struct netns_ipvs *ipvs,
	}

	set_user_nice(kd->task, sysctl_est_nice(ipvs));
	set_cpus_allowed_ptr(kd->task, sysctl_est_cpulist(ipvs));
	if (sysctl_est_preferred_cpulist(ipvs))
		kthread_affine_preferred(kd->task, sysctl_est_preferred_cpulist(ipvs));

	pr_info("starting estimator thread %d...\n", kd->id);
	wake_up_process(kd->task);