[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [RFC XEN PATCH v4 1/5] xen/vpci: Clear all vpci status of device
On 1/10/24 01:24, Chen, Jiqian wrote: > On 2024/1/9 23:24, Stewart Hildebrand wrote: >> On 1/5/24 02:09, Jiqian Chen wrote: >>> diff --git a/xen/drivers/pci/physdev.c b/xen/drivers/pci/physdev.c >>> index 42db3e6d133c..552ccbf747cb 100644 >>> --- a/xen/drivers/pci/physdev.c >>> +++ b/xen/drivers/pci/physdev.c >>> @@ -67,6 +68,39 @@ ret_t pci_physdev_op(int cmd, >>> XEN_GUEST_HANDLE_PARAM(void) arg) >>> break; >>> } >>> >>> + case PHYSDEVOP_pci_device_state_reset: { >>> + struct physdev_pci_device dev; >>> + struct pci_dev *pdev; >>> + pci_sbdf_t sbdf; >>> + >>> + if ( !is_pci_passthrough_enabled() ) >>> + return -EOPNOTSUPP; >>> + >>> + ret = -EFAULT; >>> + if ( copy_from_guest(&dev, arg, 1) != 0 ) >>> + break; >>> + sbdf = PCI_SBDF(dev.seg, dev.bus, dev.devfn); >>> + >>> + ret = xsm_resource_setup_pci(XSM_PRIV, sbdf.sbdf); >>> + if ( ret ) >>> + break; >>> + >>> + pcidevs_lock(); >>> + pdev = pci_get_pdev(NULL, sbdf); >>> + if ( !pdev ) >>> + { >>> + pcidevs_unlock(); >>> + ret = -ENODEV; >>> + break; >>> + } >>> + >> >> write_lock(&pdev->domain->pci_lock); >> >>> + ret = vpci_reset_device_state(pdev); >> >> write_unlock(&pdev->domain->pci_lock); > vpci_reset_device_state only reset the vpci state of pdev without deleting > pdev from domain, and here has held pcidevs_lock, it has no need to lock > pci_lock? Strictly speaking, it is not enforced yet. However, an upcoming change [1] will expand the scope of d->pci_lock to include protecting the pdev->vpci structure to an extent, so it will be required once that change is committed. In my opinion there is no harm in adding the additional lock now. If you prefer to wait I would not object, but in this case I would at least ask for a TODO comment to help remind us to address it later. [1] https://lists.xenproject.org/archives/html/xen-devel/2024-01/msg00446.html > >> >>> + pcidevs_unlock(); >>> + if ( ret ) >>> + printk(XENLOG_ERR "%pp: failed to reset PCI device state\n", >>> &sbdf); >>> + break; >>> + } >>> + >>> default: >>> ret = -ENOSYS; >>> break; >>> diff --git a/xen/drivers/vpci/vpci.c b/xen/drivers/vpci/vpci.c >>> index 72ef277c4f8e..3c64cb10ccbb 100644 >>> --- a/xen/drivers/vpci/vpci.c >>> +++ b/xen/drivers/vpci/vpci.c >>> @@ -107,6 +107,15 @@ int vpci_add_handlers(struct pci_dev *pdev) >>> >>> return rc; >>> } >>> + >>> +int vpci_reset_device_state(struct pci_dev *pdev) >>> +{ >>> + ASSERT(pcidevs_locked()); >> >> ASSERT(rw_is_write_locked(&pdev->domain->pci_lock)); >> >>> + >>> + vpci_remove_device(pdev); >>> + return vpci_add_handlers(pdev); >>> +} >>> + >>> #endif /* __XEN__ */ >>> >>> static int vpci_register_cmp(const struct vpci_register *r1, >
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |