On Wed, Jan 16, 2019 at 10:52:48PM +0800, Chao Gao wrote: > On Wed, Jan 16, 2019 at 01:34:28PM +0100, Roger Pau Monné wrote: > >On Wed, Jan 16, 2019 at 07:59:44PM +0800, Chao Gao wrote: > >> On Wed, Jan 16, 2019 at 11:38:23AM +0100, Roger Pau Monné wrote: > >> >On Wed, Jan 16, 2019 at 04:17:30PM +0800, Chao Gao wrote: > >> >> diff --git a/xen/drivers/passthrough/pci.c > >> >> b/xen/drivers/passthrough/pci.c > >> >> index 93c20b9..4f2be02 100644 > >> >> --- a/xen/drivers/passthrough/pci.c > >> >> +++ b/xen/drivers/passthrough/pci.c > >> >> @@ -1514,6 +1514,68 @@ static int assign_device(struct domain *d, u16 > >> >> seg, u8 bus, u8 devfn, u32 flag) > >> >> return rc; > >> >> } > >> >> > >> >> +/* > >> >> + * Unmap established mappings between domain's pirq and device's MSI. > >> >> + * These mappings were set up by qemu/guest and are expected to be > >> >> + * destroyed when changing the device's ownership. > >> >> + */ > >> >> +static void pci_unmap_msi(struct pci_dev *pdev) > >> >> +{ > >> >> + struct msi_desc *entry, *tmp; > >> >> + struct domain *d = pdev->domain; > >> >> + > >> >> + ASSERT(pcidevs_locked()); > >> >> + ASSERT(d); > >> >> + > >> >> + spin_lock(&d->event_lock); > >> >> + list_for_each_entry_safe(entry, tmp, &pdev->msi_list, list) > >> >> + { > >> >> + struct pirq *info; > >> >> + int ret, pirq = 0; > >> >> + unsigned int nr = entry->msi_attrib.type != PCI_CAP_ID_MSIX > >> >> + ? entry->msi.nvec : 1; > >> > > >> >I think you should mask the entry, like it's done in > >> >pt_irq_destroy_bind, see the call to guest_mask_msi_irq. That gives a > >> >consistent state between bind and unbind. > >> > >> I don't think it is necessary considering that we are to unmap pirq. > >> The reason of keeping state consistent is that we might try to bind > >> the same pirq to another guest interrupt. > > > >Even taking into account that the pirq will be unmapped afterwards I'm > >not sure the state is going to be the same. unmap_domain_pirq doesn't > >seem to mask the MSI entries, and so I wonder whether we could run > >into issues (state not being the expected) when later re-assigning the > >device to another guest. > > A valid call trace (in this patch's description) is: > > ->unmap_domain_pirq (if pirq isn't unmapped by qemu) > ->pirq_guest_force_unbind > ->__pirq_guest_unbind > ->mask_msi_irq(=desc->handler->disable()) > ->the warning in msi_set_mask_bit()
Ack, sorry for not realizing this. Thanks, Roger. _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel