Markus Armbruster <arm...@redhat.com> writes:

> Cao jin <caoj.f...@cn.fujitsu.com> writes:
>
>> Hi John
>>
>> On 12/05/2015 01:55 AM, John Snow wrote:
>>>
>>>
>>> On 12/04/2015 02:47 AM, Cao jin wrote:
>>>> Hi,
>>>>      As you know, there are many PCI devices still using .init() as its
>>>>      initialization function, I am planning to do the "convert to 
>>>> realize()"
>>>>      work, and PCI bridge devices are chosen first.
>>>>      The supporting functions should be modified first. msi_init() a 
>>>> supporting
>>>>      function for PCI devices.
>>>>
>>>>      Maybe it should be put in 2.6, as title indicated
>>>>
>>>> Cao jin (2):
>>>>    Add param Error** to msi_init()
>>>>    Modify callers of msi_init()
>>>>
>>>>   hw/audio/intel-hda.c               |  7 ++++++-
>>>>   hw/ide/ich.c                       |  2 +-
>>>>   hw/net/vmxnet3.c                   |  3 ++-
>>>>   hw/pci-bridge/ioh3420.c            |  6 +++++-
>>>>   hw/pci-bridge/pci_bridge_dev.c     |  6 +++++-
>>>>   hw/pci-bridge/xio3130_downstream.c |  7 ++++++-
>>>>   hw/pci-bridge/xio3130_upstream.c   |  7 ++++++-
>>>>   hw/pci/msi.c                       | 17 +++++++++++++----
>>>>   hw/scsi/megasas.c                  |  2 +-
>>>>   hw/scsi/vmw_pvscsi.c               |  3 ++-
>>>>   hw/usb/hcd-xhci.c                  |  5 ++++-
>>>>   hw/vfio/pci.c                      |  3 ++-
>>>>   include/hw/pci/msi.h               |  4 ++--
>>>>   13 files changed, 55 insertions(+), 17 deletions(-)
>>>>
>>>
>>> You'll need to squash these patches as the first patch will break git
>>> bisect.
>>>
>>
>> Ok, will squash it. And I have another question: what`s the benefit
>> of converting to realize? Because AFAICT, doing this make the error
>> reporting machanism seems clean & clear, all device-init errors are
>> passed above along the call chain. I mean, besides, are there any
>> other benefits?
>
> Let's compare behavior on error:
>
> * realize methods pass an error object to their caller
>
>   The caller decides how to handle the error.
>
>   Many callers simply pass it on.  Typically, errors from realize are
>   passed up the call chain through qdev_device_add().
>
>   Eventually, the caller that handles the error is reached.  If the
>   error needs to be reported to the user, it decides how.  Examples:
>
>   - device_init_func(), which does the actual work for -device, reports
>     the human-readable message to stderr.
>
>   - hmp_device_add(), which does the work for HMP device_add, reports
>     the human-readable message to to the appropriate monitor.
>
>   - handle_qmp_command(), which handles all QMP commands including QMP
>     device_add, sends a QMP error reply down the QMP connection.
>
>   - petalogix_ml605_init(), which creates the "petalogix-ml605" board,
>     aborts when realizing the CPU fails.
>
> * init methods report to stderr and return -1
>
>   Fine when the error should be reported to stderr.

Correction: init methods should use error_report(), which reports either
to stderr or the current monitor.

>                                                      This is fine for
>   some of the above examples, and wrong on others.  In particular, a
>   device needs to provide a realize method to be fully work with
>   device_add, unless its init method cannot fail.

This is the case all the same.

Reply via email to