[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] PCI: don't allow "pci-phantom=" to mark real devices as phantom functions
On 06.05.2022 08:21, Jan Beulich wrote: > On 05.05.2022 21:10, Andrew Cooper wrote: >> On 29/04/2022 14:05, Jan Beulich wrote: >>> [CAUTION - EXTERNAL EMAIL] DO NOT reply, click links, or open attachments >>> unless you have verified the sender and know the content is safe. >>> >>> IOMMU code mapping / unmapping devices and interrupts will misbehave if >>> a wrong command line option declared a function "phantom" when there's a >>> real device at that position. Warn about this and adjust the specified >>> stride (in the worst case ignoring the option altogether). >>> >>> Requested-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> >>> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> >>> >>> --- a/xen/drivers/passthrough/pci.c >>> +++ b/xen/drivers/passthrough/pci.c >>> @@ -451,7 +451,24 @@ static struct pci_dev *alloc_pdev(struct >>> phantom_devs[i].slot == PCI_SLOT(devfn) && >>> phantom_devs[i].stride > PCI_FUNC(devfn) ) >>> { >>> - pdev->phantom_stride = phantom_devs[i].stride; >>> + pci_sbdf_t sbdf = pdev->sbdf; >>> + unsigned int stride = phantom_devs[i].stride; >>> + >>> + while ( (sbdf.fn += stride) > PCI_FUNC(devfn) ) >> >> I'm fairly sure this doesn't do what you want it to. >> >> .fn is a 3 bit bitfield, meaning the += will be truncated before the >> compare. > > And this is precisely what I'm after: I want to stop once the value > has wrapped. > >>> + { >>> + if ( pci_conf_read16(sbdf, PCI_VENDOR_ID) == >>> 0xffff && >>> + pci_conf_read16(sbdf, PCI_DEVICE_ID) == >>> 0xffff ) >>> + continue; >>> + stride <<= 1; >>> + printk(XENLOG_WARNING >>> + "%pp looks to be a real device; bumping >>> %04x:%02x:%02x stride to %u\n", >>> + &sbdf, phantom_devs[i].seg, >>> + phantom_devs[i].bus, >>> phantom_devs[i].slot, >>> + stride); >>> + sbdf = pdev->sbdf; >>> + } >>> + if ( PCI_FUNC(stride) ) >> >> This is an obfuscated way of writing stride < 8. > > And intentionally so, matching a few other similar instances elsewhere. > An open-coded 8 here doesn't really make clear where that 8 would be > coming from. The use of PCI_FUNC(), otoh, documents what's meant. > >> Given the printk(), if we actually find an 8-function device, what gets >> printed (AFAICT) will be "bumping to 8" when in fact we mean "totally >> ignoring the option". I think this really wants an else clause. > > Yes, "bumping to 8" is what is being printed in that case. I did > realize the slight anomaly when writing the code and I observed > (verified) it also in testing. But I didn't see a good reason for an > "else" here - 8 being mentioned in the log message is clear enough > for anyone vaguely understanding phantom functions. But if you strongly > think we need to make the code yet larger and indentation yet > unhelpfully deeper, then I will (begrudgingly) do what you ask for. But > please explicitly confirm. Like for the first few patches of the IOMMU large page series, I'm going to put this in (with Roger's R-b) by the end of the week on the assumption that my reply (above) did address your concerns. Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |