|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3] x86/HVM: p2m_ram_ro is incompatible with device pass-through
On Tue, Oct 01, 2019 at 01:40:57PM +0200, Jan Beulich wrote:
> On 01.10.2019 13:30, Roger Pau Monné wrote:
> > On Tue, Oct 01, 2019 at 11:07:55AM +0200, Jan Beulich wrote:
> >> --- a/xen/arch/x86/hvm/dm.c
> >> +++ b/xen/arch/x86/hvm/dm.c
> >> @@ -255,16 +255,33 @@ static int set_mem_type(struct domain *d
> >>
> >> mem_type = array_index_nospec(data->mem_type, ARRAY_SIZE(memtype));
> >>
> >> - if ( mem_type == HVMMEM_ioreq_server )
> >> + switch ( mem_type )
> >> {
> >> unsigned int flags;
> >>
> >> + case HVMMEM_ioreq_server:
> >> if ( !hap_enabled(d) )
> >> return -EOPNOTSUPP;
> >>
> >> /* Do not change to HVMMEM_ioreq_server if no ioreq server
> >> mapped. */
> >> if ( !p2m_get_ioreq_server(d, &flags) )
> >> return -EINVAL;
> >> +
> >> + break;
> >> +
> >> + case HVMMEM_ram_ro:
> >> + /* p2m_ram_ro can't be represented in IOMMU mappings. */
> >> + domain_lock(d);
> >> + if ( has_arch_pdevs(d) )
> >
> > I would use is_iommu_enabled because I think it's clearer in this
> > context (giving the comment above explicitly refers to having iommu
> > mappings).
>
> But the whole point of the re-basing over Paul's change is that now
> the operation gets refused only if a device was actually assigned.
>
> >> + rc = -EXDEV;
> >
> > EOPNOTSUPP might be better, since it's possible that future iommus
> > support such page type?
>
> I don't think future IOMMU behavior affects the choice of error
> code. I wanted to use something half way reasonable, yet not too
> common, in order to be able to easily identify the source of the
> error. If you and others think this isn't a meaningful concern,
> I'd be okay switching to -EOPNOTSUPP.
>
> >> --- a/xen/drivers/passthrough/pci.c
> >> +++ b/xen/drivers/passthrough/pci.c
> >> @@ -1486,15 +1486,33 @@ static int assign_device(struct domain *
> >> if ( !is_iommu_enabled(d) )
> >> return 0;
> >>
> >> - /* Prevent device assign if mem paging or mem sharing have been
> >> - * enabled for this domain */
> >> - if ( unlikely(d->arch.hvm.mem_sharing_enabled ||
> >> - vm_event_check_ring(d->vm_event_paging) ||
> >> + domain_lock(d);
> >> +
> >> + /*
> >> + * Prevent device assignment if any of
> >> + * - mem paging
> >> + * - mem sharing
> >> + * - the p2m_ram_ro type
> >> + * - global log-dirty mode
> >> + * are in use by this domain.
> >> + */
> >> + if ( unlikely(vm_event_check_ring(d->vm_event_paging) ||
Would be nice to have some syntactic sugar like vm_event_enabled or
some such.
> >> +#ifdef CONFIG_HVM
> >> + (is_hvm_domain(d) &&
> >> + (d->arch.hvm.mem_sharing_enabled ||
> >> + d->arch.hvm.p2m_ram_ro_used)) ||
> >> +#endif
Do you really need the CONFIG_HVM guards? is_hvm_domain already has a
IS_ENABLED(CONFIG_HVM).
> >> p2m_get_hostp2m(d)->global_logdirty) )
> >
> > Is such check needed anymore?
> >
> > With the enabling of the iommu right at domain creation it shouldn't
> > be possible to enable any of the above features at all anymore.
>
> See above - all such checks should now be / get converted to check
> whether devices are assigned, not whether IOMMU page tables exist.
> After all we want to refuse requests only if strictly necessary.
Oh right, I was missing the whole point then. So we still keep the
iommu enabled together with introspection or ram_ro as long as there
are no devices assigned.
Reviewed-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
Thanks, Roger.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |