All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: Amos Kong <akong@redhat.com>
Cc: sluo@redhat.com, kevin@koconnor.net, seabios@seabios.org,
	qemu-devel@nongnu.org,
	"KONRAD Frédéric" <fred.konrad@greensocs.com>
Subject: Re: [Qemu-devel] [PATCH] boot: fix path pattern of scsi device
Date: Tue, 28 May 2013 11:45:32 +0200	[thread overview]
Message-ID: <51A47CBC.1090906@redhat.com> (raw)
In-Reply-To: <20130528093501.GB2825@t430s.nay.redhat.com>

Il 28/05/2013 11:35, Amos Kong ha scritto:
> On Tue, May 28, 2013 at 10:06:51AM +0200, Paolo Bonzini wrote:
>> Il 28/05/2013 09:40, Amos Kong ha scritto:
>>> bootindex parameter of scsi device doesn't work, it causes
>>> by wrong pattern in seabios.
>>>
>>> qemu passes the following firmware dev_path to seabios:
>>>  /pci@i0cf8/scsi@4/virtio-scsi-device/channel@0/disk@0,0
>>
>> No, this is another unexpected change due to the virtio refactoring in
>> QEMU.  The right fix is in QEMU, by adding a get_fw_dev_path
>> implementation in hw/virtio/virtio-bus.c.
> 
> Hi Paolo,
> 
> We could not fix this by implementing get_fw_dev_path in
> hw/virtio/virtio-bus.c
> 
> virtio-bus is the parent bus of scsi-bus, scsibus_get_fw_dev_path()
> will be called after called virtio_bus_get_fw_dev_path().
> 
> str0 = returns of parents of virtio-bus  /* eg: /pci@i0cf8/scsi@4  */
> str1 = return of virtio_bus_get_fw_dev_path() /* eg: .. */
> str2 = scsibus_get_fw_dev_path() /* eg: channel@0/disk@0,0 */
> 
> The final fw_dev_path should be $str0/$str1/$str2
> 
> | static int qdev_get_fw_dev_path_helper(DeviceState *dev, char *p, int size)
> | {
> |     int l = 0;
> | 
> |     if (dev && dev->parent_bus) {
> |         char *d;
> |         l = qdev_get_fw_dev_path_helper(dev->parent_bus->parent, p, size);
> |         d = bus_get_fw_dev_path(dev->parent_bus, dev);
> |         if (d) {
> |             l += snprintf(p + l, size - l, "%s", d);
> |             g_free(d);
> 
> if we implement virtio_bus_get_fw_dev_path(), the return value will be set to $str1
> 
> |         } else {
> |             l += snprintf(p + l, size - l, "%s", object_get_typename(OBJECT(dev)));
> 
> Currently we didn't implement virtio_bus_get_fw_dev_path(), so 'virtio-scsi-device' was set to $str1
> 
> |         }
> |  
> 
> However, we need to change the pattern.

Turn this:

            l += snprintf(p + l, size - l, "%s", object_get_typename(OBJECT(dev)));

into the default implementation of get_fw_dev_path (in TYPE_BUS),
and change qdev_get_fw_dev_path_helper to

        if (d) {
            l += snprintf(p + l, size - l, "%s", d);
            g_free(d);
        } else {
            return l;
        }

Then virtio_bus_get_fw_dev_path can just return NULL.

Paolo

> Amos.
> 
>> We fixed it already for migration paths, it should be easy to do the
>> same for this.
>>
>> Please Cc qemu-stable@nongnu.org when sending the QEMU patch.
>>
>> Thanks,
>>
>> Paolo
>>
>>> Signed-off-by: Amos Kong <akong@redhat.com>
>>> ---
>>>  src/boot.c | 5 +++--
>>>  1 file changed, 3 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/src/boot.c b/src/boot.c
>>> index c308602..cd9d784 100644
>>> --- a/src/boot.c
>>> +++ b/src/boot.c
>>> @@ -138,10 +138,11 @@ int bootprio_find_scsi_device(struct pci_device *pci, int target, int lun)
>>>      if (!pci)
>>>          // support only pci machine for now
>>>          return -1;
>>> -    // Find scsi drive - for example: /pci@i0cf8/scsi@5/channel@0/disk@1,0
>>> +    /* Find scsi drive - for example:
>>> +       /pci@i0cf8/scsi@5/virtio-scsi-device/channel@0/disk@1,0 */
>>>      char desc[256], *p;
>>>      p = build_pci_path(desc, sizeof(desc), "*", pci);
>>> -    snprintf(p, desc+sizeof(desc)-p, "/*@0/*@%d,%d", target, lun);
>>> +    snprintf(p, desc+sizeof(desc)-p, "/*/*@0/*@%d,%d", target, lun);
>>>      return find_prio(desc);
>>>  }
>>>  
>>>

  reply	other threads:[~2013-05-28  9:46 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-28  7:40 [Qemu-devel] [PATCH] boot: fix path pattern of scsi device Amos Kong
2013-05-28  8:06 ` Paolo Bonzini
2013-05-28  9:35   ` Amos Kong
2013-05-28  9:45     ` Paolo Bonzini [this message]
2013-05-28 10:26   ` Laszlo Ersek
2013-05-28 10:31     ` Amos Kong

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=51A47CBC.1090906@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=akong@redhat.com \
    --cc=fred.konrad@greensocs.com \
    --cc=kevin@koconnor.net \
    --cc=qemu-devel@nongnu.org \
    --cc=seabios@seabios.org \
    --cc=sluo@redhat.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.