[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] x86/hvm: allow for more fine grained assisted flush
On Thu, Apr 30, 2020 at 11:17:25AM +0200, Roger Pau Monne wrote: > diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c > index 814b7020d8..1d41b6e2ea 100644 > --- a/xen/arch/x86/hvm/hvm.c > +++ b/xen/arch/x86/hvm/hvm.c > @@ -4011,17 +4011,42 @@ static void hvm_s3_resume(struct domain *d) > } > } > > -static bool always_flush(void *ctxt, struct vcpu *v) > +static bool flush_check(void *mask, struct vcpu *v) > { > - return true; > + return mask ? test_bit(v->vcpu_id, (unsigned long *)mask) : true; > } > > -static int hvmop_flush_tlb_all(void) > +static int hvmop_flush_tlb(XEN_GUEST_HANDLE_PARAM(xen_hvm_flush_tlbs_t) uop) > { > + xen_hvm_flush_tlbs_t op; > + DECLARE_BITMAP(mask, HVM_MAX_VCPUS) = { }; > + bool valid_mask = false; > + > if ( !is_hvm_domain(current->domain) ) > return -EINVAL; > > - return paging_flush_tlb(always_flush, NULL) ? 0 : -ERESTART; > + if ( !guest_handle_is_null(uop) ) > + { > + if ( copy_from_guest(&op, uop, 1) ) > + return -EFAULT; > + > + /* > + * TODO: implement support for the other features present in > + * xen_hvm_flush_tlbs_t: flushing a specific virtual address and not > + * flushing global mappings. > + */ > + > + if ( op.mask_size > ARRAY_SIZE(mask) ) This should also check that the passed in flags are correct, ie: if ( op.mask_size > ARRAY_SIZE(mask) || (op.flags & ~(HVMOP_flush_global | HVMOP_flush_va_valid)) ) return -EINVAL; Roger.
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |