On 09/20/2017 09:25 PM, Wuzongyong (Euler Dept) wrote: >> -----Original Message----- >> From: sendmail [mailto:justsendmailnothinge...@gmail.com] On Behalf Of >> Laine Stump >> Sent: Thursday, September 21, 2017 8:57 AM >> To: libvirt-l...@redhat.com >> Cc: Wuzongyong (Euler Dept) <cordius...@huawei.com>; Wanzongshun >> (Vincent) <wanzongs...@huawei.com>; Alex Williamson >> <alex.william...@redhat.com> >> Subject: Re: [libvirt] Questions about function >> virPCIDeviceIsBehindSwitchLackingACS in virpci.c >> >> On 09/18/2017 09:24 PM, Wuzongyong (Euler Dept) wrote: >> Hi, >> >> In function virPCIDeviceIsBehindSwitchLackingACS, I noticed that(line 8): >> >> 1 if (virPCIDeviceGetParent(dev, &parent) < 0) >> 2 return -1; >> 3 if (!parent) { >> 4 /* if we have no parent, and this is the root bus, ACS doesn't come >> 5 * into play since devices on the root bus can't P2P without going >> 6 * through the root IOMMU. >> 7 */ >> 8 if (dev->address.bus == 0) { >> 9 return 0; >> 10 } else { >> 11 virReportError(VIR_ERR_INTERNAL_ERROR, >> 12 _("Failed to find parent device for %s"), >> 13 dev->name); >> 14 return -1; >> 15 } >> 16 } >> >> Why we just return 0 only if device’s bus is 0? >> In my server, I can see a root bus which bus number is greater than 0, see >> the >> results(just a part) after I run lspci -t: >> >> +-[0000:80]-+-02.0-[81-83]--+-00.0 >> | | \-00.1 >> | +-05.0 >> | +-05.1 >> | +-05.2 >> | \-05.4 >> +-[0000:7f]-+-08.0 >> | +-08.2 >> | +-08.3 >> | + . . . >> | \-1f.2 >> \-[0000:00]-+-00.0 >> +-01.0-[01]----00.0 >> +-02.0-[02]--+-00.0 >> | +-00.1 >> | +-00.2 >> | \-00.3 >> +-02.2-[03]-- >> +-03.0-[04-0b]----00.0-[05-0b]--+-08.0-[06-08]----00.0 >> | \-10.0-[09-0b]----00.0 >> +-05.0 >> +-05.1 >> +-05.2 >> +-05.4 >> +-11.0 >> +-11.4 >> +-16.0 >> +-16.1 >> +-1a.0 >> >> If I assign the device 0000:81:00.0 to a VM, I get “Failed to find parent >> device”. >> I think I should get no error with return value 0 just like bus number is 0, >> because >> bus 80 is the root bus as well in my case. >> >> In the <<Intel C610 Series Chipset and Intel X99 Chipset Platform Controller >> Hub(PCH)>> >> Datasheet, I found that(Chapter 9.1): >> For some server platforms, it may be desirable to have multiple PCHs in >> the system >> Which means some PCH’s may reside on a bus greater than 0. >> >> So, is this a bug? >> >> My memory is that if you're using VFIO for device assignment, all that >> checking should be performed by VFIO, and libvirt shouldn't be checking for >> ACS at all. (Alex, can you confirm or refute this?) >> >> virPCIDeviceIsBehindSwitchLackingACS() is only called from >> virPCIDeviceIsAssignable(), and that function is only called if the device's >> stubDriver is set to something other than "vfio-pci" (see step 1 in >> virHostdevPreparePCIDevices()). Digging deeper, it looks like the device's >> stubDriver is set by virHostdevGetPCIHostDeviceList(), which appears to set >> it to vfio-pci if the backend is specified as vfio (i.e. <driver >> name='vfio'/> in >> the libvirt XML. This *should* be the default setting!) >> >> Since I assume you're not using RHEL6, meaning that you will be using VFIO >> by default, not legacy KVM assignment. >> >> TL;DR I think the bug here is that the ...CheckACS function is being called >> *at >> all*. That code path should be completely obsolete. > Yeah, I'm using the legacy KVM assignment just for check if > virPCIDeviceIsBehindSwitchLackingACS > do right thing. > So, do you mean legacy KVM assignment code path in libvirt is not maintained > any more?
Yes, that is correct. I'm pretty sure it's also not maintained in the kernel anymore either. As a matter of fact I had thought that legacy KVM device assignment had been disabled in the kernel for a very long time (it's disabled downstream in RHEL7). As far as I know, there is no reason at all that anyone should be using legacy KVM device assignment unless they're on an old 2.6.x kernel (like RHEL6/CentOS6).I'm fairly certain nobody has *intentionally* used/tested legacy KVM device assignment with anything other than the extremely old downstream builds of libvirt used by RHEL6/CentOS6 in a very long time. Some day when we decide that we no longer want to support building new upstream libvirt on those old systems, we should remove the code for it. -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list