diff options
| author | Ladi Prosek <lprosek@redhat.com> | 2016-03-03 09:37:18 +0100 |
|---|---|---|
| committer | Amit Shah <amit.shah@redhat.com> | 2016-03-03 17:42:26 +0530 |
| commit | 60253ed1e6ec6d8e5ef2efe7bf755f475dce9956 (patch) | |
| tree | 6cf034176fb01e29274cf455b82cd6d68823d57a /backends/rng-egd.c | |
| parent | 9f14b0add1dcdbfa2ee61051d068211fb0a1fcc9 (diff) | |
| download | focaccia-qemu-60253ed1e6ec6d8e5ef2efe7bf755f475dce9956.tar.gz focaccia-qemu-60253ed1e6ec6d8e5ef2efe7bf755f475dce9956.zip | |
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-egd.c')
| -rw-r--r-- | backends/rng-egd.c | 16 |
1 files changed, 2 insertions, 14 deletions
diff --git a/backends/rng-egd.c b/backends/rng-egd.c index 8f2bd16b18..30332edb81 100644 --- a/backends/rng-egd.c +++ b/backends/rng-egd.c @@ -27,20 +27,10 @@ typedef struct RngEgd char *chr_name; } RngEgd; -static void rng_egd_request_entropy(RngBackend *b, size_t size, - EntropyReceiveFunc *receive_entropy, - void *opaque) +static void rng_egd_request_entropy(RngBackend *b, RngRequest *req) { RngEgd *s = RNG_EGD(b); - RngRequest *req; - - 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); + size_t size = req->size; while (size > 0) { uint8_t header[2]; @@ -54,8 +44,6 @@ static void rng_egd_request_entropy(RngBackend *b, size_t size, size -= len; } - - s->parent.requests = g_slist_append(s->parent.requests, req); } static int rng_egd_chr_can_read(void *opaque) |