Skip to contentSkip to conversation

prio-wake: enable using more than 95 threads

PATCH In review Darren Hart 2 participants 2 messages Aug 24, 2009 – Aug 25, 2009

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 prio-wake: enable using more than 95 threads

prio-wake: enable using more than 95 threads

prio-wake will currently spew pthread errors on systems with more than 95 CPUS, or if an -n value > 95 is specified on the command line. To avoid this, spread threads out equally over the priorities by calculated the number of threads per priority.

Tested with all pathological numbers (i.e. mod=0 mod=1, etc) of threads. Ran 10000 times in parallel. Confirmed failure continues to exist without requeue PI (as it should) and success is seen with requeue PI (as it should be).

---
 func/prio-wake/prio-wake.c |   24 +++++++++++++++++++-----
 1 file changed, 19 insertions(+), 5 deletions(-)
func/prio-wake/prio-wake.c +19 -5
Index: realtime/func/prio-wake/prio-wake.c
===================================================================
@@ -54,6 +54,8 @@
 #include <errno.h>
 #include <sys/syscall.h>
 #include <librttest.h>
+#include <libstats.h>
+
 volatile int running_threads = 0;
 static int rt_threads = 0;
 static int locked_broadcast = 1;
@@ -164,8 +166,10 @@ void *worker_thread(void* arg)
 
 int main(int argc, char* argv[])
 {
-	int pri_boost;
+	int threads_per_prio;
         int numcpus;
+	int numprios;
+	int prio;
 	int i;
 	setup();
 
@@ -184,19 +188,29 @@ int main(int argc, char* argv[])
 	printf("Calling pthread_cond_broadcast() with mutex: %s\n\n",
 	       locked_broadcast ? "LOCKED" : "UNLOCKED");
 
-	pri_boost = 3;
-
 	beginrun = rt_gettime();
 
 	init_pi_mutex(&mutex);
 
+	/* calculate the number of threads per priority */
+	/* we get num numprios -1 for the workers, leaving one for the master */
+	numprios = sched_get_priority_max(SCHED_FIFO) -
+		   sched_get_priority_min(SCHED_FIFO);
+
+	threads_per_prio = rt_threads /	numprios;
+	if (rt_threads % numprios)
+		threads_per_prio++;
+
 	/* start the worker threads */
+	prio = sched_get_priority_min(SCHED_FIFO);
 	for (i = rt_threads; i > 0; i--) {
-		create_fifo_thread(worker_thread, (void*)(intptr_t)i, sched_get_priority_min(SCHED_FIFO) + pri_boost++);
+		if ((i != rt_threads && (i % threads_per_prio) == 0))
+			prio++;
+		create_fifo_thread(worker_thread, (void*)(intptr_t)i, prio);
 	}
 
 	/* start the master thread */
-	create_fifo_thread(master_thread, (void*)(intptr_t)i, sched_get_priority_min(SCHED_FIFO) + pri_boost);
+	create_fifo_thread(master_thread, (void*)(intptr_t)i, ++prio);
 
 	/* wait for threads to complete */
 	join_threads();
Signature · 13 lines
Darren Hart
IBM Linux Technology Center
Real-Time Linux Team

------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list
#1 lore raw
Quoted 7 lines · Darren Hart

prio-wake: enable using more than 95 threads

prio-wake will currently spew pthread errors on systems with more than 95 CPUS, or if an -n value > 95 is specified on the command line. To avoid this, spread threads out equally over the priorities by calculated the number of threads per priority.

Quoted 6 lines

Tested with all pathological numbers (i.e. mod=0 mod=1, etc) of threads. Ran 10000 times in parallel. Confirmed failure continues to exist without requeue PI (as it should) and success is seen with requeue PI (as it should be).

All Patches are in.

Regards--
Subrata

Quoted 57 lines
---
 func/prio-wake/prio-wake.c |   24 +++++++++++++++++++-----
 1 file changed, 19 insertions(+), 5 deletions(-)

Index: realtime/func/prio-wake/prio-wake.c
===================================================================

func/prio-wake/prio-wake.c +16 -4
@@ -54,6 +54,8 @@
 #include <errno.h>
 #include <sys/syscall.h>
 #include <librttest.h>
+#include <libstats.h>
+
 volatile int running_threads = 0;
 static int rt_threads = 0;
 static int locked_broadcast = 1;
@@ -164,8 +166,10 @@ void *worker_thread(void* arg)
 
 int main(int argc, char* argv[])
 {
-	int pri_boost;
+	int threads_per_prio;
         int numcpus;
+	int numprios;
+	int prio;
 	int i;
 	setup();
 
@@ -184,19 +188,29 @@ int main(int argc, char* argv[])
 	printf("Calling pthread_cond_broadcast() with mutex: %s\n\n",
 	       locked_broadcast ? "LOCKED" : "UNLOCKED");
 
-	pri_boost = 3;
-
 	beginrun = rt_gettime();
 
 	init_pi_mutex(&mutex);
 
+	/* calculate the number of threads per priority */
+	/* we get num numprios -1 for the workers, leaving one for the master */
+	numprios = sched_get_priority_max(SCHED_FIFO) -
+		   sched_get_priority_min(SCHED_FIFO);
+
+	threads_per_prio = rt_threads /	numprios;
+	if (rt_threads % numprios)
+		threads_per_prio++;
+
 	/* start the worker threads */
+	prio = sched_get_priority_min(SCHED_FIFO);
 	for (i = rt_threads; i > 0; i--) {
-		create_fifo_thread(worker_thread, (void*)(intptr_t)i, sched_get_priority_min(SCHED_FIFO) + pri_boost++);
+		if ((i != rt_threads && (i % threads_per_prio) == 0))

func/prio-wake/prio-wake.c int main(int argc, char* argv[]) · line 216

Quoted 10 lines
func/prio-wake/prio-wake.c +3 -1
+			prio++;
+		create_fifo_thread(worker_thread, (void*)(intptr_t)i, prio);
 	}
 
 	/* start the master thread */
-	create_fifo_thread(master_thread, (void*)(intptr_t)i, sched_get_priority_min(SCHED_FIFO) + pri_boost);
+	create_fifo_thread(master_thread, (void*)(intptr_t)i, ++prio);
 
 	/* wait for threads to complete */
 	join_threads();

------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day trial. Simplify your report design, integration and deployment - and focus on what you do best, core application coding. Discover what's new with Crystal Reports now. http://p.sf.net/sfu/bobj-july
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list