[PATCH] xen/cpupool: limit number of cpupools

Juergen Gross posted 1 patch 1 year, 11 months ago
Test gitlab-ci failed
Patches applied successfully (tree, apply log)
git fetch https://gitlab.com/xen-project/patchew/xen tags/patchew/20220518144410.6806-1-jgross@suse.com
xen/common/sched/cpupool.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
[PATCH] xen/cpupool: limit number of cpupools
Posted by Juergen Gross 1 year, 11 months ago
Today the number of cpupools in a system is unlimited. This can lead to
multiple problems (e.g. duplicate cpupool-id).

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).

Signed-off-by: Juergen Gross <jgross@suse.com>
---
 xen/common/sched/cpupool.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/xen/common/sched/cpupool.c b/xen/common/sched/cpupool.c
index f6e3d97e52..7cc25ee8b4 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);
-- 
2.35.3
Re: [PATCH] xen/cpupool: limit number of cpupools
Posted by Andrew Cooper 1 year, 11 months ago
On 18/05/2022 15:44, Juergen Gross wrote:
> Today the number of cpupools in a system is unlimited. This can lead to
> multiple problems (e.g. duplicate cpupool-id).

Not to mention scalability issues.  Search by ID is O(n).

>
> 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).

Probably one of Suggested-by/Reported-by/Requested-by :)  Dealers choice.

> Signed-off-by: Juergen Gross <jgross@suse.com>

Otherwise, LGTM.

Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>