|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] x86/PVH: PHYSDEVOP_pci_mmcfg_reserved should not blindly register a region
On Fri, May 08, 2020 at 02:43:38PM +0200, Jan Beulich wrote:
> The op has a register/unregister flag, and hence registration shouldn't
> happen unilaterally. Introduce unregister_vpci_mmcfg_handler() to handle
> this case.
>
> Fixes: eb3dd90e4089 ("x86/physdev: enable PHYSDEVOP_pci_mmcfg_reserved for
> PVH Dom0")
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
>
> --- a/xen/arch/x86/hvm/io.c
> +++ b/xen/arch/x86/hvm/io.c
> @@ -558,6 +558,47 @@ int register_vpci_mmcfg_handler(struct d
> return 0;
> }
>
> +int unregister_vpci_mmcfg_handler(struct domain *d, paddr_t addr,
> + unsigned int start_bus, unsigned int
> end_bus,
> + unsigned int seg)
> +{
> + struct hvm_mmcfg *mmcfg;
> + int rc = -ENOENT;
> +
> + ASSERT(is_hardware_domain(d));
> +
> + if ( start_bus > end_bus )
> + return -EINVAL;
> +
> + write_lock(&d->arch.hvm.mmcfg_lock);
> +
> + list_for_each_entry ( mmcfg, &d->arch.hvm.mmcfg_regions, next )
> + if ( mmcfg->addr == addr + (start_bus << 20) &&
> + mmcfg->segment == seg &&
> + mmcfg->start_bus == start_bus &&
> + mmcfg->size == ((end_bus - start_bus + 1) << 20) )
> + {
> + list_del(&mmcfg->next);
> + if ( !list_empty(&d->arch.hvm.mmcfg_regions) )
> + xfree(mmcfg);
> + else
> + {
> + /*
> + * Cannot unregister the MMIO handler - leave a fake entry
> + * on the list.
> + */
> + memset(mmcfg, 0, sizeof(*mmcfg));
> + list_add(&mmcfg->next, &d->arch.hvm.mmcfg_regions);
Instead of leaving this zombie entry around maybe we could add a
static bool in register_vpci_mmcfg_handler to signal whether the MMIO
intercept has been registered?
> + }
> + rc = 0;
> + break;
> + }
> +
> + write_unlock(&d->arch.hvm.mmcfg_lock);
> +
> + return rc;
> +}
> +
> void destroy_vpci_mmcfg(struct domain *d)
> {
> struct list_head *mmcfg_regions = &d->arch.hvm.mmcfg_regions;
> --- a/xen/arch/x86/physdev.c
> +++ b/xen/arch/x86/physdev.c
> @@ -559,12 +559,18 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
> if ( !ret && has_vpci(currd) )
> {
> /*
> - * For HVM (PVH) domains try to add the newly found MMCFG to the
> - * domain.
> + * For HVM (PVH) domains try to add/remove the reported MMCFG
> + * to/from the domain.
> */
> - ret = register_vpci_mmcfg_handler(currd, info.address,
> - info.start_bus, info.end_bus,
> - info.segment);
> + if ( info.flags & XEN_PCI_MMCFG_RESERVED )
Do you think you could also add a small note in physdev.h regarding
the fact that XEN_PCI_MMCFG_RESERVED is used to register a MMCFG
region, and not setting it would imply an unregister request?
It's not obvious to me from the name of the flag.
Thanks, Roger.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |