From: Laurent Vivier <lvivier@redhat.com> To: linux-kernel@vger.kernel.org Cc: amit@kernel.org, Herbert Xu <herbert@gondor.apana.org.au>, Matt Mackall <mpm@selenic.com>, virtualization@lists.linux-foundation.org, Dmitriy Vyukov <dvyukov@google.com>, rusty@rustcorp.com.au, akong@redhat.com, Alexander Potapenko <glider@google.com>, "Michael S . Tsirkin" <mst@redhat.com>, linux-crypto@vger.kernel.org, Laurent Vivier <lvivier@redhat.com> Subject: [PATCH v2 3/4] hwrng: virtio - don't waste entropy Date: Thu, 28 Oct 2021 12:11:10 +0200 [thread overview] Message-ID: <20211028101111.128049-4-lvivier@redhat.com> (raw) In-Reply-To: <20211028101111.128049-1-lvivier@redhat.com> if we don't use all the entropy available in the buffer, keep it and use it later. Signed-off-by: Laurent Vivier <lvivier@redhat.com> --- drivers/char/hw_random/virtio-rng.c | 52 +++++++++++++++++++---------- 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/drivers/char/hw_random/virtio-rng.c b/drivers/char/hw_random/virtio-rng.c index 173aeea835bb..8ba97cf4ca8f 100644 --- a/drivers/char/hw_random/virtio-rng.c +++ b/drivers/char/hw_random/virtio-rng.c @@ -26,6 +26,7 @@ struct virtrng_info { /* data transfer */ struct completion have_data; unsigned int data_avail; + unsigned int data_idx; /* minimal size returned by rng_buffer_size() */ #if SMP_CACHE_BYTES < 32 u8 data[32]; @@ -42,6 +43,9 @@ static void random_recv_done(struct virtqueue *vq) if (!virtqueue_get_buf(vi->vq, &vi->data_avail)) return; + vi->data_idx = 0; + vi->busy = false; + complete(&vi->have_data); } @@ -58,6 +62,16 @@ static void register_buffer(struct virtrng_info *vi) virtqueue_kick(vi->vq); } +static unsigned int copy_data(struct virtrng_info *vi, void *buf, + unsigned int size) +{ + size = min_t(unsigned int, size, vi->data_avail); + memcpy(buf, vi->data + vi->data_idx, size); + vi->data_idx += size; + vi->data_avail -= size; + return size; +} + static int virtio_read(struct hwrng *rng, void *buf, size_t size, bool wait) { int ret; @@ -68,17 +82,29 @@ static int virtio_read(struct hwrng *rng, void *buf, size_t size, bool wait) if (vi->hwrng_removed) return -ENODEV; - if (!vi->busy) { - vi->busy = true; - reinit_completion(&vi->have_data); - register_buffer(vi); + read = 0; + + /* copy available data */ + if (vi->data_avail) { + chunk = copy_data(vi, buf, size); + size -= chunk; + read += chunk; } if (!wait) - return 0; + return read; - read = 0; + /* We have already copied available entropy, + * so either size is 0 or data_avail is 0 + */ while (size != 0) { + /* data_avail is 0 */ + if (!vi->busy) { + /* no pending request, ask for more */ + vi->busy = true; + reinit_completion(&vi->have_data); + register_buffer(vi); + } ret = wait_for_completion_killable(&vi->have_data); if (ret < 0) return ret; @@ -88,20 +114,11 @@ static int virtio_read(struct hwrng *rng, void *buf, size_t size, bool wait) if (vi->data_avail == 0) return read; - chunk = min_t(unsigned int, size, vi->data_avail); - memcpy(buf + read, vi->data, chunk); - read += chunk; + chunk = copy_data(vi, buf + read, size); size -= chunk; - vi->data_avail = 0; - - if (size != 0) { - reinit_completion(&vi->have_data); - register_buffer(vi); - } + read += chunk; } - vi->busy = false; - return read; } @@ -161,6 +178,7 @@ static void remove_common(struct virtio_device *vdev) vi->hwrng_removed = true; vi->data_avail = 0; + vi->data_idx = 0; complete(&vi->have_data); vdev->config->reset(vdev); vi->busy = false; -- 2.31.1
WARNING: multiple messages have this Message-ID (diff)
From: Laurent Vivier <lvivier@redhat.com> To: linux-kernel@vger.kernel.org Cc: Laurent Vivier <lvivier@redhat.com>, Herbert Xu <herbert@gondor.apana.org.au>, amit@kernel.org, "Michael S . Tsirkin" <mst@redhat.com>, rusty@rustcorp.com.au, virtualization@lists.linux-foundation.org, Alexander Potapenko <glider@google.com>, linux-crypto@vger.kernel.org, Matt Mackall <mpm@selenic.com>, akong@redhat.com, Dmitriy Vyukov <dvyukov@google.com> Subject: [PATCH v2 3/4] hwrng: virtio - don't waste entropy Date: Thu, 28 Oct 2021 12:11:10 +0200 [thread overview] Message-ID: <20211028101111.128049-4-lvivier@redhat.com> (raw) In-Reply-To: <20211028101111.128049-1-lvivier@redhat.com> if we don't use all the entropy available in the buffer, keep it and use it later. Signed-off-by: Laurent Vivier <lvivier@redhat.com> --- drivers/char/hw_random/virtio-rng.c | 52 +++++++++++++++++++---------- 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/drivers/char/hw_random/virtio-rng.c b/drivers/char/hw_random/virtio-rng.c index 173aeea835bb..8ba97cf4ca8f 100644 --- a/drivers/char/hw_random/virtio-rng.c +++ b/drivers/char/hw_random/virtio-rng.c @@ -26,6 +26,7 @@ struct virtrng_info { /* data transfer */ struct completion have_data; unsigned int data_avail; + unsigned int data_idx; /* minimal size returned by rng_buffer_size() */ #if SMP_CACHE_BYTES < 32 u8 data[32]; @@ -42,6 +43,9 @@ static void random_recv_done(struct virtqueue *vq) if (!virtqueue_get_buf(vi->vq, &vi->data_avail)) return; + vi->data_idx = 0; + vi->busy = false; + complete(&vi->have_data); } @@ -58,6 +62,16 @@ static void register_buffer(struct virtrng_info *vi) virtqueue_kick(vi->vq); } +static unsigned int copy_data(struct virtrng_info *vi, void *buf, + unsigned int size) +{ + size = min_t(unsigned int, size, vi->data_avail); + memcpy(buf, vi->data + vi->data_idx, size); + vi->data_idx += size; + vi->data_avail -= size; + return size; +} + static int virtio_read(struct hwrng *rng, void *buf, size_t size, bool wait) { int ret; @@ -68,17 +82,29 @@ static int virtio_read(struct hwrng *rng, void *buf, size_t size, bool wait) if (vi->hwrng_removed) return -ENODEV; - if (!vi->busy) { - vi->busy = true; - reinit_completion(&vi->have_data); - register_buffer(vi); + read = 0; + + /* copy available data */ + if (vi->data_avail) { + chunk = copy_data(vi, buf, size); + size -= chunk; + read += chunk; } if (!wait) - return 0; + return read; - read = 0; + /* We have already copied available entropy, + * so either size is 0 or data_avail is 0 + */ while (size != 0) { + /* data_avail is 0 */ + if (!vi->busy) { + /* no pending request, ask for more */ + vi->busy = true; + reinit_completion(&vi->have_data); + register_buffer(vi); + } ret = wait_for_completion_killable(&vi->have_data); if (ret < 0) return ret; @@ -88,20 +114,11 @@ static int virtio_read(struct hwrng *rng, void *buf, size_t size, bool wait) if (vi->data_avail == 0) return read; - chunk = min_t(unsigned int, size, vi->data_avail); - memcpy(buf + read, vi->data, chunk); - read += chunk; + chunk = copy_data(vi, buf + read, size); size -= chunk; - vi->data_avail = 0; - - if (size != 0) { - reinit_completion(&vi->have_data); - register_buffer(vi); - } + read += chunk; } - vi->busy = false; - return read; } @@ -161,6 +178,7 @@ static void remove_common(struct virtio_device *vdev) vi->hwrng_removed = true; vi->data_avail = 0; + vi->data_idx = 0; complete(&vi->have_data); vdev->config->reset(vdev); vi->busy = false; -- 2.31.1 _______________________________________________ Virtualization mailing list Virtualization@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/virtualization
next prev parent reply other threads:[~2021-10-28 10:12 UTC|newest] Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-10-28 10:11 [PATCH v2 0/4] hwrng: virtio - add an internal buffer Laurent Vivier 2021-10-28 10:11 ` Laurent Vivier 2021-10-28 10:11 ` [PATCH v2 1/4] " Laurent Vivier 2021-10-28 10:11 ` Laurent Vivier 2021-10-28 10:11 ` [PATCH v2 2/4] hwrng: virtio - don't wait on cleanup Laurent Vivier 2021-10-28 10:11 ` Laurent Vivier 2021-10-28 10:11 ` Laurent Vivier [this message] 2021-10-28 10:11 ` [PATCH v2 3/4] hwrng: virtio - don't waste entropy Laurent Vivier 2021-10-28 10:11 ` [PATCH v2 4/4] hwrng: virtio - always add a pending request Laurent Vivier 2021-10-28 10:11 ` Laurent Vivier 2022-08-02 12:49 ` Vladimir Murzin 2022-08-03 8:57 ` Vladimir Murzin 2022-08-03 11:39 ` Michael S. Tsirkin 2022-08-03 11:39 ` Michael S. Tsirkin 2022-08-03 12:25 ` Vladimir Murzin 2022-08-03 12:55 ` Michael S. Tsirkin 2022-08-03 12:55 ` Michael S. Tsirkin 2022-08-03 13:12 ` Vladimir Murzin 2022-08-09 20:16 ` Michael S. Tsirkin 2022-08-09 20:16 ` Michael S. Tsirkin 2022-08-10 7:54 ` Vladimir Murzin
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20211028101111.128049-4-lvivier@redhat.com \ --to=lvivier@redhat.com \ --cc=akong@redhat.com \ --cc=amit@kernel.org \ --cc=dvyukov@google.com \ --cc=glider@google.com \ --cc=herbert@gondor.apana.org.au \ --cc=linux-crypto@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=mpm@selenic.com \ --cc=mst@redhat.com \ --cc=rusty@rustcorp.com.au \ --cc=virtualization@lists.linux-foundation.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.