From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=42052 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OOuDE-0001iP-8t for qemu-devel@nongnu.org; Wed, 16 Jun 2010 11:07:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OOuD3-0002FI-SG for qemu-devel@nongnu.org; Wed, 16 Jun 2010 11:07:32 -0400 Received: from mail2.shareable.org ([80.68.89.115]:56325) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OOuD3-0002Ec-OB for qemu-devel@nongnu.org; Wed, 16 Jun 2010 11:07:21 -0400 Date: Wed, 16 Jun 2010 16:07:14 +0100 From: Jamie Lokier Subject: Re: [Qemu-devel] Re: [PATCH V4 2/3] qemu: Generic task offloading framework: threadlets Message-ID: <20100616150714.GA24172@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> <20100616145858.GA19642@shareable.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100616145858.GA19642@shareable.org> 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 Jamie Lokier wrote: > 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. Sorry, thinko. It does matter when queue->exit, precisely because the queue is empty :-) Even cond_broadcast after queue->exit is set isn't enough to remove the need for the timed wait hack. Putting the whole condition inside the mutex->cond_wait region, not just empty queue test, will remove the need for timed wait. Broadcast is still needed, or alternatively a cond_signal from each exiting thread will allow them to wake and close without a thundering herd. -- Jamie