From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54359) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1abTOw-0000vc-Ah for qemu-devel@nongnu.org; Thu, 03 Mar 2016 08:34:47 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1abTOr-000368-6Z for qemu-devel@nongnu.org; Thu, 03 Mar 2016 08:34:46 -0500 Received: from mx1.redhat.com ([209.132.183.28]:51372) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1abTOq-000363-Uf for qemu-devel@nongnu.org; Thu, 03 Mar 2016 08:34:41 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 5E283C00F6FD for ; Thu, 3 Mar 2016 13:34:40 +0000 (UTC) References: <1457010971-24771-1-git-send-email-lprosek@redhat.com> From: Paolo Bonzini Message-ID: <56D83D6C.4010005@redhat.com> Date: Thu, 3 Mar 2016 14:34:36 +0100 MIME-Version: 1.0 In-Reply-To: <1457010971-24771-1-git-send-email-lprosek@redhat.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH] rng: switch request queue to QSIMPLEQ List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Ladi Prosek , qemu-devel@nongnu.org Cc: amit.shah@redhat.com, pagupta@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 > Signed-off-by: Ladi Prosek Reviewed-by: Paolo Bonzini 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; > }; > > >