qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Anthony Liguori <anthony@codemonkey.ws>
To: arun@linux.vnet.ibm.com
Cc: mohan@in.ibm.com, sripathik@in.ibm.com, jvrao@linux.vnet.ibm.com,
	qemu-devel@nongnu.org, aneesh.kumar@linux.vnet.ibm.com
Subject: Re: [Qemu-devel] qemu_cond_signal() taking a long time to complete.
Date: Mon, 04 Oct 2010 10:37:14 -0500	[thread overview]
Message-ID: <4CA9F4AA.7020007@codemonkey.ws> (raw)
In-Reply-To: <20101004104030.GA22130@linux.vnet.ibm.com>

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().

Regards,

Anthony Liguori

> /* Worker thread code */
> static void *threadlet_worker(void *data)
> {
>      ThreadletQueue *queue = data;
>
>      while (1) {
>          ThreadletWork *work;
>          int ret = 0;
>          qemu_mutex_lock(&(queue->lock));
>
>          while (QTAILQ_EMPTY(&(queue->request_list))&&
>                 (ret != ETIMEDOUT)) {
>              ret = qemu_cond_timedwait(&(queue->cond),
>                                           &(queue->lock), 10*100000);
>          }
>
>          assert(queue->idle_threads != 0);
>          if (QTAILQ_EMPTY(&(queue->request_list))) {
>              if (queue->cur_threads>  queue->min_threads) {
>                  /* We retain the minimum number of threads */
>                  break;
>              }
>          } else {
>              work = QTAILQ_FIRST(&(queue->request_list));
>              QTAILQ_REMOVE(&(queue->request_list), work, node);
>
>              queue->idle_threads--;
>              qemu_mutex_unlock(&(queue->lock));
>
>              /* execute the work function */
>              work->func(work);
>
>              qemu_mutex_lock(&(queue->lock));
>              queue->idle_threads++;
>          }
>          qemu_mutex_unlock(&(queue->lock));
>      }
>
>      queue->idle_threads--;
>      queue->cur_threads--;
>
>      return NULL;
> }
>
>    

  parent reply	other threads:[~2010-10-04 15:37 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 [this message]
2010-10-04 15:49   ` Stefan Hajnoczi
2010-10-05  3:58     ` Venkateswararao Jujjuri (JV)
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=4CA9F4AA.7020007@codemonkey.ws \
    --to=anthony@codemonkey.ws \
    --cc=aneesh.kumar@linux.vnet.ibm.com \
    --cc=arun@linux.vnet.ibm.com \
    --cc=jvrao@linux.vnet.ibm.com \
    --cc=mohan@in.ibm.com \
    --cc=qemu-devel@nongnu.org \
    --cc=sripathik@in.ibm.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).