From: Juergen Gross Date: Fri, 20 May 2022 10:19:06 +0000 (+0200) Subject: xen/cpupool: limit number of cpupools X-Git-Tag: archive/raspbian/4.17.0-1+rpi1^2~33^2~632 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=488a15a669e5b83267590ed8dad2428a5216ee87;p=xen.git xen/cpupool: limit number of cpupools Today the number of cpupools in a system is unlimited. This can lead to multiple problems (e.g. duplicate cpupool-id or scalability issues). Limit the number of cpupools to twice the number of maximum possible cpus, allowing to have one cpupool per physical cpu plus some spare cpupools for special means (there are already existing use cases for such spare cpupools). Suggested-by: Andrew Cooper Signed-off-by: Juergen Gross Acked-by: Andrew Cooper --- diff --git a/xen/common/sched/cpupool.c b/xen/common/sched/cpupool.c index f1aa2db5f4..a20e3a5fcb 100644 --- a/xen/common/sched/cpupool.c +++ b/xen/common/sched/cpupool.c @@ -30,6 +30,7 @@ struct cpupool *cpupool0; /* Initial cpupool with Dom0 */ cpumask_t cpupool_free_cpus; /* cpus not in any cpupool */ static LIST_HEAD(cpupool_list); /* linked list, sorted by poolid */ +static unsigned int n_cpupools; static int cpupool_moving_cpu = -1; static struct cpupool *cpupool_cpu_moving = NULL; @@ -276,6 +277,14 @@ static struct cpupool *cpupool_create(unsigned int poolid, spin_lock(&cpupool_lock); + /* Don't allow too many cpupools. */ + if ( n_cpupools >= 2 * nr_cpu_ids ) + { + ret = -ENOSPC; + goto unlock; + } + n_cpupools++; + if ( poolid != CPUPOOLID_NONE ) { q = __cpupool_find_by_id(poolid, false); @@ -332,7 +341,9 @@ static struct cpupool *cpupool_create(unsigned int poolid, err: list_del(&c->list); + n_cpupools--; + unlock: spin_unlock(&cpupool_lock); free_cpupool_struct(c); @@ -356,6 +367,7 @@ static int cpupool_destroy(struct cpupool *c) return -EBUSY; } + n_cpupools--; list_del(&c->list); spin_unlock(&cpupool_lock);