> On 21-Jun-2023, at 5:20 PM, Ani Sinha <anisi...@redhat.com> wrote:
> 
> 
> 
>> On 21-Jun-2023, at 4:55 PM, Ani Sinha <anisi...@redhat.com> wrote:
>> 
>> 
>> 
>>> On 21-Jun-2023, at 4:36 PM, Ani Sinha <anisi...@redhat.com> wrote:
>>> 
>>> 
>>> 
>>>> On 20-Jun-2023, at 4:13 PM, Michael S. Tsirkin <m...@redhat.com> wrote:
>>>> 
>>>> On Tue, Jun 20, 2023 at 12:48:05PM +0530, Ani Sinha wrote:
>>>>> When a device has an upstream PCIE port, we can only use slot 0.
>>>> 
>>>> Actually, it's when device is plugged into a PCIE port.
>>>> So maybe:
>>>> 
>>>>    PCI Express ports only have one slot, so
>>>>    PCI Express devices can only be plugged into
>>>>    slot 0 on a PCIE port
>>>> 
>>>>> Non-zero slots
>>>>> are invalid. This change ensures that we throw an error if the user
>>>>> tries to hotplug a device with an upstream PCIE port to a non-zero slot.
>>>> 
>>>> it also adds a comment explaining why function 0 must not exist
>>>> when function != 0 is added. or maybe split that part out.
>>>> 
>>>>> CC: jus...@redhat.com
>>>>> CC: imamm...@redhat.com
>>>>> Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=2128929
>>>>> Signed-off-by: Ani Sinha <anisi...@redhat.com>
>>>>> ---
>>>>> hw/pci/pci.c | 18 ++++++++++++++++++
>>>>> 1 file changed, 18 insertions(+)
>>>>> 
>>>>> changelog:
>>>>> v2: addressed issue with multifunction pcie root ports. Should allow
>>>>> hotplug on functions other than function 0.
>>>>> v3: improved commit message.
>>>>> v4: improve commit message and code comments further. Some more
>>>>> improvements might come in v5. No claims made here that this is
>>>>> the final one :-)
>>>>> 
>>>>> diff --git a/hw/pci/pci.c b/hw/pci/pci.c
>>>>> index bf38905b7d..30ce6a78cb 100644
>>>>> --- a/hw/pci/pci.c
>>>>> +++ b/hw/pci/pci.c
>>>>> @@ -64,6 +64,7 @@ bool pci_available = true;
>>>>> static char *pcibus_get_dev_path(DeviceState *dev);
>>>>> static char *pcibus_get_fw_dev_path(DeviceState *dev);
>>>>> static void pcibus_reset(BusState *qbus);
>>>>> +static bool pcie_has_upstream_port(PCIDevice *dev);
>>>>> 
>>>>> static Property pci_props[] = {
>>>>>  DEFINE_PROP_PCI_DEVFN("addr", PCIDevice, devfn, -1),
>>>>> @@ -1182,6 +1183,11 @@ static PCIDevice *do_pci_register_device(PCIDevice 
>>>>> *pci_dev,
>>>>>  } else if (dev->hotplugged &&
>>>>>             !pci_is_vf(pci_dev) &&
>>>>>             pci_get_function_0(pci_dev)) {
>>>>> +        /*
>>>>> +         * populating function 0 triggers a bus scan from the guest that
>>>>> +         * exposes other non-zero functions. Hence we need to ensure that
>>>>> +         * function 0 wasn't added yet.
>>>>> +         */
>>>> 
>>>> Pls capitalize populating. Also, comments like this should come
>>>> before the logic they document, not after. By the way it doesn't
>>>> have to be a bus scan - I'd just say "a scan" - with ACPI
>>>> guest knows what was added and can just probe the device functions.
> 
> This commit essentially needs fixing:
> 
> commit c46b126088b5616d8b7cd3ff83aaf5d097c36633
> Author: Michael Labiuk <michael.lab...@virtuozzo.com>
> Date:   Fri Sep 30 01:35:42 2022 +0300
> 
>    tests/x86: Add 'q35' machine type to override-tests in hd-geo-test
> 
>    Signed-off-by: Michael Labiuk <michael.lab...@virtuozzo.com>
>    Message-Id: <20220929223547.1429580-5-michael.lab...@virtuozzo.com>
>    Signed-off-by: Thomas Huth <th...@redhat.com>

I have sent a patch series with a proposed fix for this test (hd-geo-test) as 
well as fixes for bios-tables-test. The series also includes my QEMU patch that 
enforces proper PCIE slot usage.
The patches are part of one series and should be applied in the same sequence - 
test fixes first then the QEMU fix so that the QEMU fix does not break the unit 
tests.
Please review.

> 
>>>> 
>>>>>      error_setg(errp, "PCI: slot %d function 0 already occupied by %s,"
>>>>>                 " new func %s cannot be exposed to guest.",
>>>>>                 PCI_SLOT(pci_get_function_0(pci_dev)->devfn),
>>>>> @@ -1189,6 +1195,18 @@ static PCIDevice *do_pci_register_device(PCIDevice 
>>>>> *pci_dev,
>>>>>                 name);
>>>>> 
>>>>>     return NULL;
>>>>> +    } else if (dev->hotplugged &&
>>>> 
>>>> why hotplugged? Doesn't the same rule apply to all devices?
>>>> 
>>>>> +               !pci_is_vf(pci_dev) &&
>>>> 
>>>> Hmm. I think you copied it from here:
>>>> } else if (dev->hotplugged &&
>>>>            !pci_is_vf(pci_dev) &&
>>>>            pci_get_function_0(pci_dev)) {
>>>> 
>>>> it makes sense there because VFs are added later
>>>> after PF exists.
>>>> 
>>>> But here it makes no sense that I can see.
>>> 
>>> This patch with these changes causes failures in bios-tables-test which can 
>>> be fixed easily. It also breaks hd-geo-test and I do not know enough of 
>>> this test to fix them.
>> 
>> Specifically it breaks test_override_scsi_q35() and 
>> test_override_virtio_blk_q35(). 
>> I think these tests were wrong to begin with since they attach a pcie-to-pci 
>> bridge on a pcie root port and then attach a scsi controller not on the 
>> pcie-to-pci bridge but on the root port (which is not possible because we 
>> can only attach one device on a non-multifunction pcie root port). Even if I 
>> fix them, its failing somewhere else.
>> 
>> I have added Thomas and Laurent, maybe they can help fix these in this test.
>> I have pushed my patch here: 
>> https://gitlab.com/anisinha/qemu/-/commit/24b3eddb968a0739bff222bdf781f722365cc9b2
>> 
>> 
>>> 
>>> I think I will drop this patch for now.
>>> 
>>>> 
>>>> 
>>>>> +               pcie_has_upstream_port(pci_dev) && PCI_SLOT(devfn)) {
>>>>> +        /*
>>>>> +         * If the device has an upstream PCIE port, like a pcie root 
>>>>> port,
>>>> 
>>>> no, a root port can not be an upstream port.
>>>> 
>>>> 
>>>>> +         * we only support functions on slot 0.
>>>>> +         */
>>>>> +        error_setg(errp, "PCI: slot %d is not valid for %s,"
>>>>> +                   " only functions on slot 0 is supported for devices"
>>>>> +                   " with an upstream PCIE port.",
>>>> 
>>>> 
>>>> something like:
>>>> 
>>>>     error_setg(errp, "PCI: slot %d is not valid for %s:"
>>>>                " PCI Express devices can only be plugged into slot 0")
>>>> 
>>>> and then you don't really need a comment.
>>>> 
>>>> 
>>>>> +                   PCI_SLOT(devfn), name);
>>>>> +        return NULL;
>>>>>  }
>>>>> 
>>>>>  pci_dev->devfn = devfn;
>>>>> -- 
>>>>> 2.39.1


Reply via email to