virtualization.lists.linux-foundation.org archive mirror
 help / color / mirror / Atom feed
From: Amit Shah <amit.shah@redhat.com>
To: linux-kernel@vger.kernel.org
Cc: jason@lakedaemon.net, keescook@chromium.org,
	stable@vger.kernel.org,
	Virtualization List <virtualization@lists.linux-foundation.org>,
	Amit Shah <amit.shah@redhat.com>,
	herbert@gondor.apana.org.au
Subject: [PATCH v2 2/2] virtio: rng: ensure reads happen after successful probe
Date: Sat,  5 Jul 2014 11:04:53 +0530	[thread overview]
Message-ID: <f64852e0dd8a439193db4c7da1d3022d029cc85d.1404538109.git.amit.shah@redhat.com> (raw)
In-Reply-To: <cover.1404538109.git.amit.shah@redhat.com>
In-Reply-To: <cover.1404538109.git.amit.shah@redhat.com>

The hwrng core asks for random data in the hwrng_register() call itself
from commit d9e7972619.  This doesn't play well with virtio -- the
DRIVER_OK bit is only set by virtio core on a successful probe, and
we're not yet out of our probe routine when this call is made.  This
causes the host to not acknowledge any requests we put in the virtqueue,
and the insmod or kernel boot process just waits for data to arrive from
the host, which never happens.

CC: Kees Cook <keescook@chromium.org>
CC: Jason Cooper <jason@lakedaemon.net>
CC: Herbert Xu <herbert@gondor.apana.org.au>
CC: <stable@vger.kernel.org> # For v3.15+
Signed-off-by: Amit Shah <amit.shah@redhat.com>
---
 drivers/char/hw_random/core.c       |  6 ++++++
 drivers/char/hw_random/virtio-rng.c | 10 ++++++++++
 2 files changed, 16 insertions(+)

diff --git a/drivers/char/hw_random/core.c b/drivers/char/hw_random/core.c
index df95e2f..50f5b76 100644
--- a/drivers/char/hw_random/core.c
+++ b/drivers/char/hw_random/core.c
@@ -68,6 +68,12 @@ static void add_early_randomness(struct hwrng *rng)
 	unsigned char bytes[16];
 	int bytes_read;
 
+	/*
+	 * Currently only virtio-rng cannot return data during device
+	 * probe, and that's handled in virtio-rng.c itself.  If there
+	 * are more such devices, this call to rng_get_data can be
+	 * made conditional here instead of doing it per-device.
+	 */
 	bytes_read = rng_get_data(rng, bytes, sizeof(bytes), 1);
 	if (bytes_read > 0)
 		add_device_randomness(bytes, bytes_read);
diff --git a/drivers/char/hw_random/virtio-rng.c b/drivers/char/hw_random/virtio-rng.c
index f3e7150..157f27c 100644
--- a/drivers/char/hw_random/virtio-rng.c
+++ b/drivers/char/hw_random/virtio-rng.c
@@ -38,6 +38,8 @@ struct virtrng_info {
 	int index;
 };
 
+bool probe_done;
+
 static void random_recv_done(struct virtqueue *vq)
 {
 	struct virtrng_info *vi = vq->vdev->priv;
@@ -67,6 +69,13 @@ static int virtio_read(struct hwrng *rng, void *buf, size_t size, bool wait)
 	int ret;
 	struct virtrng_info *vi = (struct virtrng_info *)rng->priv;
 
+	/*
+	 * Don't ask host for data till we're setup.  This call can
+	 * happen during hwrng_register(), after commit d9e7972619.
+	 */
+	if (unlikely(!probe_done))
+		return 0;
+
 	if (!vi->busy) {
 		vi->busy = true;
 		init_completion(&vi->have_data);
@@ -137,6 +146,7 @@ static int probe_common(struct virtio_device *vdev)
 		return err;
 	}
 
+	probe_done = true;
 	return 0;
 }
 
-- 
1.9.3

  parent reply	other threads:[~2014-07-05  5:34 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-05  5:34 [PATCH v2 0/2] hwrng, virtio-rng: init-time fixes Amit Shah
2014-07-05  5:34 ` [PATCH v2 1/2] hwrng: fetch randomness only after device init Amit Shah
2014-07-07  4:41   ` Kees Cook
     [not found]   ` <CAGXu5j+j1LUv_rRpf=03nRfu=Sek5O8TUs8R066JvfbUgT9ZQQ@mail.gmail.com>
2014-07-07  5:53     ` Amit Shah
2014-07-07  6:04       ` Amit Shah
2014-07-07  6:39         ` Amit Shah
2014-07-09 11:53   ` Jason Cooper
2014-07-09 13:08     ` Amit Shah
2014-07-09 13:17       ` Jason Cooper
2014-07-09 13:25         ` Amit Shah
2014-07-09 16:07           ` [RFC PATCH] hwrng: sysfs entry rng_seed_kernel, was: "Re: [PATCH v2 1/2] hwrng: fetch randomness only after device init" Jason Cooper
2014-07-11 13:26             ` Amit Shah
2014-07-11 15:44               ` Jason Cooper
2014-07-14 21:50                 ` Kees Cook
2014-07-05  5:34 ` Amit Shah [this message]
2014-07-07  4:38   ` [PATCH v2 2/2] virtio: rng: ensure reads happen after successful probe Kees Cook
2014-07-07  5:51     ` Amit Shah
2014-07-07  6:09       ` Kees Cook
2014-07-07  6:34         ` Amit Shah
2014-07-09 12:08           ` Jason Cooper
2014-07-09 13:15             ` Amit Shah
2014-07-09 16:18   ` Jason Cooper
2014-07-10  8:45     ` Herbert Xu
2014-07-10  8:52     ` Amit Shah
     [not found]     ` <20140710084514.GA15418@gondor.apana.org.au>
2014-07-10  9:53       ` Amit Shah

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=f64852e0dd8a439193db4c7da1d3022d029cc85d.1404538109.git.amit.shah@redhat.com \
    --to=amit.shah@redhat.com \
    --cc=herbert@gondor.apana.org.au \
    --cc=jason@lakedaemon.net \
    --cc=keescook@chromium.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=stable@vger.kernel.org \
    --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: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).