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