[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;
> };
>
>
>
Re: [Qemu-devel] [PATCH] rng: switch request queue to QSIMPLEQ, Amit Shah, 2016/03/04