qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: Ladi Prosek <lprosek@redhat.com>, qemu-devel@nongnu.org
Cc: amit.shah@redhat.com, pagupta@redhat.com
Subject: Re: [Qemu-devel] [PATCH] rng: switch request queue to QSIMPLEQ
Date: Thu, 3 Mar 2016 14:34:36 +0100	[thread overview]
Message-ID: <56D83D6C.4010005@redhat.com> (raw)
In-Reply-To: <1457010971-24771-1-git-send-email-lprosek@redhat.com>



On 03/03/2016 14:16, Ladi Prosek wrote:
> QSIMPLEQ supports appending to tail in O(1) and is intrusive so
> it doesn't require extra memory allocations for the bookkeeping
> data.
> 
> Suggested-by: Paolo Bonzini <pbonzini@redhat.com>
> Signed-off-by: Ladi Prosek <lprosek@redhat.com>

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>

Thanks,

Paolo

> ---
>  backends/rng-egd.c    |  9 ++++-----
>  backends/rng-random.c |  6 +++---
>  backends/rng.c        | 17 ++++++++++-------
>  include/sysemu/rng.h  |  3 ++-
>  4 files changed, 19 insertions(+), 16 deletions(-)
> 
> diff --git a/backends/rng-egd.c b/backends/rng-egd.c
> index 30332ed..6e0ba22 100644
> --- a/backends/rng-egd.c
> +++ b/backends/rng-egd.c
> @@ -49,11 +49,10 @@ static void rng_egd_request_entropy(RngBackend *b, RngRequest *req)
>  static int rng_egd_chr_can_read(void *opaque)
>  {
>      RngEgd *s = RNG_EGD(opaque);
> -    GSList *i;
> +    RngRequest *req;
>      int size = 0;
>  
> -    for (i = s->parent.requests; i; i = i->next) {
> -        RngRequest *req = i->data;
> +    QSIMPLEQ_FOREACH(req, &s->parent.requests, next) {
>          size += req->size - req->offset;
>      }
>  
> @@ -65,8 +64,8 @@ static void rng_egd_chr_read(void *opaque, const uint8_t *buf, int size)
>      RngEgd *s = RNG_EGD(opaque);
>      size_t buf_offset = 0;
>  
> -    while (size > 0 && s->parent.requests) {
> -        RngRequest *req = s->parent.requests->data;
> +    while (size > 0 && !QSIMPLEQ_EMPTY(&s->parent.requests)) {
> +        RngRequest *req = QSIMPLEQ_FIRST(&s->parent.requests);
>          int len = MIN(size, req->size - req->offset);
>  
>          memcpy(req->data + req->offset, buf + buf_offset, len);
> diff --git a/backends/rng-random.c b/backends/rng-random.c
> index a6cb385..122e8d4 100644
> --- a/backends/rng-random.c
> +++ b/backends/rng-random.c
> @@ -35,8 +35,8 @@ static void entropy_available(void *opaque)
>  {
>      RndRandom *s = RNG_RANDOM(opaque);
>  
> -    while (s->parent.requests != NULL) {
> -        RngRequest *req = s->parent.requests->data;
> +    while (!QSIMPLEQ_EMPTY(&s->parent.requests)) {
> +        RngRequest *req = QSIMPLEQ_FIRST(&s->parent.requests);
>          ssize_t len;
>  
>          len = read(s->fd, req->data, req->size);
> @@ -58,7 +58,7 @@ static void rng_random_request_entropy(RngBackend *b, RngRequest *req)
>  {
>      RndRandom *s = RNG_RANDOM(b);
>  
> -    if (s->parent.requests == NULL) {
> +    if (QSIMPLEQ_EMPTY(&s->parent.requests)) {
>          /* If there are no pending requests yet, we need to
>           * install our fd handler. */
>          qemu_set_fd_handler(s->fd, entropy_available, NULL, s);
> diff --git a/backends/rng.c b/backends/rng.c
> index 277a41b..e57e2b4 100644
> --- a/backends/rng.c
> +++ b/backends/rng.c
> @@ -33,7 +33,7 @@ void rng_backend_request_entropy(RngBackend *s, size_t size,
>  
>          k->request_entropy(s, req);
>  
> -        s->requests = g_slist_append(s->requests, req);
> +        QSIMPLEQ_INSERT_TAIL(&s->requests, req, next);
>      }
>  }
>  
> @@ -83,24 +83,27 @@ static void rng_backend_free_request(RngRequest *req)
>  
>  static void rng_backend_free_requests(RngBackend *s)
>  {
> -    GSList *i;
> +    RngRequest *req, *next;
>  
> -    for (i = s->requests; i; i = i->next) {
> -        rng_backend_free_request(i->data);
> +    QSIMPLEQ_FOREACH_SAFE(req, &s->requests, next, next) {
> +        rng_backend_free_request(req);
>      }
>  
> -    g_slist_free(s->requests);
> -    s->requests = NULL;
> +    QSIMPLEQ_INIT(&s->requests);
>  }
>  
>  void rng_backend_finalize_request(RngBackend *s, RngRequest *req)
>  {
> -    s->requests = g_slist_remove(s->requests, req);
> +    QSIMPLEQ_REMOVE(&s->requests, req, RngRequest, next);
>      rng_backend_free_request(req);
>  }
>  
>  static void rng_backend_init(Object *obj)
>  {
> +    RngBackend *s = RNG_BACKEND(obj);
> +
> +    QSIMPLEQ_INIT(&s->requests);
> +
>      object_property_add_bool(obj, "opened",
>                               rng_backend_prop_get_opened,
>                               rng_backend_prop_set_opened,
> diff --git a/include/sysemu/rng.h b/include/sysemu/rng.h
> index a7ed580..4454722 100644
> --- a/include/sysemu/rng.h
> +++ b/include/sysemu/rng.h
> @@ -40,6 +40,7 @@ struct RngRequest
>      void *opaque;
>      size_t offset;
>      size_t size;
> +    QSIMPLEQ_ENTRY(RngRequest) next;
>  };
>  
>  struct RngBackendClass
> @@ -57,7 +58,7 @@ struct RngBackend
>  
>      /*< protected >*/
>      bool opened;
> -    GSList *requests;
> +    QSIMPLEQ_HEAD(requests, RngRequest) requests;
>  };
>  
>  
> 

  reply	other threads:[~2016-03-03 13:34 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-03-03 13:16 [Qemu-devel] [PATCH] rng: switch request queue to QSIMPLEQ Ladi Prosek
2016-03-03 13:34 ` Paolo Bonzini [this message]
2016-03-04  6:27 ` Amit Shah
2016-03-04  8:04   ` Ladi Prosek
2016-03-04  9:12     ` Paolo Bonzini
2016-03-04  9:19       ` Ladi Prosek
2016-03-04  9:27         ` Paolo Bonzini
2016-03-04  9:46           ` Amit Shah
2016-03-04  9:16     ` Amit Shah
2016-03-04  9:46 ` Amit Shah

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=56D83D6C.4010005@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=amit.shah@redhat.com \
    --cc=lprosek@redhat.com \
    --cc=pagupta@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /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).