From patchwork Tue Mar 8 10:54:12 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amit Shah X-Patchwork-Id: 594015 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id D1432140BB4 for ; Tue, 8 Mar 2016 21:55:10 +1100 (AEDT) Received: from localhost ([::1]:33695 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1adFIC-00085A-UB for incoming@patchwork.ozlabs.org; Tue, 08 Mar 2016 05:55:08 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45979) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1adFHf-00075S-2Z for qemu-devel@nongnu.org; Tue, 08 Mar 2016 05:54:38 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1adFHd-00035K-Mx for qemu-devel@nongnu.org; Tue, 08 Mar 2016 05:54:34 -0500 Received: from mx1.redhat.com ([209.132.183.28]:56101) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1adFHd-00035E-Ey for qemu-devel@nongnu.org; Tue, 08 Mar 2016 05:54:33 -0500 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 06D0F804E2; Tue, 8 Mar 2016 10:54:33 +0000 (UTC) Received: from localhost (ovpn-113-65.phx2.redhat.com [10.3.113.65]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u28AsTb7005758; Tue, 8 Mar 2016 05:54:30 -0500 From: Amit Shah To: Peter Maydell Date: Tue, 8 Mar 2016 16:24:12 +0530 Message-Id: <443590c2044968a97f5e7cddd35100c6075856a4.1457434403.git.amit.shah@redhat.com> In-Reply-To: References: In-Reply-To: References: X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 209.132.183.28 Cc: Amit Shah , Ladi Prosek , qemu list Subject: [Qemu-devel] [PULL 1/1] rng: switch request queue to QSIMPLEQ X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: Ladi Prosek 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 Reviewed-by: Amit Shah Message-Id: <1457010971-24771-1-git-send-email-lprosek@redhat.com> Signed-off-by: Amit Shah --- 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 4fffd68..45629c4 100644 --- a/include/sysemu/rng.h +++ b/include/sysemu/rng.h @@ -39,6 +39,7 @@ struct RngRequest void *opaque; size_t offset; size_t size; + QSIMPLEQ_ENTRY(RngRequest) next; }; struct RngBackendClass @@ -56,7 +57,7 @@ struct RngBackend /*< protected >*/ bool opened; - GSList *requests; + QSIMPLEQ_HEAD(requests, RngRequest) requests; };