commit 823dfeff427d3574282f7d3c40280ba8acfe347a
Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
Date:   Mon Aug 7 19:47:46 2023 +0200

    Make starpu_parallel_worker_init return -ENODEV when there are not enough context slots
    
    (cherry picked from commit 31baaa6a6c49f71ba452dd3366ff02734ef654b7)

diff --git a/src/parallel_worker/starpu_parallel_worker_create.c b/src/parallel_worker/starpu_parallel_worker_create.c
index 5387614af9..db150b7a1b 100644
--- a/src/parallel_worker/starpu_parallel_worker_create.c
+++ b/src/parallel_worker/starpu_parallel_worker_create.c
@@ -317,8 +317,14 @@ int starpu_parallel_worker_print(struct starpu_parallel_worker_config *parallel_
 	return 0;
 }
 
-void _starpu_parallel_worker_create(struct _starpu_parallel_worker *parallel_worker)
+int _starpu_parallel_worker_create(struct _starpu_parallel_worker *parallel_worker)
 {
+	struct _starpu_machine_config *config = _starpu_get_machine_config();
+
+	if (config->topology.nsched_ctxs == STARPU_NMAX_SCHED_CTXS)
+		/* Too many contexts already :/ */
+		return 0;
+
 	if (parallel_worker->params->awake_workers)
 		parallel_worker->id = starpu_sched_ctx_create(parallel_worker->workerids, parallel_worker->ncores,
 							      "parallel_workers",
@@ -329,10 +335,10 @@ void _starpu_parallel_worker_create(struct _starpu_parallel_worker *parallel_wor
 
 	/* parallel_worker priority can be the lowest, so let's enforce it */
 	starpu_sched_ctx_set_priority(parallel_worker->workerids, parallel_worker->ncores, parallel_worker->id, 0);
-	return;
+	return 1;
 }
 
-void _starpu_parallel_worker_group_create(struct _starpu_parallel_worker_group *group)
+int _starpu_parallel_worker_group_create(struct _starpu_parallel_worker_group *group)
 {
 	struct _starpu_parallel_worker *c;
 	for (c = _starpu_parallel_worker_list_begin(group->parallel_workers) ;
@@ -341,12 +347,13 @@ void _starpu_parallel_worker_group_create(struct _starpu_parallel_worker_group *
 	{
 		if (c->ncores == 0)
 			continue;
-		_starpu_parallel_worker_create(c);
+		if (_starpu_parallel_worker_create(c) == 0)
+			return 0;
 		if (!c->params->awake_workers)
 			_starpu_parallel_worker_bind(c);
 	}
 
-	return;
+	return 1;
 }
 
 void _starpu_parallel_workers_set_nesting(struct starpu_parallel_worker_config *m)
@@ -543,10 +550,17 @@ int _starpu_parallel_worker_config(hwloc_obj_type_t parallel_worker_level, struc
 	for (g = _starpu_parallel_worker_group_list_begin(machine->groups) ;
 	     g != _starpu_parallel_worker_group_list_end(machine->groups) ;
 	     g = _starpu_parallel_worker_group_list_next(g))
-		_starpu_parallel_worker_group_create(g);
+		if (_starpu_parallel_worker_group_create(g) == 0)
+			return -ENODEV;
 
 	starpu_task_wait_for_all();
 
+	struct _starpu_machine_config *config = _starpu_get_machine_config();
+
+	if (config->topology.nsched_ctxs == STARPU_NMAX_SCHED_CTXS)
+		/* Too many contexts already :/ */
+		return -ENODEV;
+
 	/* Create containing context */
 	if (machine->params->sched_policy_struct != NULL)
 	{
diff --git a/src/parallel_worker/starpu_parallel_worker_create.h b/src/parallel_worker/starpu_parallel_worker_create.h
index b024ad8681..c1ea3f095a 100644
--- a/src/parallel_worker/starpu_parallel_worker_create.h
+++ b/src/parallel_worker/starpu_parallel_worker_create.h
@@ -93,14 +93,14 @@ int _starpu_parallel_worker_analyze_parameters(struct _starpu_parallel_worker_pa
 
 /** Parallel_Worker helper functions */
 void _starpu_parallel_worker_init(struct _starpu_parallel_worker *parallel_worker, struct _starpu_parallel_worker_group *father);
-void _starpu_parallel_worker_create(struct _starpu_parallel_worker *parallel_worker);
+int _starpu_parallel_worker_create(struct _starpu_parallel_worker *parallel_worker);
 
 int _starpu_parallel_worker_bind(struct _starpu_parallel_worker *parallel_worker);
 int _starpu_parallel_worker_remove(struct _starpu_parallel_worker_list *parallel_worker_list, struct _starpu_parallel_worker *parallel_worker);
 
 /** Parallel_Worker group helper function */
 void _starpu_parallel_worker_group_init(struct _starpu_parallel_worker_group *group, struct starpu_parallel_worker_config *father);
-void _starpu_parallel_worker_group_create(struct _starpu_parallel_worker_group *group);
+int _starpu_parallel_worker_group_create(struct _starpu_parallel_worker_group *group);
 int _starpu_parallel_worker_group_remove(struct _starpu_parallel_worker_group_list *group_list, struct _starpu_parallel_worker_group *group);
 
 /** Binding helpers */
