diff mbox

[STABLE] hotplug: fix scsi hotplug.

Message ID 1255527031-19008-1-git-send-email-kraxel@redhat.com
State New
Headers show

Commit Message

Gerd Hoffmann Oct. 14, 2009, 1:30 p.m. UTC
Well, partly just papering over the issues.  But without proper scsi bus
infrastructure we hardly can do better.  Changes:

 * Avoid auto-attach by setting the bus number to -1.
 * Ignore the unit value calculated by drive_init().
 * Explicitly attach the devices to the adapter.
 * Add sanity checks.  Don't allow attaching scsi drives to your
   network device.
 * Kill the bus+unit printing.  The values are bogus, and we can't
   easily figure the correct ones.  I doubt this ever worked correctly
   with multiple scsi adapters present in the system.

Should come more close to the expected behavior now ...

Oh, and pc-bios/bios.bin needs a update too, otherwise pci hotplug
doesn't work at all.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/pci-hotplug.c |   24 +++++++++++++++++++-----
 pc-bios/bios.bin |  Bin 131072 -> 131072 bytes
 2 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/pc-bios/bios.bin b/pc-bios/bios.bin
index e4323c0504f8f4faf72d56e288c0d457b37bf442..542beddc6fa9c267893283c919158be28f61cb05 100644
GIT binary patch
delta 18924
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

delta 13383
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

Comments

Anthony Liguori Oct. 14, 2009, 2:49 p.m. UTC | #1
Gerd Hoffmann wrote:
> Well, partly just papering over the issues.  But without proper scsi bus
> infrastructure we hardly can do better.  Changes:
>
>  * Avoid auto-attach by setting the bus number to -1.
>  * Ignore the unit value calculated by drive_init().
>  * Explicitly attach the devices to the adapter.
>  * Add sanity checks.  Don't allow attaching scsi drives to your
>    network device.
>  * Kill the bus+unit printing.  The values are bogus, and we can't
>    easily figure the correct ones.  I doubt this ever worked correctly
>    with multiple scsi adapters present in the system.
>
> Should come more close to the expected behavior now ...
>
> Oh, and pc-bios/bios.bin needs a update too, otherwise pci hotplug
> doesn't work at all.
>   

What's it being updated to?

Regards,

Anthony Liguori
Dustin Kirkland Oct. 14, 2009, 3:43 p.m. UTC | #2
On Wed, Oct 14, 2009 at 8:30 AM, Gerd Hoffmann <kraxel@redhat.com> wrote:
> Oh, and pc-bios/bios.bin needs a update too, otherwise pci hotplug
> doesn't work at all.

Hi Gerd-

I'm having trouble applying the pc-bios/bios.bin binary patch.  Can
you explain how to apply this diff?

:-Dustin
Gerd Hoffmann Oct. 14, 2009, 3:44 p.m. UTC | #3
On 10/14/09 16:49, Anthony Liguori wrote:

>> Oh, and pc-bios/bios.bin needs a update too, otherwise pci hotplug
>> doesn't work at all.
>
> What's it being updated to?

pcbios da5ff65dc9473e3f069736d38b9a189ea14a67eb (same as master).

cheers,
   Gerd
Gerd Hoffmann Oct. 14, 2009, 3:45 p.m. UTC | #4
On 10/14/09 17:43, Dustin Kirkland wrote:
> On Wed, Oct 14, 2009 at 8:30 AM, Gerd Hoffmann<kraxel@redhat.com>  wrote:
>> Oh, and pc-bios/bios.bin needs a update too, otherwise pci hotplug
>> doesn't work at all.
>
> Hi Gerd-
>
> I'm having trouble applying the pc-bios/bios.bin binary patch.  Can
> you explain how to apply this diff?

"git am" should work.  You can also simply ignore the patch and copy 
bios.bin over from the master branch.

HTH,
   Gerd
Dustin Kirkland Oct. 14, 2009, 5:30 p.m. UTC | #5
On Wed, Oct 14, 2009 at 8:30 AM, Gerd Hoffmann <kraxel@redhat.com> wrote:
> Well, partly just papering over the issues.  But without proper scsi bus
> infrastructure we hardly can do better.  Changes:
>
>  * Avoid auto-attach by setting the bus number to -1.
>  * Ignore the unit value calculated by drive_init().
>  * Explicitly attach the devices to the adapter.
>  * Add sanity checks.  Don't allow attaching scsi drives to your
>   network device.
>  * Kill the bus+unit printing.  The values are bogus, and we can't
>   easily figure the correct ones.  I doubt this ever worked correctly
>   with multiple scsi adapters present in the system.
>
> Should come more close to the expected behavior now ...
>
> Oh, and pc-bios/bios.bin needs a update too, otherwise pci hotplug
> doesn't work at all.
>
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> ---
>  hw/pci-hotplug.c |   24 +++++++++++++++++++-----
>  pc-bios/bios.bin |  Bin 131072 -> 131072 bytes
>  2 files changed, 19 insertions(+), 5 deletions(-)
>
> diff --git a/hw/pci-hotplug.c b/hw/pci-hotplug.c
> index d0f2911..8bedea2 100644
> --- a/hw/pci-hotplug.c
> +++ b/hw/pci-hotplug.c
> @@ -52,9 +52,10 @@ void drive_hot_add(Monitor *mon, const char *pci_addr, const char *opts)
>  {
>     int dom, pci_bus;
>     unsigned slot;
> -    int drive_idx, type, bus;
> +    int drive_idx, type;
>     int success = 0;
>     PCIDevice *dev;
> +    char buf[128];
>
>     if (pci_read_devaddr(mon, pci_addr, &dom, &pci_bus, &slot)) {
>         return;
> @@ -74,11 +75,19 @@ void drive_hot_add(Monitor *mon, const char *pci_addr, const char *opts)
>         return;
>     }
>     type = drives_table[drive_idx].type;
> -    bus = drive_get_max_bus (type);
>
>     switch (type) {
>     case IF_SCSI:
> +        if (!dev->qdev.info || strcmp(dev->qdev.info->name, "lsi53c895a") != 0) {
> +            monitor_printf(mon, "Device is not a scsi adapter\n");
> +            break;
> +        }
>         success = 1;
> +        drives_table[drive_idx].bus = -1;
> +        drives_table[drive_idx].unit = -1;
> +        if (get_param_value(buf, sizeof(buf), "unit", opts)) {
> +            drives_table[drive_idx].unit = atoi(buf);
> +        }
>         lsi_scsi_attach(&dev->qdev, drives_table[drive_idx].bdrv,
>                         drives_table[drive_idx].unit);
>         break;
> @@ -87,9 +96,7 @@ void drive_hot_add(Monitor *mon, const char *pci_addr, const char *opts)
>     }
>
>     if (success)
> -        monitor_printf(mon, "OK bus %d, unit %d\n",
> -                       drives_table[drive_idx].bus,
> -                       drives_table[drive_idx].unit);
> +        monitor_printf(mon, "OK\n");
>     return;
>  }
>
> @@ -130,7 +137,14 @@ static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon,
>
>     switch (type) {
>     case IF_SCSI:
> +        drives_table[drive_idx].bus = -1;
> +        drives_table[drive_idx].unit = -1;
> +        if (get_param_value(buf, sizeof(buf), "unit", opts)) {
> +            drives_table[drive_idx].unit = atoi(buf);
> +        }
>         dev = pci_create("lsi53c895a", devaddr);
> +        lsi_scsi_attach(&dev->qdev, drives_table[drive_idx].bdrv,
> +                        drives_table[drive_idx].unit);
>         break;
>     case IF_VIRTIO:
>         dev = pci_create("virtio-blk-pci", devaddr);

Thanks, Gerd.

I applied this patch against qemu-kvm-0.11.0 stable, built, and tested
it.  I can verify that it fixes the scsi hot-add issues I was seeing.
I am now able to add/remove/add/remove/add/remove a scsi disk to a
running instance without segfaulting qemu.

Note that on remove, I do get a stack track in the guest's kernel
(2.6.31), though the remove does succeed, and the disk disappears.

Also note that I did not replace the bios.bin, as it appears to me
that the qemu-kvm-0.11 bios.bin is working properly.

Tested-by: Dustin Kirkland <kirkland@canonical.com>
Gerd Hoffmann Oct. 15, 2009, 7:42 a.m. UTC | #6
On 10/14/09 19:30, Dustin Kirkland wrote:
> Also note that I did not replace the bios.bin, as it appears to me
> that the qemu-kvm-0.11 bios.bin is working properly.

Yes, kvm has its own bios, only for vanilla upstream the bios must be 
replaced.

cheers,
   Gerd
diff mbox

Patch

diff --git a/hw/pci-hotplug.c b/hw/pci-hotplug.c
index d0f2911..8bedea2 100644
--- a/hw/pci-hotplug.c
+++ b/hw/pci-hotplug.c
@@ -52,9 +52,10 @@  void drive_hot_add(Monitor *mon, const char *pci_addr, const char *opts)
 {
     int dom, pci_bus;
     unsigned slot;
-    int drive_idx, type, bus;
+    int drive_idx, type;
     int success = 0;
     PCIDevice *dev;
+    char buf[128];
 
     if (pci_read_devaddr(mon, pci_addr, &dom, &pci_bus, &slot)) {
         return;
@@ -74,11 +75,19 @@  void drive_hot_add(Monitor *mon, const char *pci_addr, const char *opts)
         return;
     }
     type = drives_table[drive_idx].type;
-    bus = drive_get_max_bus (type);
 
     switch (type) {
     case IF_SCSI:
+        if (!dev->qdev.info || strcmp(dev->qdev.info->name, "lsi53c895a") != 0) {
+            monitor_printf(mon, "Device is not a scsi adapter\n");
+            break;
+        }
         success = 1;
+        drives_table[drive_idx].bus = -1;
+        drives_table[drive_idx].unit = -1;
+        if (get_param_value(buf, sizeof(buf), "unit", opts)) {
+            drives_table[drive_idx].unit = atoi(buf);
+        }
         lsi_scsi_attach(&dev->qdev, drives_table[drive_idx].bdrv,
                         drives_table[drive_idx].unit);
         break;
@@ -87,9 +96,7 @@  void drive_hot_add(Monitor *mon, const char *pci_addr, const char *opts)
     }
 
     if (success)
-        monitor_printf(mon, "OK bus %d, unit %d\n",
-                       drives_table[drive_idx].bus,
-                       drives_table[drive_idx].unit);
+        monitor_printf(mon, "OK\n");
     return;
 }
 
@@ -130,7 +137,14 @@  static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon,
 
     switch (type) {
     case IF_SCSI:
+        drives_table[drive_idx].bus = -1;
+        drives_table[drive_idx].unit = -1;
+        if (get_param_value(buf, sizeof(buf), "unit", opts)) {
+            drives_table[drive_idx].unit = atoi(buf);
+        }
         dev = pci_create("lsi53c895a", devaddr);
+        lsi_scsi_attach(&dev->qdev, drives_table[drive_idx].bdrv,
+                        drives_table[drive_idx].unit);
         break;
     case IF_VIRTIO:
         dev = pci_create("virtio-blk-pci", devaddr);