summaryrefslogtreecommitdiff
path: root/backends/rng.c
diff options
context:
space:
mode:
authorLadi Prosek <lprosek@redhat.com>2016-03-03 09:37:18 +0100
committerAmit Shah <amit.shah@redhat.com>2016-03-03 17:42:26 +0530
commit60253ed1e6ec6d8e5ef2efe7bf755f475dce9956 (patch)
tree6cf034176fb01e29274cf455b82cd6d68823d57a /backends/rng.c
parent9f14b0add1dcdbfa2ee61051d068211fb0a1fcc9 (diff)
downloadqemu-60253ed1e6ec6d8e5ef2efe7bf755f475dce9956.tar.gz
rng: add request queue support to rng-random
Requests are now created in the RngBackend parent class and the code path is shared by both rng-egd and rng-random. This commit fixes the rng-random implementation which processed only one request at a time and simply discarded all but the most recent one. In the guest this manifested as delayed completion of reads from virtio-rng, i.e. a read was completed only after another read was issued. By switching rng-random to use the same request queue as rng-egd, the unsafe stack-based allocation of the entropy buffer is eliminated and replaced with g_malloc. Signed-off-by: Ladi Prosek <lprosek@redhat.com> Reviewed-by: Amit Shah <amit.shah@redhat.com> Message-Id: <1456994238-9585-5-git-send-email-lprosek@redhat.com> Signed-off-by: Amit Shah <amit.shah@redhat.com>
Diffstat (limited to 'backends/rng.c')
-rw-r--r--backends/rng.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/backends/rng.c b/backends/rng.c
index 014cb9d0fe..277a41bb0f 100644
--- a/backends/rng.c
+++ b/backends/rng.c
@@ -20,9 +20,20 @@ void rng_backend_request_entropy(RngBackend *s, size_t size,
void *opaque)
{
RngBackendClass *k = RNG_BACKEND_GET_CLASS(s);
+ RngRequest *req;
if (k->request_entropy) {
- k->request_entropy(s, size, receive_entropy, opaque);
+ req = g_malloc(sizeof(*req));
+
+ req->offset = 0;
+ req->size = size;
+ req->receive_entropy = receive_entropy;
+ req->opaque = opaque;
+ req->data = g_malloc(req->size);
+
+ k->request_entropy(s, req);
+
+ s->requests = g_slist_append(s->requests, req);
}
}