RE: Architectural question regarding IOV support in Linux 3.13.4

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

 



>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

I am away from my test system for the next 2 weeks but I will give it a try when I return.  I have been working around the issue by changing the pci-type to PCI_EXP_TYPE_ENDPOINT which has worked for me even though it is not correct.

Thanks,
Kelly
��.n��������+%������w��{.n�����{���"�)��jg��������ݢj����G�������j:+v���w�m������w�������h�����٥





[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