From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=50186 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OOu58-0008LB-D4 for qemu-devel@nongnu.org; Wed, 16 Jun 2010 10:59:11 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OOu53-0007xM-UC for qemu-devel@nongnu.org; Wed, 16 Jun 2010 10:59:10 -0400 Received: from mail2.shareable.org ([80.68.89.115]:43043) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OOu53-0007x8-QF for qemu-devel@nongnu.org; Wed, 16 Jun 2010 10:59:05 -0400 Date: Wed, 16 Jun 2010 15:58:58 +0100 From: Jamie Lokier Subject: Re: [Qemu-devel] Re: [PATCH V4 2/3] qemu: Generic task offloading framework: threadlets Message-ID: <20100616145858.GA19642@shareable.org> References: <20100616115404.10988.62371.stgit@localhost.localdomain> <20100616115656.10988.96529.stgit@localhost.localdomain> <4C18C4C8.8090901@redhat.com> <20100616142236.GA20052@shareable.org> <4C18DFD7.1090102@redhat.com> <4C18E1E8.3030606@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <4C18E1E8.3030606@linux.vnet.ibm.com> List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Anthony Liguori Cc: Gautham R Shenoy , Qemu-development List , "Aneesh Kumar K.V" , Corentin Chary , Paolo Bonzini , Avi Kivity Anthony Liguori wrote: > On 06/16/2010 09:29 AM, Paolo Bonzini wrote: > >On 06/16/2010 04:22 PM, Jamie Lokier wrote: > >>Paolo Bonzini wrote: > >>>These should be (at least for now) block-obj-$(CONFIG_POSIX). > >>> > >>>>+ while (QTAILQ_EMPTY(&(queue->request_list))&& > >>>>+ (ret != ETIMEDOUT)) { > >>>>+ ret = qemu_cond_timedwait(&(queue->cond), > >>>>+ &(queue->lock), 10*100000); > >>>>+ } > >>> > >>>Using qemu_cond_timedwait is a hack for not properly broadcasting the > >>>condvar in flush_threadlet_queue. > >> > >>Are you sure? It looks like it also expires idle threads after a > >>fixed amount of idle time. > > > >Unnecessary idle threads are immediately expired as soon as the > >threadlet exits if ncecessary, since here > > If a threadlet is waiting to consume more work, unless we do a > pthread_cancel (I dislike cancellation) it will keep waiting until it > gets more work (which would mean it's not actually idle)... There's some mild abuse of the mutex/condvar going on. As (queue->exit || queue->idle_threads > queue->min_threads) is a condition for breaking out of the loop, that condition ought to be checked in the mutex->cond_wait region, but it isn't. It doesn't matter here because the queue is empty when queue->exit, and the idle > min_threads condition can't become true. > >The min/max_threads parameters of the queue are currently immutable, > >so it can never happen that a thread has to be expired while it's > >waiting. It may well become true in the future, in which case the > >condvar will have to be broadcast when min_threads changes. Broadcasting when min_threads decreases wouldn't be enough, because min_threads isn't checked inside the mutex->cond_wait region. -- Jamie