qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH] Remove PCI class code from virtio balloon device
@ 2012-03-26  1:19 David Gibson
  2012-04-02  2:43 ` David Gibson
  0 siblings, 1 reply; 35+ messages in thread
From: David Gibson @ 2012-03-26  1:19 UTC (permalink / raw)
  To: aliguori; +Cc: Rusty Russell, Michael S. Tsirkin, qemu-devel, David Gibson

Currently the virtio balloon device, when using the virtio-pci interface
advertises itself with PCI class code MEMORY_RAM.  This is wrong; the
balloon is vaguely related to memory, but is nothing like a PCI memory
device in the meaning of the class code, and this code is not required or
suggested by the virtio PCI specification.

Worse, this patch causes problems on the pseries machine, because the
firmware, seeing this class code, advertises the device as memory in the
device tree, and then a guest kernel bug causes it to see this "memory"
before the real system memory, leading to a crash in early boot.

This patch fixes the problem by removing the bogus PCI class code on the
balloon device.  The backwards compatibility PC machines get new compat
properties so that they don't change.

Cc: Michael S. Tsirkin <mst@redhat.com>
Cc: Rusty Russell <rusty@rustcorp.com.au>

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/pc_piix.c    |   28 ++++++++++++++++++++++++++++
 hw/virtio-pci.c |    8 +++++++-
 2 files changed, 35 insertions(+), 1 deletions(-)

diff --git a/hw/pc_piix.c b/hw/pc_piix.c
index 3f99f9a..55dcd2e 100644
--- a/hw/pc_piix.c
+++ b/hw/pc_piix.c
@@ -386,6 +386,10 @@ static QEMUMachine pc_machine_v1_0 = {
             .driver   = "isa-fdc",
             .property = "check_media_rate",
             .value    = "off",
+        }, {
+            .driver   = "virtio-balloon-pci",
+            .property = "class",
+            .value    = stringify(PCI_CLASS_MEMORY_RAM),
         },
         { /* end of list */ }
     },
@@ -405,6 +409,10 @@ static QEMUMachine pc_machine_v0_15 = {
             .driver   = "isa-fdc",
             .property = "check_media_rate",
             .value    = "off",
+        }, {
+            .driver   = "virtio-balloon-pci",
+            .property = "class",
+            .value    = stringify(PCI_CLASS_MEMORY_RAM),
         },
         { /* end of list */ }
     },
@@ -449,6 +457,10 @@ static QEMUMachine pc_machine_v0_14 = {
             .driver   = "pc-sysfw",
             .property = "rom_only",
             .value    = stringify(1),
+        }, {
+            .driver   = "virtio-balloon-pci",
+            .property = "class",
+            .value    = stringify(PCI_CLASS_MEMORY_RAM),
         },
         { /* end of list */ }
     },
@@ -505,6 +517,10 @@ static QEMUMachine pc_machine_v0_13 = {
             .driver   = "pc-sysfw",
             .property = "rom_only",
             .value    = stringify(1),
+        }, {
+            .driver   = "virtio-balloon-pci",
+            .property = "class",
+            .value    = stringify(PCI_CLASS_MEMORY_RAM),
         },
         { /* end of list */ }
     },
@@ -565,6 +581,10 @@ static QEMUMachine pc_machine_v0_12 = {
             .driver   = "pc-sysfw",
             .property = "rom_only",
             .value    = stringify(1),
+        }, {
+            .driver   = "virtio-balloon-pci",
+            .property = "class",
+            .value    = stringify(PCI_CLASS_MEMORY_RAM),
         },
         { /* end of list */ }
     }
@@ -633,6 +653,10 @@ static QEMUMachine pc_machine_v0_11 = {
             .driver   = "pc-sysfw",
             .property = "rom_only",
             .value    = stringify(1),
+        }, {
+            .driver   = "virtio-balloon-pci",
+            .property = "class",
+            .value    = stringify(PCI_CLASS_MEMORY_RAM),
         },
         { /* end of list */ }
     }
@@ -713,6 +737,10 @@ static QEMUMachine pc_machine_v0_10 = {
             .driver   = "pc-sysfw",
             .property = "rom_only",
             .value    = stringify(1),
+        }, {
+            .driver   = "virtio-balloon-pci",
+            .property = "class",
+            .value    = stringify(PCI_CLASS_MEMORY_RAM),
         },
         { /* end of list */ }
     },
diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c
index a0fb7c1..a1fa656 100644
--- a/hw/virtio-pci.c
+++ b/hw/virtio-pci.c
@@ -790,6 +790,11 @@ static int virtio_balloon_init_pci(PCIDevice *pci_dev)
     VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
     VirtIODevice *vdev;
 
+    if (proxy->class_code != PCI_CLASS_OTHERS &&
+        proxy->class_code != PCI_CLASS_MEMORY_RAM) { /* qemu < 1.1 */
+        proxy->class_code = PCI_CLASS_OTHERS;
+    }
+
     vdev = virtio_balloon_init(&pci_dev->qdev);
     if (!vdev) {
         return -1;
@@ -905,6 +910,7 @@ static TypeInfo virtio_serial_info = {
 };
 
 static Property virtio_balloon_properties[] = {
+    DEFINE_PROP_HEX32("class", VirtIOPCIProxy, class_code, PCI_CLASS_OTHERS),
     DEFINE_VIRTIO_COMMON_FEATURES(VirtIOPCIProxy, host_features),
     DEFINE_PROP_END_OF_LIST(),
 };
@@ -919,7 +925,7 @@ static void virtio_balloon_class_init(ObjectClass *klass, void *data)
     k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
     k->device_id = PCI_DEVICE_ID_VIRTIO_BALLOON;
     k->revision = VIRTIO_PCI_ABI_VERSION;
-    k->class_id = PCI_CLASS_MEMORY_RAM;
+    k->class_id = PCI_CLASS_OTHERS;
     dc->reset = virtio_pci_reset;
     dc->props = virtio_balloon_properties;
 }
-- 
1.7.9.1

^ permalink raw reply related	[flat|nested] 35+ messages in thread
* [Qemu-devel] [PATCH] Remove PCI class code from virtio balloon device
@ 2012-03-22  9:09 David Gibson
  2012-03-22 10:01 ` Stefan Hajnoczi
  2012-03-22 11:53 ` Michael S. Tsirkin
  0 siblings, 2 replies; 35+ messages in thread
From: David Gibson @ 2012-03-22  9:09 UTC (permalink / raw)
  To: aliguori; +Cc: Rusty Russell, Michael S. Tsirkin, qemu-devel, David Gibson

Currently the virtio balloon device, when using the virtio-pci interface
advertises itself with PCI class code MEMORY_RAM.  This is wrong; the
balloon is vaguely related to memory, but is nothing like a PCI memory
device in the meaning of the class code, and this code is not required or
suggested by the virtio PCI specification.

Worse, this patch causes problems on the pseries machine, because the
firmware, seeing this class code, advertises the device as memory in the
device tree, and then a guest kernel bug causes it to see this "memory"
before the real system memory, leading to a crash in early boot.

This patch fixes the problem by removing the bogus PCI class code on the
balloon device.  The backwards compatibility PC machines get new compat
properties so that they don't change.

Cc: Michael S. Tsirkin <mst@redhat.com>
Cc: Rusty Russell <rusty@rustcorp.com.au>

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/pc_piix.c    |   24 ++++++++++++++++++++++++
 hw/virtio-pci.c |    7 ++++++-
 2 files changed, 30 insertions(+), 1 deletions(-)


diff --git a/hw/pc_piix.c b/hw/pc_piix.c
index 3f99f9a..72a4250 100644
--- a/hw/pc_piix.c
+++ b/hw/pc_piix.c
@@ -386,6 +386,10 @@ static QEMUMachine pc_machine_v1_0 = {
             .driver   = "isa-fdc",
             .property = "check_media_rate",
             .value    = "off",
+        }, {
+            .driver   = "virtio-balloon-pci",
+            .property = "class",
+            .value    = stringify(PCI_CLASS_MEMORY_RAM),
         },
         { /* end of list */ }
     },
@@ -449,6 +453,10 @@ static QEMUMachine pc_machine_v0_14 = {
             .driver   = "pc-sysfw",
             .property = "rom_only",
             .value    = stringify(1),
+        }, {
+            .driver   = "virtio-balloon-pci",
+            .property = "class",
+            .value    = stringify(PCI_CLASS_MEMORY_RAM),
         },
         { /* end of list */ }
     },
@@ -505,6 +513,10 @@ static QEMUMachine pc_machine_v0_13 = {
             .driver   = "pc-sysfw",
             .property = "rom_only",
             .value    = stringify(1),
+        }, {
+            .driver   = "virtio-balloon-pci",
+            .property = "class",
+            .value    = stringify(PCI_CLASS_MEMORY_RAM),
         },
         { /* end of list */ }
     },
@@ -565,6 +577,10 @@ static QEMUMachine pc_machine_v0_12 = {
             .driver   = "pc-sysfw",
             .property = "rom_only",
             .value    = stringify(1),
+        }, {
+            .driver   = "virtio-balloon-pci",
+            .property = "class",
+            .value    = stringify(PCI_CLASS_MEMORY_RAM),
         },
         { /* end of list */ }
     }
@@ -633,6 +649,10 @@ static QEMUMachine pc_machine_v0_11 = {
             .driver   = "pc-sysfw",
             .property = "rom_only",
             .value    = stringify(1),
+        }, {
+            .driver   = "virtio-balloon-pci",
+            .property = "class",
+            .value    = stringify(PCI_CLASS_MEMORY_RAM),
         },
         { /* end of list */ }
     }
@@ -713,6 +733,10 @@ static QEMUMachine pc_machine_v0_10 = {
             .driver   = "pc-sysfw",
             .property = "rom_only",
             .value    = stringify(1),
+        }, {
+            .driver   = "virtio-balloon-pci",
+            .property = "class",
+            .value    = stringify(PCI_CLASS_MEMORY_RAM),
         },
         { /* end of list */ }
     },
diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c
index a0fb7c1..1fd5768 100644
--- a/hw/virtio-pci.c
+++ b/hw/virtio-pci.c
@@ -790,6 +790,10 @@ static int virtio_balloon_init_pci(PCIDevice *pci_dev)
     VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
     VirtIODevice *vdev;
 
+    if (proxy->class_code != PCI_CLASS_OTHERS &&
+        proxy->class_code != PCI_CLASS_MEMORY_RAM) /* qemu < 1.1 */
+        proxy->class_code = PCI_CLASS_OTHERS;
+
     vdev = virtio_balloon_init(&pci_dev->qdev);
     if (!vdev) {
         return -1;
@@ -905,6 +909,7 @@ static TypeInfo virtio_serial_info = {
 };
 
 static Property virtio_balloon_properties[] = {
+    DEFINE_PROP_HEX32("class", VirtIOPCIProxy, class_code, PCI_CLASS_OTHERS),
     DEFINE_VIRTIO_COMMON_FEATURES(VirtIOPCIProxy, host_features),
     DEFINE_PROP_END_OF_LIST(),
 };
@@ -919,7 +924,7 @@ static void virtio_balloon_class_init(ObjectClass *klass, void *data)
     k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
     k->device_id = PCI_DEVICE_ID_VIRTIO_BALLOON;
     k->revision = VIRTIO_PCI_ABI_VERSION;
-    k->class_id = PCI_CLASS_MEMORY_RAM;
+    k->class_id = PCI_CLASS_OTHERS;
     dc->reset = virtio_pci_reset;
     dc->props = virtio_balloon_properties;
 }
-- 
1.7.9.1

^ permalink raw reply related	[flat|nested] 35+ messages in thread
* [Qemu-devel] [PATCH] Remove PCI class code from virtio balloon device
@ 2012-03-19  4:59 David Gibson
  2012-03-19 11:33 ` Stefan Hajnoczi
  0 siblings, 1 reply; 35+ messages in thread
From: David Gibson @ 2012-03-19  4:59 UTC (permalink / raw)
  To: anthony
  Cc: qemu-trivial, Rusty Russell, Michael S. Tsirkin, qemu-devel,
	David Gibson

Currently the virtio balloon device, when using the virtio-pci interface
advertises itself with PCI class code MEMORY_RAM.  This is wrong; the
balloon is vaguely related to memory, but is nothing like a PCI memory
device in the meaning of the class code, and this code is not required or
suggested by the virtio PCI specification.

Worse, this patch causes problems on the pseries machine, because the
firmware, seeing this class code, advertises the device as memory in the
device tree, and then a guest kernel bug causes it to see this "memory"
before the real system memory, leading to a crash in early boot.

This patch fixes the problem by removing the bogus PCI class code on the
balloon device.

Cc: Michael S. Tsirkin <mst@redhat.com>
Cc: Rusty Russell <rusty@rustcorp.com.au>

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/virtio-pci.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c
index a0fb7c1..da8a382 100644
--- a/hw/virtio-pci.c
+++ b/hw/virtio-pci.c
@@ -919,7 +919,7 @@ static void virtio_balloon_class_init(ObjectClass *klass, void *data)
     k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
     k->device_id = PCI_DEVICE_ID_VIRTIO_BALLOON;
     k->revision = VIRTIO_PCI_ABI_VERSION;
-    k->class_id = PCI_CLASS_MEMORY_RAM;
+    k->class_id = PCI_CLASS_OTHERS;
     dc->reset = virtio_pci_reset;
     dc->props = virtio_balloon_properties;
 }
-- 
1.7.9.1

^ permalink raw reply related	[flat|nested] 35+ messages in thread
* [Qemu-devel] [PATCH] Remove PCI class code from virtio balloon device
@ 2012-03-16  1:03 David Gibson
  2012-03-18 12:38 ` Michael S. Tsirkin
  0 siblings, 1 reply; 35+ messages in thread
From: David Gibson @ 2012-03-16  1:03 UTC (permalink / raw)
  To: aliguori
  Cc: qemu-trivial, Rusty Russell, Michael S. Tsirkin, qemu-devel,
	David Gibson

Currently the virtio balloon device, when using the virtio-pci interface
advertises itself with PCI class code MEMORY_RAM.  This is wrong; the
balloon is vaguely related to memory, but is nothing like a PCI memory
device in the meaning of the class code, and this code is not required or
suggested by the virtio PCI specification.

Worse, this patch causes problems on the pseries machine, because the
firmware, seeing this class code, advertises the device as memory in the
device tree, and then a guest kernel bug causes it to see this "memory"
before the real system memory, leading to a crash in early boot.

This patch fixes the problem by removing the bogus PCI class code on the
balloon device.

Cc: Michael S. Tsirkin <mst@redhat.com>
Cc: Rusty Russell <rusty@rustcorp.com.au>

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/virtio-pci.c |    1 -
 1 files changed, 0 insertions(+), 1 deletions(-)

diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c
index a0fb7c1..3c3907a 100644
--- a/hw/virtio-pci.c
+++ b/hw/virtio-pci.c
@@ -919,7 +919,6 @@ static void virtio_balloon_class_init(ObjectClass *klass, void *data)
     k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET;
     k->device_id = PCI_DEVICE_ID_VIRTIO_BALLOON;
     k->revision = VIRTIO_PCI_ABI_VERSION;
-    k->class_id = PCI_CLASS_MEMORY_RAM;
     dc->reset = virtio_pci_reset;
     dc->props = virtio_balloon_properties;
 }
-- 
1.7.9.1

^ permalink raw reply related	[flat|nested] 35+ messages in thread

end of thread, other threads:[~2012-04-03 15:10 UTC | newest]

Thread overview: 35+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-03-26  1:19 [Qemu-devel] [PATCH] Remove PCI class code from virtio balloon device David Gibson
2012-04-02  2:43 ` David Gibson
2012-04-02  6:46   ` Michael S. Tsirkin
2012-04-02  6:49     ` David Gibson
2012-04-02  7:11       ` Michael S. Tsirkin
2012-04-03 14:31         ` Michael S. Tsirkin
  -- strict thread matches above, loose matches on Subject: below --
2012-03-22  9:09 David Gibson
2012-03-22 10:01 ` Stefan Hajnoczi
2012-03-22 10:27   ` Gerd Hoffmann
2012-03-22 10:32     ` Stefan Hajnoczi
2012-03-22 10:52   ` David Gibson
2012-03-22 11:53 ` Michael S. Tsirkin
2012-03-23  1:52   ` David Gibson
2012-03-23 12:54     ` Anthony Liguori
2012-03-19  4:59 David Gibson
2012-03-19 11:33 ` Stefan Hajnoczi
2012-03-20  0:42   ` David Gibson
2012-03-20  9:54     ` Stefan Hajnoczi
2012-03-20 10:19       ` David Gibson
2012-03-21 11:26         ` Stefan Hajnoczi
2012-03-21 11:28           ` Stefan Hajnoczi
2012-03-21 13:24             ` David Gibson
2012-03-21 13:08           ` Michael S. Tsirkin
2012-03-21 14:42             ` Anthony Liguori
2012-03-21 15:10               ` Michael S. Tsirkin
2012-03-21 15:14                 ` Anthony Liguori
2012-03-21 16:11                   ` Michael S. Tsirkin
2012-03-21 16:26                     ` Anthony Liguori
2012-03-21 16:33                       ` Anthony Liguori
2012-03-21 18:28                         ` Michael S. Tsirkin
2012-03-21 18:11                       ` Michael S. Tsirkin
2012-03-20 10:53     ` Michael S. Tsirkin
2012-03-16  1:03 David Gibson
2012-03-18 12:38 ` Michael S. Tsirkin
2012-03-19  2:17   ` David Gibson

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).