qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [Qemu-stable] [QEMU PATCH v3] qdev: fix get_fw_dev_path


From: Stefan Priebe - Profihost AG
Subject: Re: [Qemu-devel] [Qemu-stable] [QEMU PATCH v3] qdev: fix get_fw_dev_path to support to add nothing to fw_dev_path
Date: Fri, 31 May 2013 08:57:00 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130510 Thunderbird/17.0.6

Am 31.05.2013 00:51, schrieb Amos Kong:
> On Thu, May 30, 2013 at 10:30:21PM +0200, Stefan Priebe wrote:
>> Am 30.05.2013 15:13, schrieb Amos Kong:
>>> On Thu, May 30, 2013 at 02:09:25PM +0200, Stefan Priebe - Profihost AG 
>>> wrote:
>>>> Am 29.05.2013 09:56, schrieb Amos Kong:
>>>>> Recent virtio refactoring in QEMU made virtio-bus become the parent bus
>>>>> of scsi-bus, and virtio-bus doesn't have get_fw_dev_path implementation,
>>>>> typename will be added to fw_dev_path by default, the new fw_dev_path
>>>>> could not be identified by seabios. It causes that bootindex parameter
>>>>> of scsi device doesn't work.
>>>>>
>>>>> This patch implements get_fw_dev_path() in BusClass, it will be called
>>>>> if bus doesn't implement the method, tyename will be added to
>>>>> fw_dev_path. If the implemented method returns NULL, nothing will be
>>>>> added to fw_dev_path.
>>>>>
>>>>> It also implements virtio_bus_get_fw_dev_path() to return NULL. Then
>>>>> QEMU will still pass original style of fw_dev_path to seabios.
>>>>>
>>>>> Signed-off-by: Amos Kong <address@hidden>
>>>>> --
>>>>> v2: only add nothing to fw_dev_path when get_fw_dev_path() is
>>>>>     implemented and returns NULL. then it will not effect other devices
>>>>>     don't have get_fw_dev_path() implementation.
>>>>> v3: implement default get_fw_dev_path() in BusClass
>>>>> ---
>>>>>  hw/core/qdev.c         | 10 +++++++++-
>>>>>  hw/virtio/virtio-bus.c |  6 ++++++
>>>>>  2 files changed, 15 insertions(+), 1 deletion(-)
>>>>>
>>>>> diff --git a/hw/core/qdev.c b/hw/core/qdev.c
>>>>> index 6985ad8..9190a7e 100644
>>>>> --- a/hw/core/qdev.c
>>>>> +++ b/hw/core/qdev.c
>>>>> @@ -515,7 +515,7 @@ static int qdev_get_fw_dev_path_helper(DeviceState 
>>>>> *dev, char *p, int size)
>>>>>              l += snprintf(p + l, size - l, "%s", d);
>>>>>              g_free(d);
>>>>>          } else {
>>>>> -            l += snprintf(p + l, size - l, "%s", 
>>>>> object_get_typename(OBJECT(dev)));
>>>>> +            return l;
>>>>>          }
>>>>>      }
>>>>>      l += snprintf(p + l , size - l, "/");
>>>>> @@ -867,9 +867,17 @@ static void qbus_initfn(Object *obj)
>>>>>      QTAILQ_INIT(&bus->children);
>>>>>  }
>>>>>
>>>>> +static char *default_bus_get_fw_dev_path(DeviceState *dev)
>>>>> +{
>>>>> +    return g_strdup(object_get_typename(OBJECT(dev)));
>>>>> +}
>>>>> +
>>>>>  static void bus_class_init(ObjectClass *class, void *data)
>>>>>  {
>>>>> +    BusClass *bc = BUS_CLASS(class);
>>>>> +
>>>>>      class->unparent = bus_unparent;
>>>>> +    bc->get_fw_dev_path = default_bus_get_fw_dev_path;
>>>>>  }
>>>>>
>>>>>  static void qbus_finalize(Object *obj)
>>>>> diff --git a/hw/virtio/virtio-bus.c b/hw/virtio/virtio-bus.c
>>>>> index ea2e11a..6849a01 100644
>>>>> --- a/hw/virtio/virtio-bus.c
>>>>> +++ b/hw/virtio/virtio-bus.c
>>>>> @@ -161,10 +161,16 @@ static char *virtio_bus_get_dev_path(DeviceState 
>>>>> *dev)
>>>>>      return qdev_get_dev_path(proxy);
>>>>>  }
>>>>>
>>>>> +static char *virtio_bus_get_fw_dev_path(DeviceState *dev)
>>>>> +{
>>>>> +    return NULL;
>>>>> +}
>>>>> +
>>>>>  static void virtio_bus_class_init(ObjectClass *klass, void *data)
>>>>>  {
>>>>>      BusClass *bus_class = BUS_CLASS(klass);
>>>>>      bus_class->get_dev_path = virtio_bus_get_dev_path;
>>>>> +    bus_class->get_fw_dev_path = virtio_bus_get_fw_dev_path;
>>>>>  }
>>>>>
>>>>>  static const TypeInfo virtio_bus_info = {
>>>>>
>>>>
>>>> To me booting VMs with more than one SCSI disk does still not work.
>>>
>>> Hi Stefan,
>>>
>>> Can you provide your full command-lines ?
>>>
>>>> net: bootindex=100
>>>> scsi0: bootindex=201
>>>>
>>>> does not work
>>>>
>>>> this one works fine:
>>>> net: bootindex=200
>>>> scsi0: bootindex=101
>>>
>>> For me, they all work, (1. check the bootindex string, 2. check boot menu 
>>> by entering F12, 3. check by waiting ).
>>
> 
> Thanks for your reply.
> 
>> Oh it does only NOT work if i have TWO network cards. It never seems
>> to try to boot from scsi0. It tries PXE net0 then net1 and then it
>> restarts.
>  
> Something is wrong here, '-boot menu=on ' -> guest could not restart
> if no available boot device, it will also try to boot from other
> unselected devices (DVD, floppy)
> 
> '-boot menu=on,strict=on,reboot-timeout=1000' -> boot from net0, net1, disk1, 
> then restart ...
> 
> It seems the problem of your bios.bin or rbd device.

I've also updated to seabios 1.7.2.2

> I'm using seabios(pc-bios/bios.bin) in qemu repo & latest seabios in 
> seabios.org
> 
>> Example:
>> Command line:
>> qemu -chardev
>> socket,id=qmp,path=/var/run/qemu-server/155.qmp,server,nowait -mon
>> chardev=qmp,mode=control -pidfile /var/run/qemu-server/155.pid
>> -daemonize -name TTT -smp sockets=1,cores=4 -nodefaults -boot
>> menu=on -vga cirrus -k de -m 4096 -device
>> piix3-usb-uhci,id=uhci,bus=pci.0,addr=0x1.0x2 -device
>> usb-tablet,id=tablet,bus=uhci.0,port=1 -device
>> virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 -device
>> virtio-scsi-pci,id=scsihw0,bus=pci.0,addr=0x5 -drive 
>> file=rbd:stor/vmdisk-1:mon_host=10.255.0.100\:6789\;10.255.0.101\:6789\;10.255.0.102\:6789\;:auth_supported=none,if=none,id=drive-scsi0,iops_rd=215,iops_wr=155,bps_rd=136314880,bps_wr=94371840,aio=native,discard=on
>> -device 
>> scsi-hd,bus=scsihw0.0,channel=0,scsi-id=0,lun=0,drive=drive-scsi0,id=scsi0,bootindex=200
>> -drive if=none,id=drive-ide2,media=cdrom,aio=native -device
>> ide-cd,bus=ide.1,unit=0,drive=drive-ide2,id=ide2 -netdev 
>> type=tap,id=net0,ifname=tap155i0,script=/var/lib/qemu-server/pve-bridge,vhost=on
>> -device 
>> virtio-net-pci,mac=6A:32:5C:4B:38:F4,netdev=net0,bus=pci.0,addr=0x12,id=net0,bootindex=100
>> -netdev 
>> type=tap,id=net1,ifname=tap155i1,script=/var/lib/qemu-server/pve-bridge,vhost=on
>> -device 
>> virtio-net-pci,mac=D6:3A:F6:E2:91:0A,netdev=net1,bus=pci.0,addr=0x13,id=net1,bootindex=101
>> -rtc base=localtime
> 
> 
> This patch only fixed the 'wrong' fw_dev_path. If qemu passes valid bootindex
> string to seabios, then patch works as expected.
> 
> ---
> 
> I re-tested with a similar commandline.  it tried to boot from net0, net1, 
> disk1 (works as expected).

...

thanks for this great explanation. I've done what you sayd but it still
does not work.

Here is the output of the seabis debug log where you see the loop:
http://pastebin.com/raw.php?i=e53rdW2b

Stefan



reply via email to

[Prev in Thread] Current Thread [Next in Thread]