qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Venkateswararao Jujjuri (JV)" <jvrao@linux.vnet.ibm.com>
To: Stefan Hajnoczi <stefanha@gmail.com>
Cc: mohan@in.ibm.com, qemu-devel@nongnu.org, sripathik@in.ibm.com,
	aneesh.kumar@linux.vnet.ibm.com, arun@linux.vnet.ibm.com
Subject: Re: [Qemu-devel] qemu_cond_signal() taking a long time to complete.
Date: Mon, 04 Oct 2010 20:58:31 -0700	[thread overview]
Message-ID: <4CAAA267.5040506@linux.vnet.ibm.com> (raw)
In-Reply-To: <AANLkTimH7wTwGzMNZhwzD=afa5neqeLip2skEVTkMEeg@mail.gmail.com>

On 10/4/2010 8:49 AM, Stefan Hajnoczi wrote:
> On Mon, Oct 4, 2010 at 4:37 PM, Anthony Liguori<anthony@codemonkey.ws>  wrote:
>> On 10/04/2010 05:40 AM, Arun R Bharadwaj wrote:
>>>
>>> Hi,
>>>
>>> I am working on introducing threading model into Qemu. This introduces
>>> the Threadlets infrastructure which allows subsystems to offload possibly
>>> blocking work to a queue to be processed by a pool of threads
>>> asynchrnonously.
>>> Threadlets are useful when there are operations that can be performed
>>> outside the context of the VCPU/IO threads inorder to free these latter
>>> to service any other guest requests. As of now we have converted a few
>>> v9fs calls like v9fs_read, v9fs_write etc to this model to test the
>>> working nature of this model.
>>>
>>> I observed that performance is degrading in the threading model for the
>>> following reason:
>>>
>>> Taking the example of v9fs_read call: We submit the blocking work in
>>> v9fs_read to a queue and do a qemu_cond_signal(). the work will be picked
>>> up by a worker thread which is waiting on the condition variable to go
>>> true. I measured the time taken to execute the v9fs_read call; in the
>>> case without the threading model, it takes around 15microseconds to
>>> complete, while in the threading model, it takes around 30microsends
>>> to complete. Most of this extra time (around 22microsends) is spent in
>>> completing the qemu_cond_signal() call. I suspect this is the reason why
>>> I am seeing performance hit with the threading model, because this
>>> time is much more than the time needed to complete the entire
>>> v9fs_read call in the non threading model case.
>>>
>>> I need advice on how to proceed from this situation. Pasting relevant
>>> code snippets below.
>>>
>>> thanks
>>> arun.
>>> ---
>>>
>>> /* Code to sumbit work to the queue */
>>> void submit_threadlet_to_queue(ThreadletQueue *queue, ThreadletWork
>>> *work)
>>> {
>>>      qemu_mutex_lock(&(queue->lock));
>>>      if (queue->idle_threads == 0&&    queue->cur_threads<
>>> queue->max_threads) {
>>>          spawn_threadlet(queue);
>>>      }
>>>      QTAILQ_INSERT_TAIL(&(queue->request_list), work, node);
>>>      qemu_cond_signal(&(queue->cond));
>>>      qemu_mutex_unlock(&(queue->lock));
>>> }
>>>
>>
>> Try moving qemu_cond_signal past qemu_mutex_unlock().
>
> There are race conditions here:
>
> 1. When a new threadlet is started because there are no idle threads,
> qemu_cond_signal() may fire a blank because the threadlet isn't inside
> qemu_cond_timedwait() yet.  The result, the work item is deadlocked
> until another thread grabs more work off the queue.  If I'm reading

Since it is timedwait, it is either the time expiry or more work is added to the 
queue.

- JV


> the code correctly this bug is currently present!
> 2. Moving qemu_cond_signal() outside queue->lock is dangerous for the
> same reason: you need to be careful not to qemu_cond_signal() when the
> thread isn't inside qemu_cond_timedwait().
>
> Stefan
>
> Stefan

  reply	other threads:[~2010-10-05  3:58 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-10-04 10:40 [Qemu-devel] qemu_cond_signal() taking a long time to complete Arun R Bharadwaj
2010-10-04 13:58 ` Stefan Hajnoczi
2010-10-04 15:37 ` Anthony Liguori
2010-10-04 15:49   ` Stefan Hajnoczi
2010-10-05  3:58     ` Venkateswararao Jujjuri (JV) [this message]
2010-10-05  4:26 ` Venkateswararao Jujjuri (JV)

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4CAAA267.5040506@linux.vnet.ibm.com \
    --to=jvrao@linux.vnet.ibm.com \
    --cc=aneesh.kumar@linux.vnet.ibm.com \
    --cc=arun@linux.vnet.ibm.com \
    --cc=mohan@in.ibm.com \
    --cc=qemu-devel@nongnu.org \
    --cc=sripathik@in.ibm.com \
    --cc=stefanha@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).