Date: Thu, 3 May 2012 09:17:31 +0000 (UTC) From: David Xu <davidxu@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r234947 - head/lib/libthr/thread Message-ID: <201205030917.q439HVln029728@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: davidxu Date: Thu May 3 09:17:31 2012 New Revision: 234947 URL: http://svn.freebsd.org/changeset/base/234947 Log: MFp4: Enqueue thread in LIFO, this can cause starvation, but it gives better performance. Use _thr_queuefifo to control the frequency of FIFO vs LIFO, you can use environment string LIBPTHREAD_QUEUE_FIFO to configure the variable. Modified: head/lib/libthr/thread/thr_init.c head/lib/libthr/thread/thr_private.h head/lib/libthr/thread/thr_sleepq.c Modified: head/lib/libthr/thread/thr_init.c ============================================================================== --- head/lib/libthr/thread/thr_init.c Thu May 3 08:56:43 2012 (r234946) +++ head/lib/libthr/thread/thr_init.c Thu May 3 09:17:31 2012 (r234947) @@ -112,6 +112,7 @@ size_t _thr_stack_initial = THR_STACK_I int _thr_page_size; int _thr_spinloops; int _thr_yieldloops; +int _thr_queuefifo = 4; int _gc_count; struct umutex _mutex_static_lock = DEFAULT_UMUTEX; struct umutex _cond_static_lock = DEFAULT_UMUTEX; @@ -470,6 +471,9 @@ init_private(void) env = getenv("LIBPTHREAD_YIELDLOOPS"); if (env) _thr_yieldloops = atoi(env); + env = getenv("LIBPTHREAD_QUEUE_FIFO"); + if (env) + _thr_queuefifo = atoi(env); TAILQ_INIT(&_thr_atfork_list); } init_once = 1; Modified: head/lib/libthr/thread/thr_private.h ============================================================================== --- head/lib/libthr/thread/thr_private.h Thu May 3 08:56:43 2012 (r234946) +++ head/lib/libthr/thread/thr_private.h Thu May 3 09:17:31 2012 (r234947) @@ -710,6 +710,7 @@ extern size_t _thr_stack_initial __hidde extern int _thr_page_size __hidden; extern int _thr_spinloops __hidden; extern int _thr_yieldloops __hidden; +extern int _thr_queuefifo __hidden; /* Garbage thread count. */ extern int _gc_count __hidden; Modified: head/lib/libthr/thread/thr_sleepq.c ============================================================================== --- head/lib/libthr/thread/thr_sleepq.c Thu May 3 08:56:43 2012 (r234946) +++ head/lib/libthr/thread/thr_sleepq.c Thu May 3 09:17:31 2012 (r234947) @@ -39,6 +39,7 @@ struct sleepqueue_chain { struct umutex sc_lock; + int sc_enqcnt; LIST_HEAD(, sleepqueue) sc_queues; int sc_type; }; @@ -124,7 +125,10 @@ _sleepq_add(void *wchan, struct pthread } td->sleepqueue = NULL; td->wchan = wchan; - TAILQ_INSERT_TAIL(&sq->sq_blocked, td, wle); + if (((++sc->sc_enqcnt << _thr_queuefifo) & 0xff) != 0) + TAILQ_INSERT_HEAD(&sq->sq_blocked, td, wle); + else + TAILQ_INSERT_TAIL(&sq->sq_blocked, td, wle); } int
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201205030917.q439HVln029728>