[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3 04/11] vpci/header: Add and remove register handlers dynamically
On Mon, Nov 01, 2021 at 09:18:17AM +0000, Oleksandr Andrushchenko wrote: > > >> + if ( rc ) > >> + gdprintk(XENLOG_ERR, > >> + "%pp: failed to add BAR handlers for dom%pd: %d\n", > >> + &pdev->sbdf, d, rc); > >> + return rc; > >> +} > >> + > >> +int vpci_bar_remove_handlers(const struct domain *d, const struct pci_dev > >> *pdev) > >> +{ > >> + /* Remove previously added registers. */ > >> + vpci_remove_device_registers(pdev); > >> + return 0; > >> +} > >> +#endif > >> + > >> /* > >> * Local variables: > >> * mode: C > >> diff --git a/xen/drivers/vpci/vpci.c b/xen/drivers/vpci/vpci.c > >> index 0fe86cb30d23..702f7b5d5dda 100644 > >> --- a/xen/drivers/vpci/vpci.c > >> +++ b/xen/drivers/vpci/vpci.c > >> @@ -95,7 +95,7 @@ int vpci_assign_device(struct domain *d, const struct > >> pci_dev *dev) > >> if ( is_system_domain(d) || !has_vpci(d) ) > >> return 0; > >> > >> - return 0; > >> + return vpci_bar_add_handlers(d, dev); > >> } > >> > >> /* Notify vPCI that device is de-assigned from guest. */ > >> @@ -105,7 +105,7 @@ int vpci_deassign_device(struct domain *d, const > >> struct pci_dev *dev) > >> if ( is_system_domain(d) || !has_vpci(d) ) > >> return 0; > >> > >> - return 0; > >> + return vpci_bar_remove_handlers(d, dev); > > I think it would be better to use something similar to > > REGISTER_VPCI_INIT here, otherwise this will need to be modified every > > time a new capability is handled by Xen. > > > > Maybe we could reuse or expand REGISTER_VPCI_INIT adding another field > > to be used for guest initialization? > > > >> } > >> #endif /* CONFIG_HAS_VPCI_GUEST_SUPPORT */ > >> > >> diff --git a/xen/include/xen/vpci.h b/xen/include/xen/vpci.h > >> index ecc08f2c0f65..fd822c903af5 100644 > >> --- a/xen/include/xen/vpci.h > >> +++ b/xen/include/xen/vpci.h > >> @@ -57,6 +57,14 @@ uint32_t vpci_hw_read32(const struct pci_dev *pdev, > >> unsigned int reg, > >> */ > >> bool __must_check vpci_process_pending(struct vcpu *v); > >> > >> +#ifdef CONFIG_HAS_VPCI_GUEST_SUPPORT > >> +/* Add/remove BAR handlers for a domain. */ > >> +int vpci_bar_add_handlers(const struct domain *d, > >> + const struct pci_dev *pdev); > >> +int vpci_bar_remove_handlers(const struct domain *d, > >> + const struct pci_dev *pdev); > >> +#endif > > This would then go away if we implement a mechanism similar to > > REGISTER_VPCI_INIT. > > > > Thanks, Roger. > Ok, so I can extend REGISTER_VPCI_INIT with an action parameter: > > "There are number of actions to be taken while first initializing vPCI > for a PCI device or when the device is assigned to a guest or when it > is de-assigned and so on. > Every time a new action is needed during these steps we need to call some > relevant function to handle that. Make it is easier to track the required > steps by extending REGISTER_VPCI_INIT machinery with an action parameter > which shows which exactly step/action is being performed." > > So, we have > > -typedef int vpci_register_init_t(struct pci_dev *dev); > +enum VPCI_INIT_ACTION { > + VPCI_INIT_ADD, > + VPCI_INIT_ASSIGN, > + VPCI_INIT_DEASSIGN, > +}; > + > +typedef int vpci_register_init_t(struct pci_dev *dev, > + enum VPCI_INIT_ACTION action); > > and, for example, > > @@ -452,6 +452,9 @@ static int init_bars(struct pci_dev *pdev) > struct vpci_bar *bars = header->bars; > int rc; > > + if ( action != VPCI_INIT_ADD ) > + return 0; > + > > I was thinking about adding dedicated machinery similar to REGISTER_VPCI_INIT, > e.g. REGISTER_VPCI_{ASSIGN|DEASSIGN} + dedicated sections in the linker > scripts, > but it seems not worth it: these steps are only executed at device > init/assign/deassign, > so extending the existing approach doesn't seem to hurt performance much. > > Please let me know if this is what you mean, so I can re-work the relevant > code. I'm afraid I'm still unsure whether we need an explicit helper to execute when assigning a device, rather than just using the current init helpers (init_bars &c). You said that sizing the BARs when assigning to a domU was not possible [0], but I'm missing an explanation of why it's not possible, as I think that won't be an issue on x86 [1]. Thanks, Roger. [0] https://lore.kernel.org/xen-devel/368bf4b5-f9fd-76a6-294e-dbb93a18e73f@xxxxxxxx/ [1] https://lore.kernel.org/xen-devel/YXlxmdYdwptakDDK@Air-de-Roger/
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |