Skip to content
  • Greg Kurz's avatar
    a4beb5f5
    spapr_pci: Robustify support of PCI bridges · a4beb5f5
    Greg Kurz authored
    
    
    Some recent error handling cleanups unveiled issues with our support of
    PCI bridges:
    
    1) QEMU aborts when using non-standard PCI bridge types,
       unveiled by commit 7ef1553d "spapr_pci: Drop some dead error handling"
    
    $ qemu-system-ppc64 -M pseries -device pcie-pci-bridge
    Unexpected error in object_property_find() at qom/object.c:1240:
    qemu-system-ppc64: -device pcie-pci-bridge: Property '.chassis_nr' not found
    Aborted (core dumped)
    
    This happens because we assume all PCI bridge types to have a "chassis_nr"
    property. This property only exists with the standard PCI bridge type
    "pci-bridge" actually. We could possibly revert 7ef1553d but it seems
    much simpler to check the presence of "chassis_nr" earlier.
    
    2) QEMU abort if same "chassis_nr" value is used several times,
       unveiled by commit d2623129 "qom: Drop parameter @errp of
       object_property_add() & friends"
    
    $ qemu-system-ppc64 -M pseries -device pci-bridge,chassis_nr=1 \
                            -device pci-bridge,chassis_nr=1
    Unexpected error in object_property_try_add() at qom/object.c:1167:
    qemu-system-ppc64: -device pci-bridge,chassis_nr=1: attempt to add duplicate property '40000100' to object (type 'container')
    Aborted (core dumped)
    
    This happens because we assume that "chassis_nr" values are unique, but
    nobody enforces that and we end up generating duplicate DRC ids. The PCI
    code doesn't really care for duplicate "chassis_nr" properties since it
    is only used to initialize the "Chassis Number Register" of the bridge,
    with no functional impact on QEMU. So, even if passing the same value
    several times might look weird, it never broke anything before, so
    I guess we don't necessarily want to enforce strict checking in the PCI
    code now.
    
    Workaround both issues in the PAPR code: check that the bridge has a
    unique and non null "chassis_nr" when plugging it into its parent bus.
    
    Fixes: 05929a6c ("spapr: Don't use bus number for building DRC ids")
    Fixes: 7ef1553d ("spapr_pci: Drop some dead error handling")
    Fixes: d2623129 ("qom: Drop parameter @errp of object_property_add() & friends")
    Reported-by: default avatarThomas Huth <thuth@redhat.com>
    Signed-off-by: default avatarGreg Kurz <groug@kaod.org>
    Message-Id: <159431476748.407044.16711294833569014964.stgit@bahia.lan>
    [dwg: Move check slightly to a better place]
    Signed-off-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
    a4beb5f5
    spapr_pci: Robustify support of PCI bridges
    Greg Kurz authored
    
    
    Some recent error handling cleanups unveiled issues with our support of
    PCI bridges:
    
    1) QEMU aborts when using non-standard PCI bridge types,
       unveiled by commit 7ef1553d "spapr_pci: Drop some dead error handling"
    
    $ qemu-system-ppc64 -M pseries -device pcie-pci-bridge
    Unexpected error in object_property_find() at qom/object.c:1240:
    qemu-system-ppc64: -device pcie-pci-bridge: Property '.chassis_nr' not found
    Aborted (core dumped)
    
    This happens because we assume all PCI bridge types to have a "chassis_nr"
    property. This property only exists with the standard PCI bridge type
    "pci-bridge" actually. We could possibly revert 7ef1553d but it seems
    much simpler to check the presence of "chassis_nr" earlier.
    
    2) QEMU abort if same "chassis_nr" value is used several times,
       unveiled by commit d2623129 "qom: Drop parameter @errp of
       object_property_add() & friends"
    
    $ qemu-system-ppc64 -M pseries -device pci-bridge,chassis_nr=1 \
                            -device pci-bridge,chassis_nr=1
    Unexpected error in object_property_try_add() at qom/object.c:1167:
    qemu-system-ppc64: -device pci-bridge,chassis_nr=1: attempt to add duplicate property '40000100' to object (type 'container')
    Aborted (core dumped)
    
    This happens because we assume that "chassis_nr" values are unique, but
    nobody enforces that and we end up generating duplicate DRC ids. The PCI
    code doesn't really care for duplicate "chassis_nr" properties since it
    is only used to initialize the "Chassis Number Register" of the bridge,
    with no functional impact on QEMU. So, even if passing the same value
    several times might look weird, it never broke anything before, so
    I guess we don't necessarily want to enforce strict checking in the PCI
    code now.
    
    Workaround both issues in the PAPR code: check that the bridge has a
    unique and non null "chassis_nr" when plugging it into its parent bus.
    
    Fixes: 05929a6c ("spapr: Don't use bus number for building DRC ids")
    Fixes: 7ef1553d ("spapr_pci: Drop some dead error handling")
    Fixes: d2623129 ("qom: Drop parameter @errp of object_property_add() & friends")
    Reported-by: default avatarThomas Huth <thuth@redhat.com>
    Signed-off-by: default avatarGreg Kurz <groug@kaod.org>
    Message-Id: <159431476748.407044.16711294833569014964.stgit@bahia.lan>
    [dwg: Move check slightly to a better place]
    Signed-off-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
Loading