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;
> };
>
>
>
next prev parent 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).