Re: [Qemu-devel] [PATCH v2 1/1] virtio-rng: hardware random number generator device

2012-06-11 Thread Daniel P. Berrange
On Tue, Jun 05, 2012 at 03:46:31PM +0530, Amit Shah wrote:
 On (Tue) 05 Jun 2012 [17:54:30], Anthony Liguori wrote:
  On 06/05/2012 05:41 PM, Amit Shah wrote:
  On (Mon) 04 Jun 2012 [19:04:41], Anthony Liguori wrote:
  On 05/26/2012 04:20 AM, Amit Shah wrote:
  On (Fri) 25 May 2012 [15:00:53], Anthony Liguori wrote:
  On 05/25/2012 02:32 PM, Amit Shah wrote:
  The Linux kernel already has a virtio-rng driver, this is the device
  implementation.
  
  When the guest asks for entropy from the virtio hwrng, it puts a buffer
  in the vq.  We then put entropy into that buffer, and push it back to
  the guest.
  
  The chardev connected to this device is fed the data to be sent to the
  guest.
  
  Invocation is simple:
  
 $ qemu ... -device virtio-rng-pci,chardev=foo
  
  In the guest, we see
  
 $ cat /sys/devices/virtual/misc/hw_random/rng_available
 virtio
  
 $ cat /sys/devices/virtual/misc/hw_random/rng_current
 virtio
  
 # cat /dev/hwrng
  
  Simply feeding /dev/urandom from the host to the chardev is sufficient:
  
 $ qemu ... -chardev socket,path=/tmp/foo,server,nowait,id=foo \
-device virtio-rng,chardev=foo
  
 $ nc -U /tmp/foo/dev/urandom
  
  A QMP event is sent for interested apps to monitor activity and send 
  the
  appropriate number of bytes that get asked by the guest:
  
 {timestamp: {seconds: 1337966878, microseconds: 517009}, \
  event: ENTROPY_NEEDED, data: {bytes: 64}}
  
  I don't understand the point of this event.  Can't a management app
  just create a socket and then it can see all the requests the guest
  makes?
  
  How?  With the chardev, it can only keep feeding data, and that data
  will be consumed when chr_can_read() returns   0.  And even then the
  mgmt app has no idea how much data was asked for, and how much was
  consumed.
  
  Okay, then the right approach is to use a message protocol where
  QEMU asks for a certain amount of data and then the daemon sends it
  back.
  
  Why is a message protocol necessary?  And a daemon isn't necessary,
  too.
  
  I think this is pretty much why the egd protocol exists, no?  Why
  not just implement egd protocol support?
  
  Perhaps I'm not getting what you're saying.
  
  What we have here, via the event, is to tell the mgmt app that the
  guest has need for entropy.
  
  *out-of-band*
  
  Why not just make that all in-band?
  
  I understand you're trying to accomodate a use-case of feeding
  /dev/random to QEMU.  I don't think this is a necessary use-case
  though because I don't think it's correct.  You need to use an
  entropy daemon of some sort to make sure entropy is being
  distributed in a fair fashion.
 
 In my view, qemu doesn't operate at a system-level where it can see
 how system entropy is being used.
 
 libvirt does operate at that level.
 
 For casual development, I don't want to have egd on my system to feed
 in entropy to the guest, and I don't need to know how to configure
 egd and then provide its output to qemu.
 
 libvirt can do that for me.  But for development, I'd just want to be
 able to do something like
 
 qemu -chardev socket,path=/tmp/foo,id=foo,server,nowait \
  -device virtio-rng,chardev=foo
 
 and then just feed in some data to /tmp/foo.

I tend to agree, while the EGD wire protocol may be useful if you
are wanting to connect QEMU to EGD, for apps that are just directly
mnanaging QEMU it imposes a unnecessary burden on apps, to learn
a new protocol in addition to their existing knowledge of QMP.

In addition, I don't think implementing the EGD protocol is mutually
exclusive with raw QEMU chardevs. eg enablement of an EGD protocol on
the chardev could reasonably be done as an optional feature ontop of
the raw chardev, in the same way that chardevs can be made to optionally
run the telnet line discipline.

I'd like to see us have the raw chardev impl + QMP event as a first
step, and then add EGD protocol on top of that (if desired) as a
second step.

Regards,
Daniel
-- 
|: http://berrange.com  -o-http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org  -o- http://virt-manager.org :|
|: http://autobuild.org   -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org   -o-   http://live.gnome.org/gtk-vnc :|



Re: [Qemu-devel] [PATCH v2 1/1] virtio-rng: hardware random number generator device

2012-06-05 Thread Amit Shah
On (Mon) 04 Jun 2012 [19:04:41], Anthony Liguori wrote:
 On 05/26/2012 04:20 AM, Amit Shah wrote:
 On (Fri) 25 May 2012 [15:00:53], Anthony Liguori wrote:
 On 05/25/2012 02:32 PM, Amit Shah wrote:
 The Linux kernel already has a virtio-rng driver, this is the device
 implementation.
 
 When the guest asks for entropy from the virtio hwrng, it puts a buffer
 in the vq.  We then put entropy into that buffer, and push it back to
 the guest.
 
 The chardev connected to this device is fed the data to be sent to the
 guest.
 
 Invocation is simple:
 
$ qemu ... -device virtio-rng-pci,chardev=foo
 
 In the guest, we see
 
$ cat /sys/devices/virtual/misc/hw_random/rng_available
virtio
 
$ cat /sys/devices/virtual/misc/hw_random/rng_current
virtio
 
# cat /dev/hwrng
 
 Simply feeding /dev/urandom from the host to the chardev is sufficient:
 
$ qemu ... -chardev socket,path=/tmp/foo,server,nowait,id=foo \
   -device virtio-rng,chardev=foo
 
$ nc -U /tmp/foo   /dev/urandom
 
 A QMP event is sent for interested apps to monitor activity and send the
 appropriate number of bytes that get asked by the guest:
 
{timestamp: {seconds: 1337966878, microseconds: 517009}, \
 event: ENTROPY_NEEDED, data: {bytes: 64}}
 
 I don't understand the point of this event.  Can't a management app
 just create a socket and then it can see all the requests the guest
 makes?
 
 How?  With the chardev, it can only keep feeding data, and that data
 will be consumed when chr_can_read() returns  0.  And even then the
 mgmt app has no idea how much data was asked for, and how much was
 consumed.
 
 Okay, then the right approach is to use a message protocol where
 QEMU asks for a certain amount of data and then the daemon sends it
 back.

Why is a message protocol necessary?  And a daemon isn't necessary,
too.

 I think this is pretty much why the egd protocol exists, no?  Why
 not just implement egd protocol support?

Perhaps I'm not getting what you're saying.

What we have here, via the event, is to tell the mgmt app that the
guest has need for entropy.  The guest also tells us exactly how many
bytes it needs.  We're just passing on that info to the mgmt app, if
it needs it.

In any case, any data pushed down the chardev will be consumed by the
device, and sent to the guest when the guest puts a buf in the vq.

 Once we introduce a protocol of any form (even raw), we have to
 support it forever so let's not do it carelessly.

There's no need for a protocol at all here.  Can you skim through the
code and point out where you think we're disagreeing?

Amit



Re: [Qemu-devel] [PATCH v2 1/1] virtio-rng: hardware random number generator device

2012-06-05 Thread Anthony Liguori

On 06/05/2012 05:41 PM, Amit Shah wrote:

On (Mon) 04 Jun 2012 [19:04:41], Anthony Liguori wrote:

On 05/26/2012 04:20 AM, Amit Shah wrote:

On (Fri) 25 May 2012 [15:00:53], Anthony Liguori wrote:

On 05/25/2012 02:32 PM, Amit Shah wrote:

The Linux kernel already has a virtio-rng driver, this is the device
implementation.

When the guest asks for entropy from the virtio hwrng, it puts a buffer
in the vq.  We then put entropy into that buffer, and push it back to
the guest.

The chardev connected to this device is fed the data to be sent to the
guest.

Invocation is simple:

   $ qemu ... -device virtio-rng-pci,chardev=foo

In the guest, we see

   $ cat /sys/devices/virtual/misc/hw_random/rng_available
   virtio

   $ cat /sys/devices/virtual/misc/hw_random/rng_current
   virtio

   # cat /dev/hwrng

Simply feeding /dev/urandom from the host to the chardev is sufficient:

   $ qemu ... -chardev socket,path=/tmp/foo,server,nowait,id=foo \
  -device virtio-rng,chardev=foo

   $ nc -U /tmp/foo/dev/urandom

A QMP event is sent for interested apps to monitor activity and send the
appropriate number of bytes that get asked by the guest:

   {timestamp: {seconds: 1337966878, microseconds: 517009}, \
event: ENTROPY_NEEDED, data: {bytes: 64}}


I don't understand the point of this event.  Can't a management app
just create a socket and then it can see all the requests the guest
makes?


How?  With the chardev, it can only keep feeding data, and that data
will be consumed when chr_can_read() returns   0.  And even then the
mgmt app has no idea how much data was asked for, and how much was
consumed.


Okay, then the right approach is to use a message protocol where
QEMU asks for a certain amount of data and then the daemon sends it
back.


Why is a message protocol necessary?  And a daemon isn't necessary,
too.


I think this is pretty much why the egd protocol exists, no?  Why
not just implement egd protocol support?


Perhaps I'm not getting what you're saying.

What we have here, via the event, is to tell the mgmt app that the
guest has need for entropy.


*out-of-band*

Why not just make that all in-band?

I understand you're trying to accomodate a use-case of feeding /dev/random to 
QEMU.  I don't think this is a necessary use-case though because I don't think 
it's correct.  You need to use an entropy daemon of some sort to make sure 
entropy is being distributed in a fair fashion.



The guest also tells us exactly how many
bytes it needs.  We're just passing on that info to the mgmt app, if
it needs it.

In any case, any data pushed down the chardev will be consumed by the
device, and sent to the guest when the guest puts a buf in the vq.


Once we introduce a protocol of any form (even raw), we have to
support it forever so let's not do it carelessly.


There's no need for a protocol at all here.


The event *is* a protocol.  That's the point.

Here's what you're making a management app do:

1) Open a socket
2) Feed socket fd to QEMU
3) Listen for event on QMP for entropy request
4) Read entropy based on (3) from /dev/random
5) Send entropy to socket to QEMU

This is pretty silly when you can just do:

1) Open a socket
2) Listen for entropy request
3) Read entry based on (2) from /dev/random
4) Respond to (2) with (3)

And there's already a tool and protocol for exactly the above--egd.

There's simply no good reason to involve QMP here.

Regards,

Anthony Liguori

  Can you skim through the

code and point out where you think we're disagreeing?

Amit





Re: [Qemu-devel] [PATCH v2 1/1] virtio-rng: hardware random number generator device

2012-06-05 Thread Amit Shah
On (Tue) 05 Jun 2012 [17:54:30], Anthony Liguori wrote:
 On 06/05/2012 05:41 PM, Amit Shah wrote:
 On (Mon) 04 Jun 2012 [19:04:41], Anthony Liguori wrote:
 On 05/26/2012 04:20 AM, Amit Shah wrote:
 On (Fri) 25 May 2012 [15:00:53], Anthony Liguori wrote:
 On 05/25/2012 02:32 PM, Amit Shah wrote:
 The Linux kernel already has a virtio-rng driver, this is the device
 implementation.
 
 When the guest asks for entropy from the virtio hwrng, it puts a buffer
 in the vq.  We then put entropy into that buffer, and push it back to
 the guest.
 
 The chardev connected to this device is fed the data to be sent to the
 guest.
 
 Invocation is simple:
 
$ qemu ... -device virtio-rng-pci,chardev=foo
 
 In the guest, we see
 
$ cat /sys/devices/virtual/misc/hw_random/rng_available
virtio
 
$ cat /sys/devices/virtual/misc/hw_random/rng_current
virtio
 
# cat /dev/hwrng
 
 Simply feeding /dev/urandom from the host to the chardev is sufficient:
 
$ qemu ... -chardev socket,path=/tmp/foo,server,nowait,id=foo \
   -device virtio-rng,chardev=foo
 
$ nc -U /tmp/foo/dev/urandom
 
 A QMP event is sent for interested apps to monitor activity and send the
 appropriate number of bytes that get asked by the guest:
 
{timestamp: {seconds: 1337966878, microseconds: 517009}, \
 event: ENTROPY_NEEDED, data: {bytes: 64}}
 
 I don't understand the point of this event.  Can't a management app
 just create a socket and then it can see all the requests the guest
 makes?
 
 How?  With the chardev, it can only keep feeding data, and that data
 will be consumed when chr_can_read() returns   0.  And even then the
 mgmt app has no idea how much data was asked for, and how much was
 consumed.
 
 Okay, then the right approach is to use a message protocol where
 QEMU asks for a certain amount of data and then the daemon sends it
 back.
 
 Why is a message protocol necessary?  And a daemon isn't necessary,
 too.
 
 I think this is pretty much why the egd protocol exists, no?  Why
 not just implement egd protocol support?
 
 Perhaps I'm not getting what you're saying.
 
 What we have here, via the event, is to tell the mgmt app that the
 guest has need for entropy.
 
 *out-of-band*
 
 Why not just make that all in-band?
 
 I understand you're trying to accomodate a use-case of feeding
 /dev/random to QEMU.  I don't think this is a necessary use-case
 though because I don't think it's correct.  You need to use an
 entropy daemon of some sort to make sure entropy is being
 distributed in a fair fashion.

In my view, qemu doesn't operate at a system-level where it can see
how system entropy is being used.

libvirt does operate at that level.

For casual development, I don't want to have egd on my system to feed
in entropy to the guest, and I don't need to know how to configure
egd and then provide its output to qemu.

libvirt can do that for me.  But for development, I'd just want to be
able to do something like

qemu -chardev socket,path=/tmp/foo,id=foo,server,nowait \
 -device virtio-rng,chardev=foo

and then just feed in some data to /tmp/foo.

 The guest also tells us exactly how many
 bytes it needs.  We're just passing on that info to the mgmt app, if
 it needs it.
 
 In any case, any data pushed down the chardev will be consumed by the
 device, and sent to the guest when the guest puts a buf in the vq.
 
 Once we introduce a protocol of any form (even raw), we have to
 support it forever so let's not do it carelessly.
 
 There's no need for a protocol at all here.
 
 The event *is* a protocol.  That's the point.

But there is no requirement to use the event.  From the cmdline above,
I can just do something like

nc -U /tmp/foo  /dev/urandom

and forget about the event.  The event is just a way to tell
interested apps what the guest did.  Nothing more.

 Here's what you're making a management app do:
 
 1) Open a socket
 2) Feed socket fd to QEMU
 3) Listen for event on QMP for entropy request

This step isn't necessary.

 4) Read entropy based on (3) from /dev/random
 5) Send entropy to socket to QEMU
 
 This is pretty silly when you can just do:
 
 1) Open a socket
 2) Listen for entropy request
 3) Read entry based on (2) from /dev/random
 4) Respond to (2) with (3)

Quoting danpb's mail from this thread:

 IIUC, there are three ways mgmt apps can use the RNG with the
 chardev
 
  - Wire it up to a source that just blindly provides all the
entropy QEMU desires (as you /dev/urandom example above)
 
  - Feed in a fixed amount of entropy every minute, regardless
of how much QEMU desires
 
  - Feed in entropy on demand, in response to the ENTROPY_NEEDED
event notification (possibly throttling)
 
 These options sounds like they should cover all reasonable needs,
 so gets my vote. Probably want to include the ENTROPY_NEEDED
 event in my patch which adds rate limiting to guest initiated
 events.

Amit



Re: [Qemu-devel] [PATCH v2 1/1] virtio-rng: hardware random number generator device

2012-06-04 Thread Anthony Liguori

On 05/26/2012 04:20 AM, Amit Shah wrote:

On (Fri) 25 May 2012 [15:00:53], Anthony Liguori wrote:

On 05/25/2012 02:32 PM, Amit Shah wrote:

The Linux kernel already has a virtio-rng driver, this is the device
implementation.

When the guest asks for entropy from the virtio hwrng, it puts a buffer
in the vq.  We then put entropy into that buffer, and push it back to
the guest.

The chardev connected to this device is fed the data to be sent to the
guest.

Invocation is simple:

   $ qemu ... -device virtio-rng-pci,chardev=foo

In the guest, we see

   $ cat /sys/devices/virtual/misc/hw_random/rng_available
   virtio

   $ cat /sys/devices/virtual/misc/hw_random/rng_current
   virtio

   # cat /dev/hwrng

Simply feeding /dev/urandom from the host to the chardev is sufficient:

   $ qemu ... -chardev socket,path=/tmp/foo,server,nowait,id=foo \
  -device virtio-rng,chardev=foo

   $ nc -U /tmp/foo   /dev/urandom

A QMP event is sent for interested apps to monitor activity and send the
appropriate number of bytes that get asked by the guest:

   {timestamp: {seconds: 1337966878, microseconds: 517009}, \
event: ENTROPY_NEEDED, data: {bytes: 64}}


I don't understand the point of this event.  Can't a management app
just create a socket and then it can see all the requests the guest
makes?


How?  With the chardev, it can only keep feeding data, and that data
will be consumed when chr_can_read() returns  0.  And even then the
mgmt app has no idea how much data was asked for, and how much was
consumed.


Okay, then the right approach is to use a message protocol where QEMU asks for a 
certain amount of data and then the daemon sends it back.


I think this is pretty much why the egd protocol exists, no?  Why not just 
implement egd protocol support?


Once we introduce a protocol of any form (even raw), we have to support it 
forever so let's not do it carelessly.


Regards,

Anthony Liguori



Amit







Re: [Qemu-devel] [PATCH v2 1/1] virtio-rng: hardware random number generator device

2012-05-28 Thread Daniel P. Berrange
On Sat, May 26, 2012 at 01:02:49AM +0530, Amit Shah wrote:
 The Linux kernel already has a virtio-rng driver, this is the device
 implementation.
 
 When the guest asks for entropy from the virtio hwrng, it puts a buffer
 in the vq.  We then put entropy into that buffer, and push it back to
 the guest.
 
 The chardev connected to this device is fed the data to be sent to the
 guest.
 
 Invocation is simple:
 
   $ qemu ... -device virtio-rng-pci,chardev=foo
 
 In the guest, we see
 
   $ cat /sys/devices/virtual/misc/hw_random/rng_available
   virtio
 
   $ cat /sys/devices/virtual/misc/hw_random/rng_current
   virtio
 
   # cat /dev/hwrng
 
 Simply feeding /dev/urandom from the host to the chardev is sufficient:
 
   $ qemu ... -chardev socket,path=/tmp/foo,server,nowait,id=foo \
  -device virtio-rng,chardev=foo
 
   $ nc -U /tmp/foo  /dev/urandom

ACK to this ARGV design from a libvirt POV.

 A QMP event is sent for interested apps to monitor activity and send the
 appropriate number of bytes that get asked by the guest:
 
   {timestamp: {seconds: 1337966878, microseconds: 517009}, \
event: ENTROPY_NEEDED, data: {bytes: 64}}

IIUC, there are three ways mgmt apps can use the RNG with the
chardev

 - Wire it up to a source that just blindly provides all the
   entropy QEMU desires (as you /dev/urandom example above)

 - Feed in a fixed amount of entropy every minute, regardless
   of how much QEMU desires

 - Feed in entropy on demand, in response to the ENTROPY_NEEDED
   event notification (possibly throttling)

These options sounds like they should cover all reasonable needs,
so gets my vote. Probably want to include the ENTROPY_NEEDED
event in my patch which adds rate limiting to guest initiated
events.

Daniel
-- 
|: http://berrange.com  -o-http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org  -o- http://virt-manager.org :|
|: http://autobuild.org   -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org   -o-   http://live.gnome.org/gtk-vnc :|



Re: [Qemu-devel] [PATCH v2 1/1] virtio-rng: hardware random number generator device

2012-05-28 Thread Amit Shah
On (Mon) 28 May 2012 [09:33:57], Daniel P. Berrange wrote:
 On Sat, May 26, 2012 at 01:02:49AM +0530, Amit Shah wrote:
  The Linux kernel already has a virtio-rng driver, this is the device
  implementation.
  
  When the guest asks for entropy from the virtio hwrng, it puts a buffer
  in the vq.  We then put entropy into that buffer, and push it back to
  the guest.
  
  The chardev connected to this device is fed the data to be sent to the
  guest.
  
  Invocation is simple:
  
$ qemu ... -device virtio-rng-pci,chardev=foo
  
  In the guest, we see
  
$ cat /sys/devices/virtual/misc/hw_random/rng_available
virtio
  
$ cat /sys/devices/virtual/misc/hw_random/rng_current
virtio
  
# cat /dev/hwrng
  
  Simply feeding /dev/urandom from the host to the chardev is sufficient:
  
$ qemu ... -chardev socket,path=/tmp/foo,server,nowait,id=foo \
   -device virtio-rng,chardev=foo
  
$ nc -U /tmp/foo  /dev/urandom
 
 ACK to this ARGV design from a libvirt POV.
 
  A QMP event is sent for interested apps to monitor activity and send the
  appropriate number of bytes that get asked by the guest:
  
{timestamp: {seconds: 1337966878, microseconds: 517009}, \
 event: ENTROPY_NEEDED, data: {bytes: 64}}
 
 IIUC, there are three ways mgmt apps can use the RNG with the
 chardev
 
  - Wire it up to a source that just blindly provides all the
entropy QEMU desires (as you /dev/urandom example above)
 
  - Feed in a fixed amount of entropy every minute, regardless
of how much QEMU desires

This option currently won't do anything -- i.e. till the guest sends
across a buffer to be filled in, nothing will go to the guest, and the
data will just be buffered in the chardev layer till such a buffer
comes along.  It can be debatable on feeding entropy by pushing every
particular timeout, or just providing the freshest on-demand.
Advantage could be we have more random bits, disadvantage is this
could be throttled as the host went out of enough entropy.

  - Feed in entropy on demand, in response to the ENTROPY_NEEDED
event notification (possibly throttling)
 
 These options sounds like they should cover all reasonable needs,
 so gets my vote.

Great!

 Probably want to include the ENTROPY_NEEDED
 event in my patch which adds rate limiting to guest initiated
 events.

Yes, just depends in which order the patches go in.

Thanks,
Amit



[Qemu-devel] [PATCH v2 1/1] virtio-rng: hardware random number generator device

2012-05-25 Thread Amit Shah
The Linux kernel already has a virtio-rng driver, this is the device
implementation.

When the guest asks for entropy from the virtio hwrng, it puts a buffer
in the vq.  We then put entropy into that buffer, and push it back to
the guest.

The chardev connected to this device is fed the data to be sent to the
guest.

Invocation is simple:

  $ qemu ... -device virtio-rng-pci,chardev=foo

In the guest, we see

  $ cat /sys/devices/virtual/misc/hw_random/rng_available
  virtio

  $ cat /sys/devices/virtual/misc/hw_random/rng_current
  virtio

  # cat /dev/hwrng

Simply feeding /dev/urandom from the host to the chardev is sufficient:

  $ qemu ... -chardev socket,path=/tmp/foo,server,nowait,id=foo \
 -device virtio-rng,chardev=foo

  $ nc -U /tmp/foo  /dev/urandom

A QMP event is sent for interested apps to monitor activity and send the
appropriate number of bytes that get asked by the guest:

  {timestamp: {seconds: 1337966878, microseconds: 517009}, \
   event: ENTROPY_NEEDED, data: {bytes: 64}}

Signed-off-by: Amit Shah amit.s...@redhat.com
---
 Makefile.objs|1 +
 hw/pci.h |1 +
 hw/s390-virtio-bus.c |   35 +
 hw/s390-virtio-bus.h |2 +
 hw/virtio-pci.c  |   51 +
 hw/virtio-pci.h  |2 +
 hw/virtio-rng.c  |  199 ++
 hw/virtio-rng.h  |   24 ++
 hw/virtio.h  |3 +
 monitor.c|3 +
 monitor.h|1 +
 11 files changed, 322 insertions(+), 0 deletions(-)
 create mode 100644 hw/virtio-rng.c
 create mode 100644 hw/virtio-rng.h

diff --git a/Makefile.objs b/Makefile.objs
index 70c5c79..5850762 100644
--- a/Makefile.objs
+++ b/Makefile.objs
@@ -210,6 +210,7 @@ user-obj-y += $(qom-obj-twice-y)
 hw-obj-y =
 hw-obj-y += vl.o loader.o
 hw-obj-$(CONFIG_VIRTIO) += virtio-console.o
+hw-obj-$(CONFIG_VIRTIO) += virtio-rng.o
 hw-obj-y += usb/libhw.o
 hw-obj-$(CONFIG_VIRTIO_PCI) += virtio-pci.o
 hw-obj-y += fw_cfg.o
diff --git a/hw/pci.h b/hw/pci.h
index 8d0aa49..0a22f91 100644
--- a/hw/pci.h
+++ b/hw/pci.h
@@ -76,6 +76,7 @@
 #define PCI_DEVICE_ID_VIRTIO_BALLOON 0x1002
 #define PCI_DEVICE_ID_VIRTIO_CONSOLE 0x1003
 #define PCI_DEVICE_ID_VIRTIO_SCSI0x1004
+#define PCI_DEVICE_ID_VIRTIO_RNG 0x1005
 
 #define FMT_PCIBUS  PRIx64
 
diff --git a/hw/s390-virtio-bus.c b/hw/s390-virtio-bus.c
index 1d38a8f..e75711e 100644
--- a/hw/s390-virtio-bus.c
+++ b/hw/s390-virtio-bus.c
@@ -26,6 +26,7 @@
 #include loader.h
 #include elf.h
 #include hw/virtio.h
+#include hw/virtio-rng.h
 #include hw/virtio-serial.h
 #include hw/virtio-net.h
 #include hw/sysbus.h
@@ -204,6 +205,18 @@ static int s390_virtio_scsi_init(VirtIOS390Device *dev)
 return s390_virtio_device_init(dev, vdev);
 }
 
+static int s390_virtio_rng_init(VirtIOS390Device *dev)
+{
+VirtIODevice *vdev;
+
+vdev = virtio_rng_init((DeviceState *)dev, dev-rng);
+if (!vdev) {
+return -1;
+}
+
+return s390_virtio_device_init(dev, vdev);
+}
+
 static uint64_t s390_virtio_device_vq_token(VirtIOS390Device *dev, int vq)
 {
 ram_addr_t token_off;
@@ -445,6 +458,27 @@ static TypeInfo s390_virtio_serial = {
 .class_init= s390_virtio_serial_class_init,
 };
 
+static Property s390_virtio_rng_properties[] = {
+DEFINE_PROP_CHR(chardev, VirtIOS390Device, rng.chr),
+DEFINE_PROP_END_OF_LIST(),
+};
+
+static void s390_virtio_rng_class_init(ObjectClass *klass, void *data)
+{
+DeviceClass *dc = DEVICE_CLASS(klass);
+VirtIOS390DeviceClass *k = VIRTIO_S390_DEVICE_CLASS(klass);
+
+k-init = s390_virtio_rng_init;
+dc-props = s390_virtio_rng_properties;
+}
+
+static TypeInfo s390_virtio_rng = {
+.name  = virtio-rng-s390,
+.parent= TYPE_VIRTIO_S390_DEVICE,
+.instance_size = sizeof(VirtIOS390Device),
+.class_init= s390_virtio_rng_class_init,
+};
+
 static int s390_virtio_busdev_init(DeviceState *dev)
 {
 VirtIOS390Device *_dev = (VirtIOS390Device *)dev;
@@ -524,6 +558,7 @@ static void s390_virtio_register_types(void)
 type_register_static(s390_virtio_blk);
 type_register_static(s390_virtio_net);
 type_register_static(s390_virtio_scsi);
+type_register_static(s390_virtio_rng);
 type_register_static(s390_virtio_bridge_info);
 }
 
diff --git a/hw/s390-virtio-bus.h b/hw/s390-virtio-bus.h
index 4b99d02..5fc53b3 100644
--- a/hw/s390-virtio-bus.h
+++ b/hw/s390-virtio-bus.h
@@ -19,6 +19,7 @@
 
 #include virtio-blk.h
 #include virtio-net.h
+#include virtio-rng.h
 #include virtio-serial.h
 #include virtio-scsi.h
 
@@ -71,6 +72,7 @@ struct VirtIOS390Device {
 virtio_serial_conf serial;
 virtio_net_conf net;
 VirtIOSCSIConf scsi;
+VirtIORNGConf rng;
 };
 
 typedef struct VirtIOS390Bus {
diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c
index 79b86f1..bd5851e 100644
--- a/hw/virtio-pci.c
+++ b/hw/virtio-pci.c
@@ -810,6 +810,28 @@ static int virtio_balloon_exit_pci(PCIDevice *pci_dev)
 

Re: [Qemu-devel] [PATCH v2 1/1] virtio-rng: hardware random number generator device

2012-05-25 Thread Anthony Liguori

On 05/25/2012 02:32 PM, Amit Shah wrote:

The Linux kernel already has a virtio-rng driver, this is the device
implementation.

When the guest asks for entropy from the virtio hwrng, it puts a buffer
in the vq.  We then put entropy into that buffer, and push it back to
the guest.

The chardev connected to this device is fed the data to be sent to the
guest.

Invocation is simple:

   $ qemu ... -device virtio-rng-pci,chardev=foo

In the guest, we see

   $ cat /sys/devices/virtual/misc/hw_random/rng_available
   virtio

   $ cat /sys/devices/virtual/misc/hw_random/rng_current
   virtio

   # cat /dev/hwrng

Simply feeding /dev/urandom from the host to the chardev is sufficient:

   $ qemu ... -chardev socket,path=/tmp/foo,server,nowait,id=foo \
  -device virtio-rng,chardev=foo

   $ nc -U /tmp/foo  /dev/urandom

A QMP event is sent for interested apps to monitor activity and send the
appropriate number of bytes that get asked by the guest:

   {timestamp: {seconds: 1337966878, microseconds: 517009}, \
event: ENTROPY_NEEDED, data: {bytes: 64}}


I don't understand the point of this event.  Can't a management app just create 
a socket and then it can see all the requests the guest makes?


Regards,

Anthony Liguori



Signed-off-by: Amit Shahamit.s...@redhat.com
---
  Makefile.objs|1 +
  hw/pci.h |1 +
  hw/s390-virtio-bus.c |   35 +
  hw/s390-virtio-bus.h |2 +
  hw/virtio-pci.c  |   51 +
  hw/virtio-pci.h  |2 +
  hw/virtio-rng.c  |  199 ++
  hw/virtio-rng.h  |   24 ++
  hw/virtio.h  |3 +
  monitor.c|3 +
  monitor.h|1 +
  11 files changed, 322 insertions(+), 0 deletions(-)
  create mode 100644 hw/virtio-rng.c
  create mode 100644 hw/virtio-rng.h

diff --git a/Makefile.objs b/Makefile.objs
index 70c5c79..5850762 100644
--- a/Makefile.objs
+++ b/Makefile.objs
@@ -210,6 +210,7 @@ user-obj-y += $(qom-obj-twice-y)
  hw-obj-y =
  hw-obj-y += vl.o loader.o
  hw-obj-$(CONFIG_VIRTIO) += virtio-console.o
+hw-obj-$(CONFIG_VIRTIO) += virtio-rng.o
  hw-obj-y += usb/libhw.o
  hw-obj-$(CONFIG_VIRTIO_PCI) += virtio-pci.o
  hw-obj-y += fw_cfg.o
diff --git a/hw/pci.h b/hw/pci.h
index 8d0aa49..0a22f91 100644
--- a/hw/pci.h
+++ b/hw/pci.h
@@ -76,6 +76,7 @@
  #define PCI_DEVICE_ID_VIRTIO_BALLOON 0x1002
  #define PCI_DEVICE_ID_VIRTIO_CONSOLE 0x1003
  #define PCI_DEVICE_ID_VIRTIO_SCSI0x1004
+#define PCI_DEVICE_ID_VIRTIO_RNG 0x1005

  #define FMT_PCIBUS  PRIx64

diff --git a/hw/s390-virtio-bus.c b/hw/s390-virtio-bus.c
index 1d38a8f..e75711e 100644
--- a/hw/s390-virtio-bus.c
+++ b/hw/s390-virtio-bus.c
@@ -26,6 +26,7 @@
  #include loader.h
  #include elf.h
  #include hw/virtio.h
+#include hw/virtio-rng.h
  #include hw/virtio-serial.h
  #include hw/virtio-net.h
  #include hw/sysbus.h
@@ -204,6 +205,18 @@ static int s390_virtio_scsi_init(VirtIOS390Device *dev)
  return s390_virtio_device_init(dev, vdev);
  }

+static int s390_virtio_rng_init(VirtIOS390Device *dev)
+{
+VirtIODevice *vdev;
+
+vdev = virtio_rng_init((DeviceState *)dev,dev-rng);
+if (!vdev) {
+return -1;
+}
+
+return s390_virtio_device_init(dev, vdev);
+}
+
  static uint64_t s390_virtio_device_vq_token(VirtIOS390Device *dev, int vq)
  {
  ram_addr_t token_off;
@@ -445,6 +458,27 @@ static TypeInfo s390_virtio_serial = {
  .class_init= s390_virtio_serial_class_init,
  };

+static Property s390_virtio_rng_properties[] = {
+DEFINE_PROP_CHR(chardev, VirtIOS390Device, rng.chr),
+DEFINE_PROP_END_OF_LIST(),
+};
+
+static void s390_virtio_rng_class_init(ObjectClass *klass, void *data)
+{
+DeviceClass *dc = DEVICE_CLASS(klass);
+VirtIOS390DeviceClass *k = VIRTIO_S390_DEVICE_CLASS(klass);
+
+k-init = s390_virtio_rng_init;
+dc-props = s390_virtio_rng_properties;
+}
+
+static TypeInfo s390_virtio_rng = {
+.name  = virtio-rng-s390,
+.parent= TYPE_VIRTIO_S390_DEVICE,
+.instance_size = sizeof(VirtIOS390Device),
+.class_init= s390_virtio_rng_class_init,
+};
+
  static int s390_virtio_busdev_init(DeviceState *dev)
  {
  VirtIOS390Device *_dev = (VirtIOS390Device *)dev;
@@ -524,6 +558,7 @@ static void s390_virtio_register_types(void)
  type_register_static(s390_virtio_blk);
  type_register_static(s390_virtio_net);
  type_register_static(s390_virtio_scsi);
+type_register_static(s390_virtio_rng);
  type_register_static(s390_virtio_bridge_info);
  }

diff --git a/hw/s390-virtio-bus.h b/hw/s390-virtio-bus.h
index 4b99d02..5fc53b3 100644
--- a/hw/s390-virtio-bus.h
+++ b/hw/s390-virtio-bus.h
@@ -19,6 +19,7 @@

  #include virtio-blk.h
  #include virtio-net.h
+#include virtio-rng.h
  #include virtio-serial.h
  #include virtio-scsi.h

@@ -71,6 +72,7 @@ struct VirtIOS390Device {
  virtio_serial_conf serial;
  virtio_net_conf net;
  

Re: [Qemu-devel] [PATCH v2 1/1] virtio-rng: hardware random number generator device

2012-05-25 Thread Amit Shah
On (Fri) 25 May 2012 [15:00:53], Anthony Liguori wrote:
 On 05/25/2012 02:32 PM, Amit Shah wrote:
 The Linux kernel already has a virtio-rng driver, this is the device
 implementation.
 
 When the guest asks for entropy from the virtio hwrng, it puts a buffer
 in the vq.  We then put entropy into that buffer, and push it back to
 the guest.
 
 The chardev connected to this device is fed the data to be sent to the
 guest.
 
 Invocation is simple:
 
$ qemu ... -device virtio-rng-pci,chardev=foo
 
 In the guest, we see
 
$ cat /sys/devices/virtual/misc/hw_random/rng_available
virtio
 
$ cat /sys/devices/virtual/misc/hw_random/rng_current
virtio
 
# cat /dev/hwrng
 
 Simply feeding /dev/urandom from the host to the chardev is sufficient:
 
$ qemu ... -chardev socket,path=/tmp/foo,server,nowait,id=foo \
   -device virtio-rng,chardev=foo
 
$ nc -U /tmp/foo  /dev/urandom
 
 A QMP event is sent for interested apps to monitor activity and send the
 appropriate number of bytes that get asked by the guest:
 
{timestamp: {seconds: 1337966878, microseconds: 517009}, \
 event: ENTROPY_NEEDED, data: {bytes: 64}}
 
 I don't understand the point of this event.  Can't a management app
 just create a socket and then it can see all the requests the guest
 makes?

How?  With the chardev, it can only keep feeding data, and that data
will be consumed when chr_can_read() returns  0.  And even then the
mgmt app has no idea how much data was asked for, and how much was
consumed.

Amit