|
|
fadd50c |
From 9f14b0add1dcdbfa2ee61051d068211fb0a1fcc9 Mon Sep 17 00:00:00 2001
|
|
|
fadd50c |
From: Ladi Prosek <lprosek@redhat.com>
|
|
|
fadd50c |
Date: Thu, 3 Mar 2016 09:37:17 +0100
|
|
|
fadd50c |
Subject: [PATCH] rng: move request queue cleanup from RngEgd to RngBackend
|
|
|
fadd50c |
|
|
|
fadd50c |
RngBackend is now in charge of cleaning up the linked list on
|
|
|
fadd50c |
instance finalization. It also exposes a function to finalize
|
|
|
fadd50c |
individual RngRequest instances, called by its child classes.
|
|
|
fadd50c |
|
|
|
fadd50c |
Signed-off-by: Ladi Prosek <lprosek@redhat.com>
|
|
|
fadd50c |
Reviewed-by: Amit Shah <amit.shah@redhat.com>
|
|
|
fadd50c |
Message-Id: <1456994238-9585-4-git-send-email-lprosek@redhat.com>
|
|
|
fadd50c |
Signed-off-by: Amit Shah <amit.shah@redhat.com>
|
|
|
fadd50c |
---
|
|
|
fadd50c |
backends/rng-egd.c | 25 +------------------------
|
|
|
fadd50c |
backends/rng.c | 32 ++++++++++++++++++++++++++++++++
|
|
|
fadd50c |
include/sysemu/rng.h | 12 ++++++++++++
|
|
|
fadd50c |
3 files changed, 45 insertions(+), 24 deletions(-)
|
|
|
fadd50c |
|
|
|
fadd50c |
diff --git a/tools/qemu-xen/backends/rng-egd.c b/tools/qemu-xen/backends/rng-egd.c
|
|
|
fadd50c |
index b061362..8f2bd16 100644
|
|
|
fadd50c |
--- a/tools/qemu-xen/backends/rng-egd.c
|
|
|
fadd50c |
+++ b/tools/qemu-xen/backends/rng-egd.c
|
|
|
fadd50c |
@@ -58,12 +58,6 @@ static void rng_egd_request_entropy(RngBackend *b, size_t size,
|
|
|
fadd50c |
s->parent.requests = g_slist_append(s->parent.requests, req);
|
|
|
fadd50c |
}
|
|
|
fadd50c |
|
|
|
fadd50c |
-static void rng_egd_free_request(RngRequest *req)
|
|
|
fadd50c |
-{
|
|
|
fadd50c |
- g_free(req->data);
|
|
|
fadd50c |
- g_free(req);
|
|
|
fadd50c |
-}
|
|
|
fadd50c |
-
|
|
|
fadd50c |
static int rng_egd_chr_can_read(void *opaque)
|
|
|
fadd50c |
{
|
|
|
fadd50c |
RngEgd *s = RNG_EGD(opaque);
|
|
|
fadd50c |
@@ -93,28 +87,13 @@ static void rng_egd_chr_read(void *opaque, const uint8_t *buf, int size)
|
|
|
fadd50c |
size -= len;
|
|
|
fadd50c |
|
|
|
fadd50c |
if (req->offset == req->size) {
|
|
|
fadd50c |
- s->parent.requests = g_slist_remove_link(s->parent.requests,
|
|
|
fadd50c |
- s->parent.requests);
|
|
|
fadd50c |
-
|
|
|
fadd50c |
req->receive_entropy(req->opaque, req->data, req->size);
|
|
|
fadd50c |
|
|
|
fadd50c |
- rng_egd_free_request(req);
|
|
|
fadd50c |
+ rng_backend_finalize_request(&s->parent, req);
|
|
|
fadd50c |
}
|
|
|
fadd50c |
}
|
|
|
fadd50c |
}
|
|
|
fadd50c |
|
|
|
fadd50c |
-static void rng_egd_free_requests(RngEgd *s)
|
|
|
fadd50c |
-{
|
|
|
fadd50c |
- GSList *i;
|
|
|
fadd50c |
-
|
|
|
fadd50c |
- for (i = s->parent.requests; i; i = i->next) {
|
|
|
fadd50c |
- rng_egd_free_request(i->data);
|
|
|
fadd50c |
- }
|
|
|
fadd50c |
-
|
|
|
fadd50c |
- g_slist_free(s->parent.requests);
|
|
|
fadd50c |
- s->parent.requests = NULL;
|
|
|
fadd50c |
-}
|
|
|
fadd50c |
-
|
|
|
fadd50c |
static void rng_egd_opened(RngBackend *b, Error **errp)
|
|
|
fadd50c |
{
|
|
|
fadd50c |
RngEgd *s = RNG_EGD(b);
|
|
|
fadd50c |
@@ -183,8 +162,6 @@ static void rng_egd_finalize(Object *obj)
|
|
|
fadd50c |
}
|
|
|
fadd50c |
|
|
|
fadd50c |
g_free(s->chr_name);
|
|
|
fadd50c |
-
|
|
|
fadd50c |
- rng_egd_free_requests(s);
|
|
|
fadd50c |
}
|
|
|
fadd50c |
|
|
|
fadd50c |
static void rng_egd_class_init(ObjectClass *klass, void *data)
|
|
|
fadd50c |
diff --git a/tools/qemu-xen/backends/rng.c b/tools/qemu-xen/backends/rng.c
|
|
|
fadd50c |
index 2f2f3ee..014cb9d 100644
|
|
|
fadd50c |
--- a/tools/qemu-xen/backends/rng.c
|
|
|
fadd50c |
+++ b/tools/qemu-xen/backends/rng.c
|
|
|
fadd50c |
@@ -64,6 +64,30 @@ static void rng_backend_prop_set_opened(Object *obj, bool value, Error **errp)
|
|
|
fadd50c |
s->opened = true;
|
|
|
fadd50c |
}
|
|
|
fadd50c |
|
|
|
fadd50c |
+static void rng_backend_free_request(RngRequest *req)
|
|
|
fadd50c |
+{
|
|
|
fadd50c |
+ g_free(req->data);
|
|
|
fadd50c |
+ g_free(req);
|
|
|
fadd50c |
+}
|
|
|
fadd50c |
+
|
|
|
fadd50c |
+static void rng_backend_free_requests(RngBackend *s)
|
|
|
fadd50c |
+{
|
|
|
fadd50c |
+ GSList *i;
|
|
|
fadd50c |
+
|
|
|
fadd50c |
+ for (i = s->requests; i; i = i->next) {
|
|
|
fadd50c |
+ rng_backend_free_request(i->data);
|
|
|
fadd50c |
+ }
|
|
|
fadd50c |
+
|
|
|
fadd50c |
+ g_slist_free(s->requests);
|
|
|
fadd50c |
+ s->requests = NULL;
|
|
|
fadd50c |
+}
|
|
|
fadd50c |
+
|
|
|
fadd50c |
+void rng_backend_finalize_request(RngBackend *s, RngRequest *req)
|
|
|
fadd50c |
+{
|
|
|
fadd50c |
+ s->requests = g_slist_remove(s->requests, req);
|
|
|
fadd50c |
+ rng_backend_free_request(req);
|
|
|
fadd50c |
+}
|
|
|
fadd50c |
+
|
|
|
fadd50c |
static void rng_backend_init(Object *obj)
|
|
|
fadd50c |
{
|
|
|
fadd50c |
object_property_add_bool(obj, "opened",
|
|
|
fadd50c |
@@ -72,6 +96,13 @@ static void rng_backend_init(Object *obj)
|
|
|
fadd50c |
NULL);
|
|
|
fadd50c |
}
|
|
|
fadd50c |
|
|
|
fadd50c |
+static void rng_backend_finalize(Object *obj)
|
|
|
fadd50c |
+{
|
|
|
fadd50c |
+ RngBackend *s = RNG_BACKEND(obj);
|
|
|
fadd50c |
+
|
|
|
fadd50c |
+ rng_backend_free_requests(s);
|
|
|
fadd50c |
+}
|
|
|
fadd50c |
+
|
|
|
fadd50c |
static void rng_backend_class_init(ObjectClass *oc, void *data)
|
|
|
fadd50c |
{
|
|
|
fadd50c |
UserCreatableClass *ucc = USER_CREATABLE_CLASS(oc);
|
|
|
fadd50c |
@@ -84,6 +115,7 @@ static const TypeInfo rng_backend_info = {
|
|
|
fadd50c |
.parent = TYPE_OBJECT,
|
|
|
fadd50c |
.instance_size = sizeof(RngBackend),
|
|
|
fadd50c |
.instance_init = rng_backend_init,
|
|
|
fadd50c |
+ .instance_finalize = rng_backend_finalize,
|
|
|
fadd50c |
.class_size = sizeof(RngBackendClass),
|
|
|
fadd50c |
.class_init = rng_backend_class_init,
|
|
|
fadd50c |
.abstract = true,
|
|
|
fadd50c |
diff --git a/tools/qemu-xen/include/sysemu/rng.h b/tools/qemu-xen/include/sysemu/rng.h
|
|
|
fadd50c |
index c744d82..08a2eda 100644
|
|
|
fadd50c |
--- a/tools/qemu-xen/include/sysemu/rng.h
|
|
|
fadd50c |
+++ b/tools/qemu-xen/include/sysemu/rng.h
|
|
|
fadd50c |
@@ -60,6 +60,7 @@ struct RngBackend
|
|
|
fadd50c |
GSList *requests;
|
|
|
fadd50c |
};
|
|
|
fadd50c |
|
|
|
fadd50c |
+
|
|
|
fadd50c |
/**
|
|
|
fadd50c |
* rng_backend_request_entropy:
|
|
|
fadd50c |
* @s: the backend to request entropy from
|
|
|
fadd50c |
@@ -78,4 +79,15 @@ struct RngBackend
|
|
|
fadd50c |
void rng_backend_request_entropy(RngBackend *s, size_t size,
|
|
|
fadd50c |
EntropyReceiveFunc *receive_entropy,
|
|
|
fadd50c |
void *opaque);
|
|
|
fadd50c |
+
|
|
|
fadd50c |
+/**
|
|
|
fadd50c |
+ * rng_backend_free_request:
|
|
|
fadd50c |
+ * @s: the backend that created the request
|
|
|
fadd50c |
+ * @req: the request to finalize
|
|
|
fadd50c |
+ *
|
|
|
fadd50c |
+ * Used by child rng backend classes to finalize requests once they've been
|
|
|
fadd50c |
+ * processed. The request is removed from the list of active requests and
|
|
|
fadd50c |
+ * deleted.
|
|
|
fadd50c |
+ */
|
|
|
fadd50c |
+void rng_backend_finalize_request(RngBackend *s, RngRequest *req);
|
|
|
fadd50c |
#endif
|
|
|
fadd50c |
--
|
|
|
fadd50c |
1.7.0.4
|
|
|
fadd50c |
|