Re: Architectural question regarding IOV support in Linux 3.13.4

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

 



On Tue, Dec 2, 2014 at 9:42 AM, Zytaruk, Kelly <Kelly.Zytaruk@xxxxxxx> wrote:
>
>
>> -----Original Message-----
>> From: Bjorn Helgaas [mailto:bhelgaas@xxxxxxxxxx]
>> Sent: Monday, February 24, 2014 3:52 PM
>> To: Zytaruk, Kelly
>> Cc: Yu Zhao; linux-pci@xxxxxxxxxxxxxxx; Alex Williamson
>> Subject: Re: Architectural question regarding IOV support in Linux 3.13.4
>>
>> On Mon, Feb 24, 2014 at 12:22 PM, Zytaruk, Kelly <Kelly.Zytaruk@xxxxxxx>
>> wrote:
>> >
>> >>On Fri, Feb 21, 2014 at 2:03 PM, Alex Williamson
>> <alex.williamson@xxxxxxxxxx> wrote:
>> >>On Fri, 2014-02-21 at 14:11 -0700, Bjorn Helgaas wrote:
>> >>> [+cc Alex, Yu]
>> >>>
>> >>> On Fri, Feb 21, 2014 at 10:45 AM, Zytaruk, Kelly <Kelly.Zytaruk@xxxxxxx>
>> wrote:
>> >>> >
>> >>> > I am working with SR-IOV and I have a question regarding the
>> >>> > function
>> >>> > sriov_init() in ../drivers/pci/iov.c (linux versions 3.4.9 and
>> >>> > 3.13.4)
>> >>> >
>> >>> > In sriov_init() the code first checks whether the PF is a Root
>> >>> > complex  endpoint (0x9) or an Express Endpoint (0x0) as shown in
>> >>> > the code  snippet below.  If it is neither it returns the No device error.
>> >>> >
>> >>> > static int sriov_init(struct pci_dev *dev, int pos) {
>> >>> >          int i;
>> >>> >          int rc;
>> >>> >          int nres;
>> >>> >          u32 pgsz;
>> >>> >          u16 ctrl, total, offset, stride;
>> >>> >          struct pci_sriov *iov;
>> >>> >          struct resource *res;
>> >>> >          struct pci_dev *pdev;
>> >>> >
>> >>> >        if (pci_pcie_type(dev) != PCI_EXP_TYPE_RC_END &&
>> >>> >              pci_pcie_type(dev) != PCI_EXP_TYPE_ENDPOINT)
>> >>> >                  return -ENODEV;
>> >>> >
>> >>> > My question is why PCI_EXP_TYPE_LEG_END (0x1) is omitted as being
>> >>> > a  valid endpoint.  By excluding Legacy endpoints it fails
>> >>> > enabling  SR-IOV on a VGA PF.
>> >>> >
>> >>> > Is there a design/specification reason why legacy was excluded or
>> >>> > was  it just an assumption that VGA would never support SR-IOV?
>> >>> >
>> >>> > If there is no valid reason to exclude PCI_EXP_TYPE_LEG_END, I
>> >>> > would  like to discuss having it included as a valid endpoint for SR-IOV.
>> >>>
>> >>> Good question.  It looks like it's been that way since the beginning
>> >>> [1], but I don't know why.  I don't see any restriction in the spec
>> >>> about SR-IOV and legacy endpoints.
>> >>>
>> >>> I also don't know whether VGA is an issue.  There are some legacy
>> >>> addressing issues for [mem 0xa0000-0xbffff] and [io 0x3b0-0x3bb] and
>> >>> [io 0x3c0-0x3df].  For example, when a bridge has its VGA Enable bit
>> >>> set, it positively decodes [mem 0xa0000-0xbffff] even if that range
>> >>> isn't included in one of the bridge windows.  I don't know whether a
>> >>> VGA device is similarly allowed to decode that range even if it's
>> >>> not in a BAR.  If it is, I could imagine issues if enabling SR-IOV
>> >>> created several VGA VFs.
>> >>VFs cannot support I/O port space by definition, so I don't think a
>> >>"VGA VF" could actually exist.  There would be nothing wrong with a
>> >>non-VGA GPU VF though.  I also don't see how the differences in Legacy
>> >>Endpoint rules versus a standard Endpoint would preclude supporting
>> >>SR-IOV.  I don't think the SR-IOV spec makes any demands on whether
>> >>the PF requires I/O port resources, which I assume is the main reason
>> >>for this to call itself Legacy.  I'd guess it was likely just an
>> >>oversight and we should add legacy endpoints (or remove the test
>> >>altogether and trust that if a device has an SR-IOV capability, we
>> >>should initialize it).  Thanks,
>> >>
>> >>Alex
>> >>
>> >>I agree. I vaguely remember there was some reason that excludes legacy
>> >>endpoints from using SR-IOV. But after a quick look at the latest
>> >>specs, I didn't find any.
>> >>
>> > Only Legacy Endpoints can claim I/O.  VFs are not allowed to claim I/O.
>> > VGA devices claim I/O.
>> >
>> > The SR-IOV spec 1.1 section 3.4.1.6 states “The Class Code register is
>> > read-only and is used to identify the generic function of the device
>> > and, in some cases, a specific register level programming interface.
>> > The field in the PF and associated VFs must return the same value when read.”
>> >
>> > If the PF is a VGA device then by the definition in the SR-IOV spec
>> > the class code of the VF would also indicate it as a VGA device, ie
>> > Subclass 0x0 = VGA, subclass 0x80 = OTHER_DISPLAY_CONTROLLER.
>> >
>> > Ideally we would want to have the PF sub-class as 0x0 and the VF
>> > subclass as 0x80 But the spec doesn't support this.
>> >
>> > One speculation as to why Legacy endpoints were omitted might be the
>> > assumption that doing so would allow VGA VFs to be created.
>> >
>> > It is not reasonable to prevent a VGA PF from enabling SR-IOV as this
>> > is a real world possibility.  We might need to add more code elsewhere
>> > however to prevent a VF from becoming a VGA device outside of passing it
>> through to a guest VM.
>>
>> Can you try out Yu's patch and see what happens?  If you do turn on SR-IOV on
>> this device, it would be interesting to see the complete dmesg log and "lspci -vv"
>> output to see what we do with it.
>>
>> Bjorn
>
> Bjorn,
> I am resurrecting this thread as I have been looking through the 3.18 source code and don't see any support for PCI_EXP_TYPE_LEG_END for SRIOV.  For devices that must remain defined as Legacy endpoints we still need to be able to enable SRIOV.

Looking back, I see that Yu Zhao did attach a patch earlier in the
thread.  Are you asking me to apply that one?  I don't remember why I
dropped it from my queue; maybe it was because I was waiting for you
to test it.

Did you test it?  What were the results (complete dmesg log and lspci
-vv output)?  There was also some follow-on discussion that I would
need to evaluate before applying it.

Bjorn

> Do you have any concerns on adding the legacy support to sriov_init() as shown below?
>
>         if ((dev->pcie_type != PCI_EXP_TYPE_RC_END) &&
>             (dev->pcie_type != PCI_EXP_TYPE_ENDPOINT) &&
>                   (dev->pcie_type != PCI_EXP_TYPE_LEG_END))
>         {
>                 return -ENODEV;
>         }
>
> Thanks,
> Kelly
--
To unsubscribe from this list: send the line "unsubscribe linux-pci" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux