[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 1/4] x86/MSI-X: be more careful during teardown
>>> On 13.03.15 at 19:10, <andrew.cooper3@xxxxxxxxxx> wrote: > On 10/03/15 16:27, Jan Beulich wrote: >> When a device gets detached from a guest, pciback will clear its >> command register, thus disabling both memory and I/O decoding. The >> disabled memory decoding, however, has an effect on the MSI-X table >> accesses the hypervisor does: These won't have the intended effect >> anymore. Even worse, for PCIe devices (but not SR-IOV virtual >> functions) such accesses may (will?) be treated as Unsupported >> Requests > > Will, as the root port will issue a write and get no reply. The questionable point here really is that of compatibility with older bus architectures: On x86 (other than e.g. on ia64) the CPU accessing _any_ physical memory would always be valid; in the worst case reads would return all bits set and write would be dropped. PCIe "violating" this, I could see platform designers to implement workarounds resulting in the original behavior for at least CPU side accesses. > VF config space is part of a memory bar on the PF, which itself will > still be valid for requests even if the VF has memory decoding disabled. A spec compliant VF simply can't disable decoding, as the respective command register bit is specified to be hardwires to zero. > On the other hand, if the PF has memory decoding disabled, I expect any > VF config access to result in a UR. Of course. But obviously passing through a PF to an untrusted guest, allowing it to create VFs, and the passing through those VFs onwards to other guests will render those other guests insecure no matter what. >> @@ -287,7 +314,8 @@ void set_msi_affinity(struct irq_desc *d >> ASSERT(spin_is_locked(&desc->lock)); >> >> memset(&msg, 0, sizeof(msg)); >> - read_msi_msg(msi_desc, &msg); >> + if ( !read_msi_msg(msi_desc, &msg) ) >> + return; >> >> msg.data &= ~MSI_DATA_VECTOR_MASK; >> msg.data |= MSI_DATA_VECTOR(desc->arch.vector); > > Assuming a non-racy setup, this hunk makes the memory decode check in > write_msi_msg() redundant. I cant however think of a neat way to elide > the second access, because all other callers of write_msi_msg() need it. And indeed I had looked at where such redundancy could be avoided. As you say, avoiding it here would make the code event more complicated, which I don't think we want. >> @@ -369,24 +401,52 @@ static void msi_set_mask_bit(struct irq_ >> } >> break; >> case PCI_CAP_ID_MSIX: >> - { >> - int offset = PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET; >> - writel(flag, entry->mask_base + offset); >> - readl(entry->mask_base + offset); >> - break; >> - } >> + if ( likely(memory_decoded(pdev)) ) >> + { >> + writel(flag, entry->mask_base + >> PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET); >> + readl(entry->mask_base + PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET); >> + break; >> + } >> + if ( flag ) >> + { >> + u16 control; >> + domid_t domid = pdev->domain->domain_id; >> + >> + control = pci_conf_read16(seg, bus, slot, func, >> + >> msix_control_reg(entry->msi_attrib.pos)); >> + if ( control & PCI_MSIX_FLAGS_MASKALL ) >> + break; >> + pci_conf_write16(seg, bus, slot, func, >> + msix_control_reg(entry->msi_attrib.pos), >> + control | PCI_MSIX_FLAGS_MASKALL); >> + if ( pdev->msix->warned != domid ) >> + { >> + pdev->msix->warned = domid; >> + printk(XENLOG_G_WARNING >> + "cannot mask IRQ %d: masked MSI-X on Dom%d's >> %04x:%02x:%02x.%u\n", > > "masked all MSI-X" to make it slightly clearer that the global mask bit > has been hit. I don't think we need to make the message any longer / more verbose. For MSI-X it's pretty clear that by not naming a particular entry, it concerns all of them. >> @@ -401,12 +463,14 @@ static int msi_get_mask_bit(const struct >> >> void mask_msi_irq(struct irq_desc *desc) >> { >> - msi_set_mask_bit(desc, 1); >> + if ( unlikely(!msi_set_mask_bit(desc, 1)) ) >> + BUG(); > > Previously, BUG() was only on a codepath controlled by the > msi_attrib.type, whereas now it includes failures based on failure to > mask an issue. > > Is this wise, as it can be guest-influenced? Can it really be? Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |