qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] rng: switch request queue to QSIMPLEQ


From: Paolo Bonzini
Subject: Re: [Qemu-devel] [PATCH] rng: switch request queue to QSIMPLEQ
Date: Thu, 3 Mar 2016 14:34:36 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0


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 <address@hidden>
> Signed-off-by: Ladi Prosek <address@hidden>

Reviewed-by: Paolo Bonzini <address@hidden>

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 via email to

[Prev in Thread] Current Thread [Next in Thread]